はじめてのAmazon SES/Lambda。メール送信ができるようになるまでの覚書 

# はじめに
今回はAmazon SES と Lambdaでメール送信の仕組みを作った時の覚書です。よくネット通販で買い物の後に、確認のための"no-reply"みたいな表題のメールが送られてきますよね。そういう仕組みを作りました。滅多にやらない作業なのでQiitaに残しておくのがよいと思いました。

![00.png](https://qiita-image-store.s3.amazonaws.com/0/150932/40f7811e-b894-94e9-487a-ba7043b2a9bf.png)

# なぜSES/Lambda？
実は最初同様の仕組みをイチからスクラッチしかけていましたが、AWSの方も調査してるうちにそっちが楽そうに思えたからです。メールサーバの構築等々、仕組みもさることながら可用性うんぬん議論しはじめたらそれだけで何カ月もかかってビジネス速度に耐えられません。しかも私自身開発業務は初の体験。何が正解かわからない中での模索でしたが、結果的に工数削減の点でこの選択が正解だったと思います。

# 事前準備
## SES
SESの画面でDKIM等の設定を済ませておきます。で、ここで気づくのですが、ドメインの設定を先に済ませておかなければなりません。今回はRoute 53上に専用のサブドメインを用意。必要に応じて元のDNSサーバに対しても委譲設定等を行います。DNS関連は慣れないと難しいですね～。

## Route 53
no-replyのメアドで使うサブドメインを作りました。

## Lambda実行のためのCLI環境
必須ではありませんが、CLIで実行するのが便利です。もちろんGUIから実行しても問題ありませんが、個人的にAWSのGUIが苦手なのでCLIから叩いています。

# Lambda関数
## コード

環境変数は基本的にevent.jsonに書いていきます。ハードコーディングしている箇所もありますが使いやすいように書き換えてください。key1、key2...といった具合で必要に応じて増やしていけばよいかと。

```mail.python
#!/usr/bin/env python
# coding:utf-8
import boto3
import json
from dateutil.parser import parse

REGION = "us-west-2"

def send_email(source, to, subject, body):
    client = boto3.client('ses', region_name=REGION)

    response = client.send_email(
        Source=source,
        Destination={
            'ToAddresses': [
                to,
            ]
        },
        Message={
            'Subject': {
                'Data': subject,
            },
            'Body': {
                'Text': {
                    'Data': body,
                },
            }
        }
    )

    return response

def lambda_handler(event, context):

    SRC_MAIL = "{送信元メールアドレス}"
    DST_MAIL = event['key1']
    HMAIL = "{返信先メールアドレス}"
    TITLE = "ご購入ありがとうございます"
    BODY = "営業担当です。\n"\
               + "お買い上げありがとうございます。\n"\
               + "本メールへの返信は以下にお願い致します。\n"\
               + HMAIL +"\n"\

    r = send_email(SRC_MAIL, DST_MAIL, TITLE, BODY)
    return r
```

```
$ cat event.json
{
  "key1": "{宛先メールアドレス}"
}
```

# 実行
```
$ python-lambda-local -f lambda_handler mail.py event.json
```

# 結果
![01.png](https://qiita-image-store.s3.amazonaws.com/0/150932/2a353bd0-6efd-4168-6de3-2caa3a1932b3.png)

# もし"no-replyメール"に返信されたら？
"no-replyメール"への返信はあってほしくないもの。「常識を疑います！」などと突き放したいところですが、現実問題ありうる例外処理として作っておく必要があります。今回はS3に飛ばし、そこから特定のメーリングリストに飛ばす処理をLambdaで行っています。

# まとめ
SESとLambdaをはじめて触る私にも簡単に作れました。AWSを使えば相当シンプルなプロセスで構築できることがわかりました。普段使わないようなAWSのサービスについても面倒がらずに知っておく・使ってみることは大事ですね。

# 参考
参考にさせて頂きました。ありがとうございます。

[サブドメインの運用と委任](http://www.atmarkit.co.jp/ait/articles/0306/03/news002.html)

[Route53でサブドメインだけ管理する方法](http://developersnote.jp/aws/route53.html)

[親ドメインの移行を行わずに Amazon Route 53 を DNS サービスとして使用するサブドメインを作成する](http://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/CreatingNewSubdomain.html)

[Amazon SESによるメール送信環境の構築と実践](https://dev.classmethod.jp/cloud/aws/amazon-ses-build-and-practice/)

[AWS Lambda Pythonをローカル環境で実行](http://dev.classmethod.jp/cloud/aws/invoke-aws-lambda-python-locally/)

[Amazon SES での DKIM を使用した E メールの認証](https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/dkim.html)

[勤怠連絡メールをAPIGatewayとlambdaで作ってみた](https://techblog.recochoku.jp/196)

# その他
当社ではソフトウェア関連取組みの一環として、クラウド型パフォーマンスモニタサービス「New Relic」を提供しています。詳しくは[こちら](https://newrelic.nissho-ele.co.jp/)から。