エラーの内容
AWS SES 経由でメールを送信すると、即座に以下のエラーが返ってきます:
MessageRejected: Email address is not verified. The following identities failed the check in region US-EAST-1: recipient@example.com
送信者アドレスは正常に機能しており、認証情報も問題ありません。それでも SES はすべての送信メールを拒否します。これはサンドボックスが正常に動作している結果です――残念ながら、あなたの意図に反する形で。
原因
すべての新しい AWS アカウントは、SES が サンドボックスモード でロックされた状態から始まります。このモードでは、SES は明示的に検証済みのメールアドレスまたはドメインにのみ送信が許可されます――任意の受信者への送信はいかなる例外もありません。
サンドボックスでは 1 日あたり 200 通、1 秒あたり 1 通 という制限もあります。以下のいずれかの条件に該当する場合にエラーが発生します:
- 受信者のアドレスが SES で検証されていない
- サンドボックスのままで、本番アクセスをリクエストしていない
- ID があるリージョン(例:
us-east-1)で検証されているが、別のリージョン(例:eu-west-1)経由で送信している
修正方法 1:本番アクセスをリクエストする(推奨)
実際のアプリケーションであれば、これが最適な解決策です。本番アクセスにより検証済み受信者の制限が解除され、デフォルトの送信クォータが 1 日あたり 50,000 通に引き上げられます。
- AWS コンソール → SES → アカウントダッシュボード に移動する
- 本番アクセスをリクエスト をクリックする
- フォームに入力する:ユースケース、予想送信量、バウンスとクレームの処理方法
- 送信する――AWS は通常 24 時間以内にリクエストを審査しますが、複雑なケースはそれ以上かかる場合があります
CLI を使用する場合は、直接リクエストを送信できます:
aws sesv2 put-account-details \
--mail-type TRANSACTIONAL \
--website-url https://yourapp.com \
--use-case-description "Sending transactional emails (password reset, order confirmation) to registered users who opted in" \
--additional-contact-email-addresses your@email.com \
--production-access-enabled \
--region us-east-1
アカウントがすでに承認済みかどうかを確認する:
aws sesv2 get-account --region us-east-1
レスポンス内の "ProductionAccessEnabled": true を確認してください。false と表示されている場合は、リクエストがまだ審査中か、まだ送信されていない状態です。
修正方法 2:受信者のメールアドレスを検証する(テスト用の即時対応)
本番アクセスの審査を待っている場合は、テストに使用する特定のアドレスを検証してください。SES がそのメールボックスに確認リンクを送信します――リンクをクリックすると、そのアドレスがサンドボックスで使用可能になります。
# 受信者のメールアドレスを検証する
aws ses verify-email-identity \
--email-address recipient@example.com \
--region us-east-1
現在検証済みのすべての ID を確認する:
aws ses list-identities --region us-east-1
送信前に特定のアドレスが検証済みかどうかを確認したい場合:
aws ses get-identity-verification-attributes \
--identities recipient@example.com \
--region us-east-1
検証済みのアドレスは以下のように返されます:
{
"VerificationAttributes": {
"recipient@example.com": {
"VerificationStatus": "Success"
}
}
}
Success 以外の値――たとえば Pending――が表示された場合は、受信者がまだ確認リンクをクリックしていないことを意味します。
修正方法 3:ドメイン全体を検証する
アドレスを 1 件ずつ検証するのはすぐに面倒になります。ドメイン全体を検証すれば、そのドメインのすべてのアドレスがサンドボックスモードで自動的に有効な受信者として扱われます。
# DNS に追加する TXT レコードを取得する
aws ses verify-domain-identity \
--domain example.com \
--region us-east-1
AWS が検証トークンを返します。DNS プロバイダーで TXT レコードとして追加してください:
_amazonses.example.com TXT "your-verification-token-here"
DNS の伝播には数分から数時間かかる場合があります。伝播後に検証ステータスを確認してください:
aws ses get-identity-verification-attributes \
--identities example.com \
--region us-east-1
修正方法 4:リージョンの不一致
SES の ID はリージョンごとに管理されます。us-east-1 でドメインを検証しても、eu-west-1 経由のリクエストには何の効果もありません――コンソール上で検証済みに見えても、同じ MessageRejected エラーが発生します。
コードが ID を実際に検証したリージョンを参照していることを確認してください:
import boto3
# region_name は ID を検証したリージョンと一致させる必要があります
client = boto3.client('ses', region_name='us-east-1')
response = client.send_email(
Source='verified-sender@yourdomain.com',
Destination={'ToAddresses': ['recipient@example.com']},
Message={
'Subject': {'Data': 'Test'},
'Body': {'Text': {'Data': 'Hello'}}
}
)
各リージョンで検証されている ID を比較して不一致を特定する:
aws ses list-identities --region us-east-1
aws ses list-identities --region eu-west-1
修正が完了したか確認する
CLI からテストメールを直接送信して、動作を確認する最速の方法です:
aws ses send-email \
--from "sender@yourdomain.com" \
--destination "ToAddresses=recipient@example.com" \
--message "Subject={Data=Test,Charset=UTF-8},Body={Text={Data=It works,Charset=UTF-8}}" \
--region us-east-1
成功した場合は以下のようなレスポンスが返ります:
{
"MessageId": "0100018e1234abcd-..."
}
MessageRejected が表示されなければ、問題は解決しています。
予防策
- 本番アクセスのリクエストは早めに送信する。 リリース当日まで待たないでください。SES を設定した時点ですぐに申請しましょう――承認はすぐに行われるわけではなく、本番デプロイ中にブロックされると非常に困ります。
- 自動テストでは SES シミュレーターアドレスを使用する。 AWS は
success@simulator.amazonses.comやbounce@simulator.amazonses.comなどのアドレスを提供しており、これらはサンドボックス内で検証なしに使用でき、1 日あたり 200 通のクォータにも影響しません。 - 本番環境に移行する前に SNS のバウンスとクレーム通知を設定する。 AWS は本番アクセスの条件としてこれを求めており、承認後に省略すると送信者レピュテーションが危険にさらされます――クレームが一定数に達するとアカウントが停止されます。
- 新しいリージョンはゼロからのスタートになる。
ap-southeast-1や他のリージョンに展開する場合は、そのリージョンでドメインを再検証し、別途本番アクセスのリクエストを申請する必要があります。

