laravel-5-boilerplateのメール送信をGmailで行えるように設定します
ついでにメール送信をQueue Jobに設定してメール送信を非同期でできるようにしたいと思います。
Queueに関してはこちらの記事が参考になります
タイトルのセンスも素晴らしいです
「キュー」は何しにLaravelへ?
ドキュメントも
Laravel5.2 Queue 英語
Laravel5.0 キュー 日本語
Gmailでメール送信できるように
.envを変更
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_ENCRYPTION=tls
MAIL_USERNAME=laravel.boilerplate@gmail.com
MAIL_PASSWORD=******
MAIL_FROM_ADDRESS=laravel.boilerplate@gmail.com
MAIL_FROM_NAME=Laravel-master
MAIL_USERNAMEはgoogleアカウントのユーザー名
MAIL_PASSWORDはgoogleアカウントのパスワードです
ここで気をつけるのはgoogleのセキュリティ設定に関してです
他の記事から引用させていただきます
ちょっと注意が必要なのは2段階認証を設定してない場合は 安全性の低いアプリ - アカウント設定 から安全性の低いアプリのアクセスを許可するようにしないとエラーが出るので こちらから設定する必要があります。 (もしくはコレを機に2段階認証にするとか。)
引用元:GmailでGmail以外のアドレスでGmailのSMTPが使えなくなってた件(実は使えた件)
config/mail.phpを変更
'from' => ['address' => null, 'name' => null],
これを以下のように書き換えます
'from' => [
'address' => env('MAIL_FROM_ADDRESS', null),
'name' => env('MAIL_FROM_NAME', null)
]
.envで設定した MAIL_FROM_ADDRESS と MAIL_FROM_NAME を利用するようにします
nullのままだとエラーが出ます
なぜこうなってないのかわかりません...
Daniel Blomdahlさんしっかりしてくれ!
これでメール送信ができるようになっているはずなのでパスワード再設定メールなどを送ってテストしてみてください
メール送信をQueue Jobに
今回はMySQLのQueue用のテーブルを作成してジョブを処理したいと思います
テーブルの作成
簡単です
コマンドラインでphp artisaのコマンドを実行するだけで出来上がりです
php artisan queue:table
php artisan migrate
Jobの登録
App/Jobs/SendConfirmationEmail.phpを作成します
ControllerからはこのJobを実行します
//App/Jobs/SendConfirmationEmail.php
<?php
namespace App\Jobs;
use App\Jobs\Job;
use Illuminate\Contracts\Mail\Mailer;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use App\Models\Access\User\User;
class SendConfirmationEmail extends Job implements ShouldQueue
{
use InteractsWithQueue, SerializesModels;
protected $user;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(User $user)
{
$this->user = $user;
}
/**
* Execute the job.
*
* @return void
*/
public function handle(Mailer $mailer)
{
$user = $this->user;
$mailer->send('frontend.auth.emails.confirm', ['token' => $user->confirmation_code], function ($message) use ($user) {
$message->to($user->email, $user->name)->subject(app_name() . ': ' . trans('exceptions.frontend.auth.confirmation.confirm'));
});
}
}
controller側では
//App/Http/Controllers/Backend/Access/UserController.php
<?php
namespace App\Http\Controllers\Backend\Api\Access;
use App\Http\Controllers\Controller;
...省略
//Jobs
use App\Jobs\SendConfirmationEmail;
/**
* Class UserController
*/
class UserController extends Controller
{
...省略
/**
* @param $user_id
* @param FrontendUserContract $user
* @param ResendConfirmationEmailRequest $request
* @return mixed
*/
public function resendConfirmationEmail($user_id, FrontendUserContract $user, ResendConfirmationEmailRequest $request)
{
//Queue jobを使ってメール送信
$this->dispatch(new SendConfirmationEmail($user->find($user_id)));
return \Response::json($this->getUsersPaginated($request), 200);
}
...省略
}
$this->dispatchでインスタンスを渡してあげればOKです
メール送信ロジックがあるのは
・新規登録時
・パスワード再設定時
・管理画面からの確認メール送信
の3箇所だったと思います、先ほど修正したのは3番目の管理画面からの確認メール送信の部分です