筆者のレベル感は
- 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でメールを送信する
が実現できれば、とりあえず動くはず。
自分の書き方があんまイケてないのは分かる。
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様」がメアドに対応する名前になった文面のメールを送ることができました
#かかった時間
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',
]
},