8
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

はじめに

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

00.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

もし"no-replyメール"に返信されたら?

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

まとめ

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

参考

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

サブドメインの運用と委任

Route53でサブドメインだけ管理する方法

親ドメインの移行を行わずに Amazon Route 53 を DNS サービスとして使用するサブドメインを作成する

Amazon SESによるメール送信環境の構築と実践

AWS Lambda Pythonをローカル環境で実行

Amazon SES での DKIM を使用した E メールの認証

勤怠連絡メールをAPIGatewayとlambdaで作ってみた

その他

当社ではソフトウェア関連取組みの一環として、クラウド型パフォーマンスモニタサービス「New Relic」を提供しています。詳しくはこちらから。

8
12
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?