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

筆者のレベル感は

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

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

#やりたいこと

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

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

https://dev.classmethod.jp/articles/bulk-email-ses-lambda/


#SESで送信元メールアドレスを登録
ここはうまくいった。方法はネットに溢れているので割愛

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

| userId(PK)  | name  | emailAddress |
|:-:|:-:|:-:|
|   1|太郎   |  test1@XXX.com  |
|   2| 花子  |  test2@XXX.com  |




https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/SQLtoNoSQL.ReadData.SingleItem.html#SQLtoNoSQL.ReadData.SingleItem.DynamoDB

#メール配信の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 = "test@example.com" 
#送信先
#DST_MAIL = "test@example.com"
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
    
```



参考

https://qiita.com/UpAllNight/items/a15367ca883ad4588c05

https://zenn.dev/yumiyoshi/scraps/f2373d9cacd5fc

#結果
無事、「XX様」がメアドに対応する名前になった文面のメールを送ることができました
![スクリーンショット 2021-07-14 1.56.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1760697/dbf93b97-4fcd-4838-a595-3c25c6261222.png)


#かかった時間
7時間強くらい

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

https://recipe.kc-cloud.jp/archives/10420

追記：メール文面を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の設定が書いてあるブログが見当たらなかったけど、普通に書いてあった。

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ses.html#SES.Client.send_email
    
```
 Destination={
        'ToAddresses': [
            'string',
        ],
        'CcAddresses': [
            'string',
        ],
        'BccAddresses': [
            'string',
        ]
    },
    
```