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

laravel-5-boilerplateのメール送信をGmailで行えるように設定します
ついでにメール送信をQueue Jobに設定してメール送信を非同期でできるようにしたいと思います。

Queueに関してはこちらの記事が参考になります
タイトルのセンスも素晴らしいです
[「キュー」は何しにLaravelへ？](http://kore1server.com/285/%E3%80%8C%E3%82%AD%E3%83%A5%E3%83%BC%E3%80%8D%E3%81%AF%E4%BD%95%E3%81%97%E3%81%ABLaravel%E3%81%B8%EF%BC%9F)
ドキュメントも
[Laravel5.2 Queue 英語](https://laravel.com/docs/5.2/queues)
[Laravel5.0 キュー 日本語](http://readouble.com/laravel/5/0/0/ja/queues.html)

#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が使えなくなってた件(実は使えた件)](http://rcmdnk.github.io/blog/2015/04/16/computer-gmail/#gmailsmtp)


##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](https://github.com/blomdahldaniel)さんしっかりしてくれ！

これでメール送信ができるようになっているはずなのでパスワード再設定メールなどを送ってテストしてみてください

#メール送信を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です

メール送信ロジックがあるのは
・新規登録時
・パスワード再設定時
・管理画面からの確認メール送信
の３箇所だったと思います、先ほど修正したのは３番目の管理画面からの確認メール送信の部分です