SESはメールを送信する用途で使用されている方が多いと思いますが、メールの受信も行うことができます。メールを受信したらLambda関数を実行する、S3にメールを保存する、SNS Topicに通知するといった使い方ができます。設定手順と動作を記載します。

参考にしたAWS公式ドキュメントはこちらです。
設定手順
前提
受信対象のメールアドレスのドメインをDNSに登録しておく必要があります。今回検証ではRoute53を使用しています。
DNS(Route53)にMXレコードを設定する
AWS公式ドキュメントに記載があるSMTPエンドポイントに向けてDNSでMXレコードを作成します。
inbound-smtp.[AWSリージョン].amazonaws.comの形式です。
リージョン | E メール受信エンドポイント |
---|---|
米国東部(バージニア北部) | inbound-smtp.us-east-1.amazonaws.com |
米国西部 (オレゴン) | inbound-smtp.us-west-2.amazonaws.com |
欧州 (アイルランド) | inbound-smtp.eu-west-1.amazonaws.com |
アジアパシフィック (東京) | inbound-smtp.ap-northeast-1.amazonaws.com |
Route53では以下のように設定します。
- レコード名:任意の値(サブドメイン)
- レコードタイプ:MX
- 値:10 inbound-smtp.us-east-1.amazonaws.com

MXレコードが登録されます。

SESの受信ルール設定
AWSマネジメントコンソールからSESを選択します。メール受信というメニューがあるので選択します。

ルールセットの作成を選択します。

ルール名を入力して作成します。

ルールセットを作成したらその中でルールを作成します。

受信者の条件にDNSに登録したMXレコードのサブドメインを使用したメールアドレス入力します。@以前は自由に決定しても問題ありません。

SESのアクション設定(S3格納)
作成したルールを選択してアクションタブを選択します。

編集を選択して新しいアクションを追加します。

実行したいアクションを選択して次へを選択します。

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowSESPuts",
"Effect": "Allow",
"Principal": {
"Service": "ses.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::[バケット名]/*",
"Condition": {
"StringEquals": {
"aws:Referer": "[12桁のAWSアカウントID]"
}
}
}
]
}
バケットを選択して次へを選択します。

あとは変更の保存を押下します。
ここでS3バケットに書込みできませんでしたと表示される場合はS3のコンソールを開き、バケットポリシーが正しく設定されているかを確認してください。
SESでドメインの認証
マネジメントコンソールでSES→設定:認証済みID→IDの作成を選択してドメインの認証を行います。

今回はRoute53を使用しているので他の項目はデフォルトでOKです。Route53のホストゾーンにCNAMEが追加されて検証されます。
検証に成功するとドメインが検証済みとなります。

ルールセットの有効化
ルールセットの作成直後は無効になっているので有効化します。

SESのアクション設定(Lambda関数実行)
ついでにLambda関数実行も試してみます。今回は同じルールセットの中でもう一つルールを作成してみます。

適当な名前を付けて作成します。

受信者の条件には、このメールアドレス宛のメールを受信したらLambdaを起動したいというアドレスを記載します。なお、ドメインはSESで認証済みである必要があります。(ここではS3配置の時のドメインを使用します。)

アクションの追加ではLambda関数の呼び出しを選択して実行したいLambda関数を選択します。
今回は非同期呼出しにしています。

ルール作成時に以下を選択してSESからLambda関数を実行する権限を割り振ります。

ちなみに今回実行するLambda関数は以下のようにeventの内容をprintしているだけです。
import json
def lambda_handler(event, context):
print(event)
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
設定は以上です。
動作確認
S3格納の場合
SESの受信者に設定したメールアドレスにメールを送信してみます。以下のように送信してみました。
・件名:title
・本文:hello
S3にファイルが置かれ、中身を確認すると以下のような内容が記載されていました。(DKIMの署名部分などは省略しています。)
From: =?UTF-8?B?6YeR5a2Q56ic?= <xxxxxx@gmail.com>
Date: Sat, 11 Feb 2023 22:47:13 +0900
Message-ID: <XXXXXXXXXXXXXXXXXXXXXX@mail.gmail.com>
Subject: title
To: user@xxxxxxxxxxx.com
Content-Type: multipart/alternative; boundary="00000000000090452b05f46cda6b"
--00000000000090452b05f46cda6b
Content-Type: text/plain; charset="UTF-8"
hello
--00000000000090452b05f46cda6b
Content-Type: text/html; charset="UTF-8"
<div dir="ltr">hello</div>
--00000000000090452b05f46cda6b--
Lambda関数実行の場合
では受信者に設定したメールアドレスにメールを送信してみます。以下のようなメールを送ってみました。
・件名:hello Lambda
・本文:send from gmail
膨大なJSONがCloudWatchLogsに出力されました。一部抜粋します。
"messageId": "<CADUsbP0RT=pK8em-ZB09hmW7uQrBHM-RQuxWE1_iFF-Rq_xQGw@mail.gmail.com>",
"subject": "hello Lambda"}},
"receipt": {"timestamp": "2023-02-11T14:27:38.682Z",
"processingTimeMillis": 636,
"recipients": ["user_lambda@xxxx.yyyy.zzzz"]
最後に
SESでメールを受信できることは今回初めて知りました。実行するLambda関数を作りこめば自動返信や、DynamoDBに受信メールを格納して分析するなどいろいろな用途がありそうだと感じました。
PR
当ブログはWordPressテーマSWELLを使用しています。非常に使いやすく、簡単にプロのようなデザインを使えるのでお勧めです!!
SWELL – シンプル美と機能性両立を両立させた、圧巻のWordPressテーマ

システムエンジニア
AWSを中心としたクラウド案件に携わっています。
IoTシステムのバックエンド開発、Datadogを用いた監視開発など経験があります。
IT資格マニアでいろいろ取得しています。
AWS認定:SAP, DOP, SAA, DVA, SOA, CLF
Azure認定:AZ-104, AZ-300
ITIL Foundation
Oracle Master Bronze (DBA)
Oracle Master Silver (SQL)
Oracle Java Silver SE
■略歴
理系の大学院を卒業
IT企業に就職
AWSのシステム導入のプロジェクトを担当