Lambdaからメール送信するためにちょっと調べたのでメモ。
ちなみに、最終的にSNSを使用することにしたのでSESはおまけとなっています。
#料金
https://aws.amazon.com/jp/sns/pricing/
https://aws.amazon.com/jp/ses/pricing/
#アジアパシフィック (東京)ありなし
SNS:あり
SES:なし (米国東部 (バージニア北部)、EU (アイルランド)、米国西部 (オレゴン) のみ)
#送信元メールアドレスの事前登録
SNS:不要。(no-reply@sns.amazonaws.com
から送られる)
SES:必要。
#送信先メールアドレスの事前登録
SNS:必要。
SES:不要。
SESについて補足:
不正使用や悪用を防止などのため、新しいAmazon SES アカウントには一定の制限が適用される。
そのため、規制緩和のリクエストが必要。
詳しくは以下を参照。
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/request-production-access.html
#添付ファイル
SNS:不可
SES:可
※SESが扱えるEメールメッセージのサイズは最大10MB
メッセージの一部である画像や添付ファイルも含まれる。
#HTML形式のメール
SNS:不可
SES:可
#Amazon SNSを使用したメール送信
##トピック/サブスクリプション作成
###マネジメントコンソールの場合
Simple Notificationa Serviceのコンソールを開き「今すぐ始める」を押す。
以下を入力し、「トピックの作成」を押す。
・「トピック名」
・「表示名」(省略可)
以下を入力し、「サブスクリプションの作成」を押す。
・「プロトコル」:Email
・「エンドポイント」:送信先メールアドレス
エンドポイントに指定したメールアドレス宛に確認メールが送信される。
メールを確認し「Confirm subscription」を押す。
マネジメントコンソールからトピックへの送信確認。
「トピックに発行」を押す。
以下を入力し「メッセージの発行」を押す。
・「件名」
・「メッセージ」
###AWSCLIの場合
AWSCLIを使用した場合、
送信されるメールにある配信停止のリンクを無効化できるので合わせてメモ。
$ aws sns create-topic --name test-topic --attributes DisplayName="表示名" --profile dev
{
"TopicArn": "arn:aws:sns:ap-northeast-1:<アカウントID>:test-topic"
}
トピック作成で返却されたTopicArnを使用してコマンドを作成し実行する。
$ aws sns subscribe --topic-arn arn:aws:sns:ap-northeast-1:<アカウントID>:test-topic --protocol email --notification-endpoint <メールアドレス> --profile dev
{
"SubscriptionArn": "pending confirmation"
}
メールが送信される。
メール内容の確認リンク(赤枠)は押さずに右クリックから「リンクのアドレスをコピー」する。
↓メールからコピーしたリンク内容。
https://sns.ap-northeast-1.amazonaws.com/confirmation.html?TopicArn=arn:aws:sns:ap-northeast-1:<アカウントID>:test-topic&Token=<トークン>&Endpoint=<メールアドレス>
コピーした内容の「TopicArn」と「Token」を使用してコマンドを作成し実行する。
上記例の場合
TopicArn:arn:aws:sns:ap-northeast-1:<アカウントID>:test-topic
Token:<トークン>
$ aws sns confirm-subscription --topic-arn arn:aws:sns:ap-northeast-1:<アカウントID>:test-topic --token <トークン> --authenticate-on-unsubscribe true --profile dev
{
"SubscriptionArn": "arn:aws:sns:ap-northeast-1:<アカウントID>:test-topic:480f6607-f69a-494a-a8aa-cb7b4af54500"
}
無効化することで配信停止リンクを押しても、アンサブスクライブ出来なくなる。
(配信停止リンクは残存)
##Lambda関数作成
使用するポリシー:AmazonSNSFullAccess、AWSLambdaBasicExecutionRole
import boto3
def lambda_handler(event, context):
sns_client = boto3.client('sns')
sns_client.publish(
TopicArn='arn:aws:sns:ap-northeast-1:<アカウントID>:test-topic',
Subject='テストメール',
Message='メール送信メッセージ',
)
return "ok"
#Amazon SESを使用したメール送信
##Eメールのセットアップ
###マネジメントコンソールの場合
アジアパシフィック (東京)がないのでリージョンを変更する。
「Verify a New Email Address」を押す。
以下を入力し「Verify This Email Address」を押す。
・「EmailAddress」:送信元メールアドレス
###AWSCLIの場合
$ aws ses verify-email-identity --email-address <送信元メールアドレス> --profile dev --region us-east-1
※返却値は特になし
指定したメールアドレスに検証用のメールが送信されるので、
マネジメントコンソールの場合と同様にリンクを押し検証を完了する。
##Lambda関数作成
使用するポリシー:AmazonSNSFullAccess、AWSLambdaBasicExecutionRole
import boto3
from botocore.exceptions import ClientError
def lambda_handler(event, context):
SENDER = "Sender Name <test@testtest.jp>"
RECIPIENT = "test@testtest.jp"
AWS_REGION = "us-east-1"
SUBJECT = "テストメール送信"
CHARSET = "UTF-8"
client = boto3.client('ses',region_name=AWS_REGION)
BODY_HTML = """<html>
<head></head>
<body>
<h1>Amazon SES Test (SDK for Python)</h1>
<p>テストメール</p>
</body>
</html>
"""
try:
response = client.send_email(
Source=SENDER,
Destination={
'ToAddresses': [
RECIPIENT,
],
},
Message={
'Subject': {
'Charset': CHARSET,
'Data': SUBJECT
},
'Body': {
'Html': {
'Charset': CHARSET,
'Data': BODY_HTML
}
}
}
)
except ClientError as e:
print(e.response['Error']['Message'])
else:
print("Email sent! Message ID:"),
print(response['MessageId'])
#おまけ
##AWSCLIの事前準備(設定)
AWSCLIのコマンドで使用している--profile dev
はAWSCLIで使用する認証情報を指定しています。
IAMユーザに関連付けられているAWS Access Key ID、AWS Secret Access Keyを使用して設定します。
(AWS Access Key ID、AWS Secret Access Keyはマネジメントコンソールから作成可能)
設定例
$ aws configure --profile dev
AWS Access Key ID [None]: <アクセスキー>
AWS Secret Access Key [None]: <シークレットアクセスキー>
Default region name [None]: ap-northeast-1
Default output format [None]: json
SESではリージョンが設定した値と違うため、コマンドライン上で以下を指定しています。
・ --region us-east-1
#SNS参考
https://docs.aws.amazon.com/ja_jp/sns/latest/dg/welcome.html
https://aws.amazon.com/jp/sns/faqs/
https://docs.aws.amazon.com/cli/latest/reference/sns/create-topic.html
https://docs.aws.amazon.com/cli/latest/reference/sns/subscribe.html
https://docs.aws.amazon.com/cli/latest/reference/sns/confirm-subscription.html
https://dev.classmethod.jp/cloud/aws/amazon-sns-disable-unsubscribe-link/
#SES参考
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/Welcome.html
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/send-using-sdk-python.html
https://aws.amazon.com/jp/ses/faqs/
https://dev.classmethod.jp/cloud/aws/lambda-to-ses/
https://docs.aws.amazon.com/ses/latest/DeveloperGuide/verify-email-addresses-procedure.html
https://docs.aws.amazon.com/cli/latest/reference/ses/verify-email-identity.html
#AWSCLI参考
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html