LoginSignup
6
8

More than 5 years have passed since last update.

laravel-5-boilerplateのメール送信をGmailで設定する

Last updated at Posted at 2016-02-04

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番目の管理画面からの確認メール送信の部分です

6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8