Lumenでメールを送る
Lumenでは、メールの送信機能がデフォルトで入っていません。Composerでインストールするのですが、そこから実際の送信処理までにかなりハマったので、ハマったポイントと解決方法を残しておきます。
更新日: 2018.7.17公開日: 2018.7.6
Composerでインストール
Lumenを使っているなら、Composerは入っているはずなので、ターミナルなどから、下記のコマンドを実行します。
composer require illuminate/mail
自分が参考にした記事では、
composer require illuminate\mail
と、バックスラッシュになっていますが、エラーになります。
普通のスラッシュでOKです。
設定を書き換える
インストールしたMailクラスを呼び出すために、いくつか設定ファイルを書き換えます。
bootstrap/app.php
.
.
.
$app->withFacades();
.
.
$app->register(App\Providers\AppServiceProvider::class);
のこの二つのコメントアウトを外します。(自分のケースでは、セッションを使うためにすでにコメントアウトを外してました)
app/Providers/AppServiceProvider.php
public function register()
{
// 追記する-->
$this->app->singleton('mailer', function ($app) {
$app->configure('services');
return $app->loadComponent('mail', 'Illuminate\Mail\MailServiceProvider', 'mailer');
});
// <--追記する
}
設定ファイルを追加する
続いて、メールサーバーの設定を記述するファイルを用意します。
config/mail.php
Laravelとは違い、Lumenではデフォルトでconfigディレクトリがないので作成します。
<?php
return [
'driver' => env('MAIL_DRIVER', 'smtp'),
'host' => env('MAIL_HOST', 'smtp.hogehoge.com'),// <-- 書き換え
'port' => env('MAIL_PORT', 587),
'from' => [
'address' => '[email protected]',// <-- 書き換え
'name' => 'Example',// <-- 書き換え
],
'encryption' => env('MAIL_ENCRYPTION', 'tls'),
'username' => env('MAIL_USERNAME', 'メールのユーザー名'),// <-- 書き換え
'password' => env('MAIL_PASSWORD', 'パスワード'),// <-- 書き換え
'sendmail' => '/usr/sbin/sendmail -bs',
];
メール送信のコントローラ内での書き方
ここまでの設定自体はサクッと行くのですが、いざコントローラ側でMailクラスを呼び出してみると、
Class 'Mail' not found
と怒られて呼び出せません。
Mailクラスの読み出し方法
ネット上の例では、呼び出し方が色々提案されていましたが、自分の環境では下記の例のみ有効でした。
OKだったやつ
use Illuminate\Support\Facades\Mail;
ダメだったやつ
use Mail
use Mailer
use Illuminate\Mail\Mailer;
use Illuminate\Mail\Mailer as Mailer;
use Illuminate\Contracts\Mail\Mailer;
実際に送信してみる
やっとMailクラスを参照できたと思ったら、ここもはまりポイントでした。
ネット上では、
– MailじゃなくてMailerにしろ
– Mailじゃなくて、\Mailにしろ
という提案が見られましたが、
Mailer::send() should not be called statically [duplicate]
と怒られたり、結構はまりました。
結果的に、Githubに上がっていた設定を元にしたらできました。
OKだったやつ
ここのまんまです。
変数「$mail_honbun」は、メール本文です。
use Illuminate\Support\Facades\Mail;
.
.
.
class MailController extends Controller
{
.
.
.
.
.
Mail::raw($mail_honbun, function($msg) {
$msg->to(['[email protected]']);
$msg->from(['[email protected]']);
$msg->subject("メール件名");
});
}
これで無事に送信ができました。
ダメだったやつ (その1)
Mailer::send('emails.notify', [], function ($message)
{
$message->from('[email protected]', '差出人')
->to('[email protected]')
->subject('メール件名');
});
ダメだったやつ (その2)
\Mailer::send('emails.notify', array('name' => '差出人'), function($message) {
$message->to('[email protected]')
->subject('メール件名);
});
参考サイト
内容的には、こちらの記事「Lumen、いろいろハマるところ」の通りでいけます。
ただし、コントローラで送信する部分が自分の環境ではエラーが出ました。
Lumenはいろんな設定が散らばって書かれているので、どの部分に依存しているかによってエラーが違います。今回紹介した自分の方法で必ずしも成功しないかもしれませんが、何かの参考になれば幸いです。