概要
Amazon SESを用いたメール送信について書きます。
業務用のメールアドレスなのでgmailよりは自分のドメインを持ったメールアドレスにしておいたほうが良いでしょう。ということで独自ドメインを取得したらメールアドレスもそこで受け取れるようにしておいて、かつ送信も出来るようにします。ここでは送信専用として
noreply@独自ドメイン名
のメールアドレスを準備するとして進めます。
なお、SESはリージョンに東京がありません。今回はオレゴンを選択しています。
IAM
IAMグループに紐付ける権限は
AmazonSESFullAccess
をつけておけばいいでしょう。
SES
メールを自分とユーザの両方に飛ばします。スマホアプリの様にPush通知をするならSNSですが今回はPCも対応したいのと記録のためにメール送信としたいため、SESを用いることにしました。
全体的な流れは
で解説されているとおりです。
設定
操作方法は
に倣います。
- SES Home(Domains)にアクセス
- Verify a New Domainをクリック
- 独自ドメインなりメール送信に利用したいドメインを入力して、Generate DKIM Settingsにチェックし、Verify This Domainをクリック
ここまでで下画像の表示がされるので、指示に従って続きを進めます。
やることの概要としては、ドメインの発行元のDNSに、画像の中の設定(TXTレコード, CNAME, MXレコード)を追加しろと書いてあります。例えばお名前.comでドメインを取得したなら、お名前.comのドメインNaviから設定を入れてやればいいわけです。
その代わりにここでRoute 53にRecord Setを追加してやることで、ドメイン取得元に代わってSESでメールを受け取ることが出来るようになります。今回はSESでメールのやり取りをするので、上記画像ダイアログでUse Route 53をクリック。
→→※ただしこの場合はドメイン取得元でメールアドレスを受け取れなくなってしまいます。設定する場合は(英語ですが)説明文を注意深く読んでからやること。
チェックボックス全てにチェックが入っていることを確認して、Create Record Setsをクリック。
するとSESのDomainsにドメインが追加されたはずです。ただし今はまだpendingの状態です。この状態で数分待つとverifiedに変わります。筆者は30分くらい待ってやっと全部verifiedになりました。。
同時に、Route 53のHosted zoneを見ると確かにMXレコード等が追加されていますね。
次ですが受信ルールはRule SetsのCreate a Recipt Ruleから作ります。
ここではドメインを入力して、次にEdit RuleでRule Setを設定するのですが、ここでは送信だけしたいので、特に触れません。
次に送信専用のメールアドレスを設定します。
に従います。
さっき認証が完了したドメインをクリックして出て来るMail From Domainをクリック→Set Mail From Domainをクリック。
Mail From Domain: 認証済みドメインのサブドメインとしての名前をつけます。
Behavior if MX Record not found: Reject messageを選択
Set Mail From Domain
Publish Records Using Route 53をクリックしてMX, TXTレコードをRoute 53へ作成
SPFレコードにはチェックを入れず、他はチェックを入れてCreate Record Sets
これも数分(数十分?)かかるので待ちましょう。
※ドメイン名がバッティングしてるとRoute 53にMXは作成されないので注意!作成時にエラーが出ないので、verifiedになる気配がなかったら、一度Route 53の設定を見てみると良いです。
SPF不要なのは
とかで解説されています。
サンドボックスからの脱出
SESをスタートしたばかりの時点ではサンドボックスの中にいるのでその制限を外してやります。
これ用にIAMは
SupportUser
があると良いでしょう。
テストメール送信も、これが完了してないと成功しないっぽいので、いち早く完了させてやるべきです。
に従います。応答があるまでしばらく時間がかかるので、その間は別の作業をするべし。
自分の場合は夜に申請して翌朝見たらサンドボックスから外しました的なメールが来ていてすぐにメール送信出来るようになりました。
SESでテスト送信
サンドボックスからの脱出が終わったら、Domainsから該当のドメインをチェックしてSend a Test Emailをクリックして、宛先を自分のアドレスにして送信してみましょう。エラーなく届くはずです。
Lambdaでテスト送信
これができればいよいよ好きな内容のメールを送れるようになります。
ただし、下記の通り、Lambda関数作成時に専用のroleを作成していると思います。このroleにはSESのSendEMail実行権限がないので、怒られます。
ということでIAM Roleのポリシーを修正します。Lambdaで使用中のroleをIAMのAWS Console→ロールから探して、ポリシー名をクリック→ポリシードキュメントを編集して、"Action"の配列に"ses:SendEmail", "ses:SendRawEmail"もしくは"ses: *"を追加して保存しましょう。
設定が終わった後Testで送信すればエラーなく送信できるはずです。まずは自分宛てのメールを送信して試してみましょう。
S3にメール本文を配備
メール本文はコード上にあってもいいと思いますが、見やすさと再利用性のため分けたほうがbetterです。というのと上記スライドにある通り、添付ファイルとか容量の問題が出るためです。
というわけで配備しましょう。
配備するメール本文のファイルの形式をCloudFrontのBehaviorに設定するのも忘れずに!
それとメールはアップロードするだけでなく公開してないと読み込めません。
Lambdaと連携
API Gateway → Lambda → SESの連携をうまくやっている例は
が分かりやすかったです。
宛先、Subjectなどは入力値や内部で用意した文字列を使って埋めていきます。
自分宛てに送信してみましょう。SESから送った場合、Lambdaに処理を書いて直接送った場合と同様、画面からAPIを叩いて送信出来るところまで確認できればOK。
動的なメッセージを送るには?
本文を動的に書き換える、例えば予約フォームに入れた氏名をメール本文に出したい場合はどうするか?といったものです。これは本文をS3に保存してLambdaで取り出して一部を書き換えて送信すればOK。
書き換えたいパラメータを何かしら分かりやすい変数名など埋め込んで用意し、Lambda内でbodyを読み込んで書き換えます。
Lambda(Python)からS3オブジェクトを取得するサンプルは
が参考になります。
他には、HTMLメールとプレーンテキストメールどちらも送信出来るみたいですが、相手が受け付けているかわからないし、ここでは特に触れません。
SNSとかSQSも触って見たかったけど、今作ろうとしているサービスでは必要ないので、いったんこんな感じで締めくくります。