AWS SESでメールを受信してS3に格納やLambda起動を行う手順

SESでメールを受信してS3に格納やLambda起動を行う手順アイキャッチ

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

本検証ではバージニアリージョンのSESを使用して検証します。過去、東京リージョンはSESのメール受信がサポートされていなかったからです。現在は東京リージョンもメール受信がサポートされています。
サポートされている地域についての最新情報はAWS公式HPをご確認ください。

SESでメールを受信したらLambda起動やS3格納などを行うアーキテクチャ図

参考にした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
Route53ホストゾーンにMXレコードを追加する手順

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

SESの受信ルール設定

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

SESでEメール受信を選択する

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

SESでルールセットを作成する

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

ルールセット名を登録する

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

作成したルールセット内にルールを作成する

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

受信者の条件を指定する

SESのアクション設定(S3格納)

作成したルールを選択してアクションタブを選択します。

ルールアクションでS3格納を選択する

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

アクションの追加を押下する

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

アクションの設定でS3バケットへの配信を選択する

S3へ配信する際は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バケットに書込みできませんでしたと表示される場合はS3のコンソールを開き、バケットポリシーが正しく設定されているかを確認してください。

SESでドメインの認証

マネジメントコンソールでSES→設定:認証済みID→IDの作成を選択してドメインの認証を行います。

SESでドメインの検証を行う

今回はRoute53を使用しているので他の項目はデフォルトでOKです。Route53のホストゾーンにCNAMEが追加されて検証されます。

検証には最大72時間かかることもあるようです。(筆者の場合は1分以内に検証されました。)
なかなか検証されない場合はnslookupなどでCNAMEを登録できているかを確認します。

検証に成功するとドメインが検証済みとなります。

Route53にCNAMEが登録されて検証済みになる。

Route53が別AWSアカウントにある場合や、Route53以外のDNSを利用している場合は手動でCNAMEの登録が必要です。

ルールセットの有効化

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

ルールセットを有効化する

SESのアクション設定(Lambda関数実行)

ついでにLambda関数実行も試してみます。今回は同じルールセットの中でもう一つルールを作成してみます。

SESの受信ルールを作成する

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

ルール名を入力する(任意名)

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

受信者の条件設定を行う

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

Lambda関数呼び出しの設定を行う

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

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テーマ

ランキング

ランキングに参加しています。クリックして応援いただけると嬉しいです。
にほんブログ村 IT技術ブログ クラウドコンピューティングへ
にほんブログ村
AWSランキング
AWSランキング

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次