Laravelのメール送信で、AWSのSES(Simple Mail Service)を利用する場合、Laravelが提供しているsesドライバを使うと簡単にメール送信処理が実装できます。
本記事では、Laravelのsesドライバを使用して上手くメール送信ができない時に、ありがちな問題と解消方法を説明します。
よくある原因と対応
aws-sdk-php
のパッケージをインストールしていない
エラーメッセージ例
Class 'Aws\Ses\SesClient' not found
Symfony\\Component\\Debug\\Exception\\FatalThrowableError(code: 0):
Class 'Aws\\Ses\\SesClient' not found
at .../vendor/laravel/framework/src/Illuminate/Mail/TransportManager.php:98)
対応
必要なパッケージがないので、composerでパッケージをインストールします。
composer require aws/aws-sdk-php:~3.0
IAMロールに、SESのSendRawEmailに関する権限がない。
エラーメッセージ例
ログを控え損ねました...
対応
.envで指定した、AWS_ACCESS_KEY_IDに対するIAMロールを確認する、権限がなければ付与する。
クレデンシャル情報が間違っている、セットされていない
エラーメッセージ例
Error retrieving credentials from the instance profile metadata service.
(cURL error 7: (see https://curl.haxx.se/libcurl/c/libcurl-errors.html))
(Aws\\Exception\\CredentialsException(code: 0):
Error retrieving credentials from the instance profile metadata service.
(cURL error 7: (see https://curl.haxx.se/libcurl/c/libcurl-errors.html))
at .../server/vendor/aws/aws-sdk-php/src/Credentials/InstanceProfileProvider.php:240)"
対応
.envの下記にキーをセットする
# .env
MAIL_DRIVER=ses
AWS_ACCESS_KEY_ID=*****
AWS_SECRET_ACCESS_KEY=*****
AWS_DEFAULT_REGION=*****
クレデンシャル情報のリージョンが間違っている
原因
よくある誤りは、リージョンが東京になってしまっている.
(2020/03現在、東京リージョンでSESのサービスは提供されていないので間違えがち)
対応:
.envのAWS_DEFAULT_REGIONと、AWS consoleのリージョンを見比べる。
# .env
AWS_DEFAULT_REGION=*****
AWSの他のサービスを使っていて、SESのサービスだけリージョンを分けたい場合は、config/services.phpのキー名を書き換える
'ses' => [
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
# 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
'region' => env('SES_AWS_DEFAULT_REGION', 'us-east-1'), # 接頭語にSES_を追加などして定義を分ける
],
.envやconfig/*.phpを変更した後に、キャッシュをクリアしていない。
エラー例
.envを設定したにもかかわらず、設定が反映されてないように見える。
原因
下記のコマンドでキャッシュをクリアする。
また、php artisan serve
でサーバを起動している場合は再起動してみる。
php artisan cache:clear
メールの送信元アドレスが、AWS consoleのSESメールアドレスに登録されていない。
エラーメッセージ例
Email address is not verifiedエラーが出る。
Error executing "SendRawEmail" on "https://email.us-east-1.amazonaws.com"; AWS HTTP error: Client error: `POST https://email.us-east-1.amazonaws.com` resulted in a `400 Bad Request` response:
<ErrorResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
<Error>
<Type>Sender</Type>
<Code>MessageReje (truncated...)
MessageRejected (client): Email address is not verified. The following identities failed the check in region US-EAST-1: root@example.com
...
対応
AWS Consoleで確認する。
SES Home -> Identity Management -> Email Addressesより送信元メールアドレスを確認する。送信元のメールアドレスが登録されてなければ追加する
こちらもおススメ