SES+S3+Lambdaを使ってサーバーレスでメールを転送する

Lambdaを使ってSESのメールを転送するプログラム

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

を使うと簡単にできます。(Node.jsで動きます。中身はシンプルなプログラムなのでカスタマイズも簡単にできそうです。)

例えば社名変更してドメインも変わって数年経つけどまだたまに古い方のメールアドレスにメールが来る、というケースに使えるかと思います。

頻繁にやり取りしているケースだとちょっと厳しいかもしれません。あくまで取りこぼしがないように新しいメールアドレスに転送させる、返信の際には新しいメールアドレスから返信する、という感じですね。

手順などで注意するへんはこちら

転送といいつつも実際は中継して改めて異なるメールアドレスから送信するかたちです。

SESのセキュリティ要件上、認証されたドメインもしくはメールアドレスをFromにする必要があるため、Fromのアドレスはもともとのメールとは変わります(Reply-Toは元のアドレスのまま)

Gmailで受信してそのまま返信しようとすると意図したメールアドレスに返信されないので、注意が必要ですね。

SubjectにPrefixをつけることができるので、「転送されたメッセージ:」とかつけておくことでそのまま返信しよう、ということもなくなるかと思います。

var defaultConfig = {
  forwardMapping: {
    "hoge@example.com": [
      "hoge@example.net"
    ],
    "@example.com": [
      "hoge2@example.net"
    ],
  }
};

のように指定すると、上から順に評価されて条件に一致しなかった場合のメールを一律でhoge2@example.netに転送する、とかができるようになります。スパムメールとかがどの程度フィルタリングされるか不明ではありますが・・・。

S3のバケット作成はSESのルール作成画面から作るとロールもあわせて設定されるので便利です。

S3に保存→Lambdaで処理の順番でルールを作成するようにしてLambdaの方では特にイベントトリガーは設定しないようにします。

Lambdaでテストする際には

テストケース「SES Email Receiving」を選択します。

S3のバケットにMessageIdと同じ名前のファイルを配置します。ファイルの中身はメールのRAWデータになります。

あとはテストケースのFromとToを適宜変更してテストしてみます。

SESの設定で最初にやる流れ

http://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/receiving-email-getting-started.html

参考

http://iseebi.hatenablog.com/entry/2016/05/05/123815

http://tech.innovation.co.jp/2017/06/04/Route53-S-E-S-S3-Lambda-Gmail.html