Route53とLaravelとGSuiteのGmailでメール送信する

Route53とLaravelとGSuiteのGmailでメール送信しようとしたときにハマったとき用のトラブルシューティングガイドです。AWSを使っていて独自ドメインでメールの送受信をおこなうためのベストプラクティスを探した結果、GSuiteとRoute53にたどり着きました。前まではAWSのSES&S3&Workmailで構築していましたが管理が面倒なのでやめてGSuite&Route53に変更しました。

①GSuiteにドメイン所有権を追加する

すでに、Route53にドメインが設定されている。Webサイトが公開状態である(BASIC認証などされている方はドメイン所有権の確認のときだけ一瞬表示させるだけでも大丈夫です)があることが前提です。

GSuiteを新規追加するときに設定するか、GSuiteTop→ドメイン→ドメインの追加と削除→ドメインやドメインエイリアスの追加→ドメイン名を入力→続行してドメインの所有権を確認→(別の方法)HTMLタグ→タグを設置する→確認 これで完了です。DNSやファイルを置くなど色々な確認方法がありますが今回は割愛します。

②Route53にGmailのMXを設定する

Route53にドメインが設定されていることが前提です。

GSuiteTop→アプリ→GSuite→Gmail選択→詳細設定→MXレコードをRoute53にコピペする→レコードセットの保存する。

③GSuiteにメールアドレスの追加&ユーザーの作成

左上のハンバーガーメニューボタン→ディレクトリ→ユーザーを選択→「+」ボタン→お好きなメールアドレスを設定して新しいユーザー追加で完了です。

④GSuiteで追加したメールアドレスをアプリパスワードを入手する

これがないとSMTPを利用することができません。

Googleアカウント(https://myaccount.google.com)→セキュリティ→Googleへのログインのアプリパスワードを選択します。
アプリの選択を「その他」で適当な名前をつけて生成ボタンを押すと16桁のアプリパスワードが表示されるのでメモします。このアプリパスワードでSMTPをつかいメール送信することができます。

⑤GmailでSMTPの送信できるか確認する

今回登録した以外のGmailアカウントを使いメールアドレスを追加してSMTP送信できるか確認します。Gmail→歯車を選択→設定→アカウントとインポート→他のメールアドレスを追加→名前(適当)と今回、GSuiteで追加したメールアドレスを入れて次のステップへ(エイリアスと扱いますにチェックつけたまま)

SMTP:smtp.gmail.com
ポート:587
ユーザー名:GSuiteで追加したメールアドレス
パスワード:③で入手したアプリパスワード(16桁)
TLSを使用したセキュリティでほぞされた接続にチェックしてアカウントを追加します。確認コードや確認用のURLがGSuiteで追加したメールアドレス宛に送られてくるので認証作業をしてメールアドレスを追加することができればSMTPの設定が正しくできたことになります。設定できなかった場合はパスワードやユーザー名などが違っている可能性があるので再チェックしましょう。自分はGmailのログインパスワードを入れていて入れないとずっとハマっていました。。アプリパスワードじゃなきゃSMTP使えないので要注意です。

Gmail→歯車を選択→設定→アカウントとインポート→GSuiteで追加したメールアドレスをデフォルトに設定したあとに確認できるメールアドレスにメールを送信してみましょう。GSuiteで追加したメールアドレスからメールが届いていると思います。

⑥LaravelにGmailの設定をする

GSuiteで追加したメールアドレスをLaravelの`.env`の設定を変更・追加します。

MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465
MAIL_USERNAME=info@example.com
MAIL_PASSWORD=アプリパスワード
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=info@example.com
MAIL_FROM_NAME=info@example.com
MAIL_PRETEND=false

`.env`を反映させるために`php artisan config:cache`を実行させましょう。

⑦Laravelでメールテスト

`php artisan make:mail TestMail` で`app/Mail`にTestMail.phpが追加されるので、buildに追加

public function build()
{
return $this
->from('example@example.com')
->subject('テスト送信完了')
->view('emails.test');
}

`’emails.test’`は`resources/views/emails/test.blade.php`を指しています。`emails/test.blade.php`を作成して適当な文章を入れておきます。

あとは使いたい場所でメール送信処理を追加するだけでメール送信できます。

省略
use App\Mail\TestMail;
use Mail;
class 省略 {
省略
public function index()
{
Mail::to('info@example.com')->send(new TestMail());
}
}

あとがき

メールが送れないときのトラブルシューティングは、SMTP側とLaravel側を切り分けしてメールが送信されない原因を調査するとよいです。
GmailでSMTP送信確認でGSuiteのSMTPの設定が正しいか確認できます。Gmailで問題なくSMTPの設定ができてメールが送信できないのであればLaravel側の設定がミスしている可能性が高いです。