独自ドメインでメールを使えるようにしてみた(受信編)

2021/05/06に公開

独自ドメインでメールを受信できるようにした

前回の「独自ドメインでメールを使えるようにしてみた(送信編)」のつづき
amazon ses自体はMTAになるが、POPやIMAPが実装されていない。つまりoutlookなど一般的なクライアントでメールを受信することが出来ない。
もし、それをやりたい場合は下記のようにS3 アクションやWorkMail アクションといった感じになる。
WorkMailはご存知の通りお金がかかる。。。。
Amazon SES メール受信の概念
ということで、今回はLambda アクションを使ってgmailに転送させてみようと思う。

注意

今回使用する受信機能を実装しているリージョンはバージニア北部です。東京リージョンがまだこの受信機能に限っては実装されていません。
E メールの受信

S3にメールを保存する

まずはS3に受信したメールが保存されるようにしましょう

受信ルールの作成

受信対象を設定します。

受信するドメイン、アドレスなどを指定できます。特に設定しなくてもいいかもしれませんが、今回はドメインMailFromで設定したドメインのみを指定しました。
指定の仕方は詳しく説明してくれているのでそれに沿って行いました。

メールを受信した際のアクションを設定します。まずS3を選びます。

S3のバケットを用意していないのでCreate bucketを選び、バケットを作成します。


バケットを作成するともとの画面に戻ってきます。
ほかは設定せずにNext Stepします。

ルール名を入力します。ほかはデフォルトのままにしました。

確認画面で確認します。
Create Ruleでルールを作成します。

コンソールに表示され、StatusがEnabledであれば成功です。

メール受信テスト

設定したドメインに対して、メールを送ってみます。
「なんでも良い@設定したドメイン」のような感じで適当にアドレスを打ってgmailなどからメールを送信してみます。
送信できたら先程作成したバケットを開いてみます。

バケットの中身に2ファイル存在していると思いますが、ランダムな文字が羅列されているものが先程テストで送ったもののはずです。ダウンロードしてみます。

ダウンロードして先程送信したメールのソースを見ることができれば成功です。
本文などもbase64になってるので、デコードすると先程送信した内容のもののはずです。
これができればメールの受信が機能しているということがわかります。

S3に保存されたらメールを転送するようにする

このままだととても面倒くさくて普段から見る気起こらないので自分がメインで使用しているgmailに転送するようにしてみます。
先程記載したように受信のアクションでPOPやIMAPは使えないのでLambdaを使ってS3に保存されたタイミングでgmailに転送するようにします。

aws-lambda-ses-forwarderをcloneする

世の中には同じようなことを考えてる人がすでにいて、しかも公開してくれているものです。
感謝して https://github.com/arithmetric/aws-lambda-ses-forwarder を使わせてもらいます。

git clone https://github.com/arithmetric/aws-lambda-ses-forwarder

aws-lambda-ses-forwarderの中の今回はindex.jsを使用させてもらいます。
転送するメールアドレスは「Verify a New Email Address」で設定したものに限ります

Lambda関数を作成します

早速Lambda関数を作成します。

関数を一から作成にして今回はnode12推奨とのことなのでnode12で作成します。

関数が出来ました

これに先程cloneしたindex.jsをアップします。
アップする前に少しだけ設定を変更します。コンフィグすべき内容はソースに丁寧に書いてくれています。

編集したindex.jsをzip化してアップロードします。

Lambda関数のロール権限を設定します

下記の権限を与えて関数を動かせるようにします。

  • S3へのアクセス権限
  • SESでの送信権限
  • CloudWatchのログ作成権限
    実行ロールを表示します。

    インラインポリシーの追加を押下してポリシーを追加します。

    中身をjsonで編集しましょう。
    この辺りは
    https://github.com/arithmetric/aws-lambda-ses-forwarder のsetupに書いてるのでそのまま追加します。やってることはlogとsesの送信権限、S3のget,put権限を与えてる感じです。
    「S3-BUCKET-NAME」は自分の設定したものに変更しましょう。

    名前をつけて完了です。

    インラインポリシーが増えていれば成功です。

timeoutの設定

aws-lambda-ses-forwarderのタイムアウトは10秒で十分みたいな記述があるので設定しておきます。
デフォルト3秒になってるのでこれを10秒に変更します。

SESのアクションに作成したLambdaを追加

SESのS3受信時に作成したルールを編集します。

Add ActionでLambdaを選択します。

先程作成した関数を選択して終了です。

送信テスト

gmailで設定したドメインに対してメールを送ってテストしてみます。

結果

無事できました!!!このような形でaws-lambda-ses-forwarderのconfigで設定した転送先に転送されてきます。

まとめると

  • From:aws-lambda-ses-forwarderのconfigで設定したfromメアド
  • To:送信先(gmailで送信時に指定されたアドレス)
  • Reply-To:originalな送信元
    という感じになってメールが来ます。下記メールソースの一部です。ばっちりですね。

S3のライフサイクルの設定

このままでは受信用のS3にどんどんゴミが溜まってしまうので受信後、ある程度たったら消すように設定しておきます。


下記ページを参考に設定しました。
ライフサイクルで完全に消すAWSの説明

参考にしたページ

https://www.tech-note.info/entry/ses_s3_lambda

Discussion