Laravelにログイン機能を実装し、パスワードリセットのために以下のようにメール送信の設定を追加。
.env
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465
MAIL_USERNAME=account@gmail.com
MAIL_PASSWORD=password
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=account+noreplay@gmail.com
MAIL_FROM_NAME=Laravelからのメール
他のメール プラットフォームで Gmail のメールをチェックする – Gmail ヘルプ
この状態でパスワードリセットのメールを送信しようとしたら、以下のようなエラーが発生。
Laravelからメールを送信したときのエラー
Swift_TransportException
Failed to authenticate on SMTP server with username "account@gmail.com" using 3 possible authenticators.
Authenticator LOGIN returned Expected response code 235 but got code "534", with message "534-5.7.9 Application-specific password required. Learn more at
534 5.7.9
ホスト名・ポート番号・メールアドレス・パスワードなどは間違っていないし、Googleアカウントの2段階認証を解除してもダメだった。
色々調べた結果、Laravelのような外部アプリからメールを送信するときは普通にログインするときに使用するパスワードではなく「アプリパスワード」と呼ばれる専用のパスワードが必要と判明(取得方法は後述)。
※実際、エラーメッセージ中の”Application-specific password required(アプリケーション特有のパスワードが必要)”との記述がある。
Googleアカウントのアプリパスワードを取得する方法
- LaravelにログインしたいアカウントでGoogleにログインする
- 右上のメニュー(自分の名前が表示された丸いアイコンをクリックして開く)の「Googleアカウントを管理」をクリック
- 左側のメニューの「セキュリティ」をクリック
- 「Google へのログイン」の「アプリパスワード」をクリック
- 「アプリを選択」から「その他」を選び、適当なアプリ名(Laravelアプリ、等)を入力して「生成」をクリック
- 画面に表示されるアプリパスワードを取得(一度しか表示されないので注意)
取得したアプリパスワードはLaravelの.envの”MAIL_PASSWORD”にコピペすればOK。
.env
MAIL_PASSWORD=app_password
これでLaravelからメールを送信できるようになる(Googleアカウントの二段階認証は有効にしたままでOK)。
もし、アプリパスワードを使ってもログインできないときは以下も試す。
- 一旦サービスを停止させて再開する
- 再開前にキャッシュを削除する
Laravel キャッシュの削除
$ php artisan cache:clear
Application cache cleared!