AWS超絶初心者がSESを使ってメールの一斉送信やってみた


筆者のレベル感は

  • AWSの構成図は読める、それぞれの機能の概要はなんとなく分かる
  • AWSでの実装経験はゼロ(システム開発経験もゼロ)

なので、生暖かく見守ってください。

やりたいこと

リスト化されたメールアドレス宛に、対応する宛名を文面に盛り込んだメールを送りたい。

基本的には以下の記事を参考に実装。項目も引用させてもらっています。

SESで送信元メールアドレスを登録

ここはうまくいった。方法はネットに溢れているので割愛

DynamoDBでユーザーテーブルを作成

???
userId(PK)とはなんぞや???プライマリキーということは分かったけど、
a06b7c45-1303-45bf-a2d7-fec53fbc224cとかが何を表しているのか分からないので、
いったん以下のように記載

userId(PK) name emailAddress
1 太郎 [email protected]
2 花子 [email protected]

メール配信のLambda関数を実装

Lambda関数を実装する際、DynamoDBとSESの権限が必要になります。

と記載があったので、IAMから以下の権限を持ったロールを作成

  • AmazonDynamoDBFullAccess
  • AmazonSESFullAccess
  • AWSLambda_FullAccess

index.jsのサンプルコードを見るも、あかん、、、JavaScript全然分からん、、、、
pythonで書こう。。。

  • DynamoDBからデータを取り出す
  • for文で回してSESでメールを送信する が実現できれば、とりあえず動くはず。

自分の書き方があんまイケてないのは分かる。

dynamoses.py
import boto3
import json

REGION = "ap-northeast-1"
#送信元
SRC_MAIL = "[email protected]" 
#送信先
#DST_MAIL = "[email protected]"
MESSAGE = "様へ これはテストです!"
#タイトル
EMAIL = "テスト配信"

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):

    dynamodb = boto3.resource('dynamodb')
    table = dynamodb.Table('User')

    #シンプルにscanメソッドの呼び出しをする
    response = table.scan()
    #取得レコードは"item"ではなく"items"!
    items = response['Items']

    #メールアドレス取得
    newadd = list()
    newname = list()
    for ke in items:
        for k in ke.keys():
            if k =='emailAddress': 
                newadd.append(ke[k])
            elif k =='name': 
                newname.append(ke[k])

    email = EMAIL
    #message = json.dumps(event, indent = 4,ensure_ascii=False)
    message = MESSAGE
    for DST_MAIL,atesaki in zip(newadd,newname):
        message = atesaki + MESSAGE
        r = send_email(SRC_MAIL, DST_MAIL, email, message)
        print(DST_MAIL)
    return r

参考

結果

無事、「XX様」がメアドに対応する名前になった文面のメールを送ることができました

かかった時間

7時間強くらい

なおしたいところ

  • メールの文面直書きじゃなくて読み込みにしたい
  • もっと簡単にデータ取り出せそうなので、今度試す

追記:メール文面をtxtファイル読み込みに変更。変数で名前とかアドレスとか日付とか入れられるようにした。
誤送が怖いので、読み込んだ要素を入れたlistのlengthを比較して、違ったら強制終了するようにした。

    if len(newname) == len(newadd) and len(newname) == len(newdate) and len(newname) == len(newtime) :
        print("要素数が合っています")
        print(newname,newadd,newdate,newtime)

    else :
        print("要素数が合いません、確認してください")
        sys.exit(1)

結局公式サイトが一番参考になる話。BCCの設定が書いてあるブログが見当たらなかったけど、普通に書いてあった。

 Destination={
        'ToAddresses': [
            'string',
        ],
        'CcAddresses': [
            'string',
        ],
        'BccAddresses': [
            'string',
        ]
    },