1
5

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 3 years have passed since last update.

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

Last updated at Posted at 2021-07-13

筆者のレベル感は

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

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

#やりたいこと

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

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

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

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

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

#メール配信の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
    

参考

#結果
無事、「XX様」がメアドに対応する名前になった文面のメールを送ることができました
スクリーンショット 2021-07-14 1.56.56.png

#かかった時間
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',
        ]
    },
    
1
5
0

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
1
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?