目次
はじめに
こんにちは、大野です。
最近、AWSでメールを扱ってみたいと思いました。
しかし、よく考えると、実際にAmazon SESを触るのは初めてだったので、実際に色々メール関連の構築を行う前の入門として、今回はAmazon SESでメールの受信を行ってみることにします。
なお、Amazon SESのメール受信機能が東京リージョン(ap-northeast-1)に対応したのは2023年9月とのこと。
半年と少し前くらいです。
今回も東京リージョンで検証していきます!
今回やること
今回は以下のことを前提として検証していきます。
- Amazon SESを用いてメールの受信を行う。
- 送信は緩和申請が必要なので今回は行わない。
- Route 53にある独自ドメインを使用
今回も、前回の記事で取得した独自ドメイン「nakkun.jp
」を使っていきます!
独自ドメインの取得がまだの人は、先に独自ドメインを取得し、Route 53にホストゾーンを設定してみましょう!
Amazon SESのIDを作成
まず、メールの受信に使うAmazon SESのIDを作成します。
IDの設定を行います。
タイプはドメインを選択し、ドメインには独自ドメインを入力します。
今回は、サブドメイン「ses.nakkun.jp
」を使用します。
今回の記事では受信のみを行いますが、今後送信も行う場合に備えて、「カスタム MAIL FROM ドメインを使用する」にチェックを入れ、「MAIL FROMドメイン」を設定し、Route 53へ発行するように設定します。
Route 53の設定
次に、Route 53の設定をしていきます。
Route 53の設定を確認
「nakkun.jp
」のホストゾーンを確認し、サブドメイン「ses.nakkun.jp
」で検索を掛けます。
①は先ほど設定したDKIMレコード、②はカスタムMAIL FROMドメインのMXレコードとSPFレコードで、Amazon SESで設定すると、Route 53に自動的に追加されます。
メール受信用のMXレコードを追加する
前述の自動で追加されたDNSレコードは、カスタムMAIL FROMドメインで送信する際に利用するDNSレコードになります。
そのため、このままではAmazon SESでメールを受信することはできません。
「@ses.nakkun.jp
」のメールアドレスで受信するために必要なMXレコードを追加します。
具体的には、ドメインのMXレコードに下記を追加します。
10 inbound-smtp.region.amazonaws.com
「region」にはリージョン名が入ります。
即ち、東京リージョンならば、下記のようになります。
10 inbound-smtp.ap-northeast-1.amazonaws.com
受信ボックス用のS3を作成
S3バケットの作成
メールの受信ボックスとなる、S3を作成します。
まずは、他の設定は特に変更せず、基本的な設定で構いません。
「ono-ses-bucket」を作成しました。
バケットポリシーの追加
Amazon SESからS3バケットへの書き込みを許可するために、バケットポリシーを追加します。
バケットポリシーは、下記の形式になります。
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"AllowSESPuts",
"Effect":"Allow",
"Principal":{
"Service":"ses.amazonaws.com"
},
"Action":"s3:PutObject",
"Resource":"arn:aws:s3:::myBucket/*",
"Condition":{
"StringEquals":{
"AWS:SourceAccount":"111122223333",
"AWS:SourceArn": "arn:aws:ses:region:111122223333:receipt-rule-set/rule_set_name:receipt-rule/receipt_rule_name"
}
}
}
]
}
これらの下記の部分を、
- myBucket … バケット名
- 111122223333 … AWSアカウントID
- rule_set_name … Amazon SESの受信ルールセット名
- receipt_rule_name … Amazon SESの受信ルール名
の内容に置き換えます。
今回は下記の内容を設定しました。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowSESPuts",
"Effect": "Allow",
"Principal": {
"Service": "ses.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::ono-ses-test/*",
"Condition": {
"StringEquals": {
"AWS:SourceAccount": "************",
"AWS:SourceArn": "arn:aws:ses:ap-northeast-1:************:receipt-rule-set/Ono-test:receipt-rule/ses.nakkun.jp-test"
}
}
}
]
}
「************
」は私のAWSアカウントのIDが入ります。
受信ルールセット名は「Ono-test」、受信ルール名は「ses.nakkun.jp-test
」としていますが、Amazon SESで受信ルールを作成する時から、S3バケットへのアクセス許可が必要なので、先に決めてからバケットポリシーを作成しましょう。
Mailboxディレクトリの作成
管理を行いやすいように、受信したメールを保存するための「Mailbox」ディレクトリを作成します。
Mailboxフォルダを作成したら、S3バケットの作成と設定は完了です。
Amazon SESの受信設定
次に、Amazon SESでメールを受信するための設定を行います。
ここでは、先ほど設定した受信ボックス用S3のバケットポリシーの設定に従って命名していきます。
受信ルールセットの作成
受信ルールセットは、先ほどの
「rule_set_name … Amazon SESの受信ルールセット名」
が該当します。
今回はrule_set_name
は「Ono-test
」で設定していたので、その名前で作成します。
受信ルールの作成
受信ルールセットを作成したら、それに受信ルールを作成します。
受信ルールは、先ほどの
「receipt_rule_name … Amazon SESの受信ルール名」
が該当します。
今回はreceipt_rule_name
は「ses.nakkun.jp-test
」で設定していたので、その名前で作成します。
次に、受信者の条件を設定します。
ここでは、このルールで受信する受信者の条件を設定します。
Amazon SESで有効にできるルールセットは1つだけなので、ここでルールを複数作成することにより、個々のID(ドメイン)への振り分けや、特定のメールアドレスを設定することが可能になります。
複数のIDがある場合は②、③、特定のメールアドレス(メールアカウント)を指定したい場合は①を設定しますが、今回は他のIDは無く、設定している唯一のIDである「ses.nakkun.jp-test
」宛ての全てのメールを受信するので、④の通り特に条件を設定せず進めます。
アクションで、Amazon S3に配信するように設定します。
S3バケットの名前を少し入力すると、候補に出てくるので選択し、オブジェクトキープレフィックスには事前に作成した「Mailbox」ディレクトリの名前を入力します。
次の確認画面で設定に問題無ければ作成します。
受信ルールセットの有効化
受信ルールセットを作成した時点では無効になっています。
このままでは、せっかく受信ルールセットと受信ルールを作成したのに受信できないです。
対象の受信ルールが有効になれば、Amazon SESの準備は完了です。
セットアップメールの確認
ここまで全ての設定が完了したら、S3バケットのMailboxディレクトリを見てみましょう。
「AMAZON_SES_SETUP_NOTIFICATION」という通知が一通届いています。
この通知が届いていれば、ここまでの設定が出来ています。
届かない場合は、どこかの設定が間違っているので修正しましょう。
「AMAZON_SES_SETUP_NOTIFICATION」のメールはAmazon SESの受信ルールの設定確認通知になります。
届かない場合の原因として多いのが、「バケットポリシー」の設定ミスです。
S3バケットで、同じAWSアカウントのAmazon SESからのPutリクエストを許可する設定を行わなければ、許可が無い状態なので、Amazon SESからS3バケットに書き込むことができません。
通知が届かない場合は設定を見直しましょう。
メール受信テスト
ここまでで、Amazon SESでメールを受信し、Amazon S3に保存する設定が完了したので、メールテストをしてみましょう。
テストメールの送信
テストメールは、個人のメールアドレス、会社のメールアドレスなど、外部のどのメールアドレスから送信しても構いません。
今回は技術ブログの記事として表向きに公開するということで、簡単に一時的なメールアドレスを作成して送受信できるサービス「捨てメアド」を使用します。
今回は、ses-test@svk.jp
というメールアドレスを作成したので、これから送信してみます。
今回はtest@ses.nakkun.jp
宛てに送信していますが、宛先は受信ルールで「受信者の条件」を設定していない場合は、ドメインが正しければアカウント名(@
より前)は何でも構いません。
テストメールの受信確認
Amazon S3のバケットを確認します。
メーラで開く
メーラで開けるように、.eml
の拡張子を付けます。
ファイル名拡張子を表示する設定にしていると、「名前の変更」で拡張子を変更できるようになります。
.eml
を付けると、プログラムとして普段メーラとして利用している、Mozilla Thunderbirdが認識されました。
Mozilla Thunderbirdでメールとして開くことができました。
件名もタイトルも送信時と同じ。
特に文字化けなどは発生していません。
メールが届かない場合
もしメールが届かない場合は、どこかの設定に不備があります。
宛先ドメインが正しいのに届かない場合は、下記を参考に設定を確認してみましょう。
バケットポリシー、受信ルールの設定が正しければ、前述の「AMAZON_SES_SETUP_NOTIFICATION」の通知が届きます。
この通知が届いているのに、外部からのメールが届かない場合を考えてみます。
外部からのメールを正しく受信するためには、メールがAmazon SESの受信ルールで処理されてS3バケットに配信される必要があります。
考えられる主な原因は下記があります。
- ドメインのMXレコードの設定ミス。(Route 53)
- MXレコードは、メールの転送先のサーバを示すレコードなので、それが正しく設定されていなければ、外部からはどこに配送すべきなのかが分からないので配送できません。
- 受信ルールセットが無効になっている。(Amazon SES)
- 受信ルールセットが無効になっている場合も、Amazon SES、AWSにまで到達しても配送先が分からないので配送できません。
私も検証中にこれで少し詰まりました。
正しく設定できているか見直してみましょう。
まとめ
AWSでメールを扱う時の基本として、まずはAmazon SESで外部からのメールを受信できる設定を行ってみました。
最初は少し詰まりましたが、改めてメール配送の仕組みを勉強するきっかけにもなりました。
ゆくゆくは、Amazon SESで受信したメールを使ってSlackに何かしらの通知する、Lambdaで処理をして何かを行うなどのシステムを構築してみたいと思います。
おわりに
個性を出していく…ということで、私、大野の記事の最後には毎回写真を載せています。
今回の写真は、広島県呉市の本土と倉橋島の間の音戸の瀬戸に架かる音戸大橋です。
先日の休日(4/6~7)は、青春18きっぷで広島、呉方面へ行っていました。
呉市内ではSNSで相互フォローしている呉在住の知り合いにアテンドしていただき、市内色々行きましたが、今回の写真は路線バスでは少し行きづらい音戸大橋。
呉市の中でも桜の名所で、夜でも綺麗でした。
スマホや大抵のデジカメでは難しい手持ちの夜景でこそ、新しいカメラの威力を感じます。
では…。
ディーネットでは少数派の旅行が大好きなアウトドア派エンジニア。
inbound-smtp.ap-northest-1.amazonaws.com
「northest」になってます、当然正しくは「northeast」
わかりやすいサイトでありがたかったのですが
これで2時間つぶしました、、、
脱字について、申し訳ございませんでした。
指摘ありがとうございます。
修正いたしました。
ご教示いただいた設定をしようとしているのですが、route53にはすでに送信用のMXレコードがあるので、route53が
エラーが発生しました
指定された名前のレコードは既に存在します。
(InvalidChangeBatch 400: Tried to create resource record set [name=’match.shigotonavi.co.jp.’, type=’MX’] but it already exists)
というエラーを出して入りません。
mx レコードの値に追加するならできそうですが、それでよいでしょうか?
(片山 基と申します)