menu-icon

CognitoでSESを使用してメールを送信する

Cognitoのメールの送信元アドレスをRoute53で取得したドメインのものに変更するための設定で、SESで検証済みと表示されているメールアドレスが送信元として設定できずに、悩んでしまったので手順をメモしておきます。

なおCognitoメールの送信元として設定するためにはSESのリージョンは、

  • バージニア北部(us-east-1)
  • オレゴン(us-west-2)
  • アイルランド(eu-west-1)

のいずれかである必要があります。今回の例ではバージニア北部を使用しています。

ドメインの登録と検証

Route53で取得したドメインの登録と検証を行います。Verified Identitiesの画面にてCreate Identityをクリック、遷移先の画面でIdentity TypeをDomain、Domainのテキストボックスにドメイン名を入力し登録します。

登録できたら、ステータスがVerification Pendingの状態となっています。

今回はRoute 53で管理しているドメインなので、検証用のCNAMEが自動的に登録され、そのまま待っていれば検証済みとなります。

これでドメインの登録と検証は完了です。

送信専用メールアドレスでのメール受信設定

次に送信元として使用するメールアドレスの登録と検証を行うのですが、検証を完了させるには送信専用のメールアドレスに送られてくるメールを受信する必要がありますので、その設定を行います。

まずRoute53でMX レコードを登録します。

10 inbound-smtp.us-east-1.amazonaws.com

inbound-smtp.us-east-1.amazonaws.comの部分はリージョンによって異なります。こちらのページの「Eメールの受信」にエンドポイントが記載されています。

次に受信ルールを設定します。Email Receivingの画面にてCreate Rule Setをクリック、ルールセット名を入力し登録します。

次にルールを登録します。Create Ruleボタンを押してルール名を入力し、Nextをクリックします。

次の画面ではRecipient conditionsにドメイン名を入力し、Nextをクリックします。

次の画面ではメール受信時のアクションを指定します。今回はメールをS3バケットに保存する方式にします。Add new actionからDeliver to S3 bucketを選択、配信先のバケットを作成、または既存のバケットを指定します。

バケットを指定したらNextをクリックし、Review画面へ進みます。内容を確認し、Create ruleをクリックしてルールを作成します。

ルール作成後、inactiveになっているルールセットをactiveにして完了です。

これで登録したドメインのメールアドレスでメールを受信した場合、指定したS3バケットにメールが保存されるようになりました。

メールアドレスの登録と検証

Create Identityの画面でIdentity TypeをEmail address、Email addressのテキストボックスに送信元として使用するメールアドレスを入力し登録します。

登録すると、特に何もしなくてもステータスはverifiedとなっています。

しかし、これをcognitoのユーザープールに設定しようとしても選択肢として表示されません。

実際cli commandでメールを送信しようとすると、Email address is not verified. というエラーになります。

$ aws sesv2 send-email --from-email-address "no-reply@xxx" --from-email-address-identity-arn "arn:aws:ses:us-east-1:000000000000:identity/no-reply@xxx" --destination '{"ToAddresses":["hoge@example.com"]}' --content '{"Raw": {"Data": "test"}}' --region us-east-1

An error occurred (MessageRejected) when calling the SendEmail operation: Email address is not verified. The following identities failed the check in region US-EAST-1: arn:aws:ses:us-east-1:000000000000:identity/no-reply@xxx

どうやらSES V2ではメールアドレスの検証ステータスにかかわらず、ドメインが検証済みの場合には検証ステータスはverifiedで表示されるそうです(参考)。

ということでverifiedと表示されていますが、メールアドレスの検証を行う必要があります。検証は登録したメールアドレスに送信されるメールに記載されているURLにアクセスすることで行います。

先程設定を行いましたので、S3バケットを確認すれば受信したメールのファイルが存在するはずです。

ファイルの中身を確認し記載されているhttps://email-verificationで始まるURLにアクセスします。

上の画面が表示されたら検証完了です。実際にメールも送信できるようになりました。

$ aws sesv2 send-email --from-email-address "no-reply@xxx" --from-email-address-identity-arn "arn:aws:ses:us-east-1:000000000000:identity/no-reply@xxx" --destination '{"ToAddresses":["hoge@example.com"]}' --content '{"Raw": {"Data": "test"}}' --region us-east-1
{
    "MessageId": xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}

Cognitoのユーザープールでも設定できるようになったので、設定すればCognitoのメールの送信元が登録したメールアドレスとなります!

まとめ

CognitoでSESを使用してメールを送信するための設定について調べました。検索して見つかる情報はSES V1時代のもので、ステータス表示の仕様の差異に混乱してしまいました。自分と同じく混乱してしまった人の参考になれば幸いです。