Go
AWS
ses
aws-sdk

AWS SDK Golang×SESでのメール送信 using SendBulkTemplatedEmail


はじめに

AWS SDK GolangとSESで、SESのテンプレートを使いつつ一括メール送信する設定をしたので記録として残しておきます。


Go×SESでメール送信

まずは以下の記事を参考に、プログラム上で設定したメッセージ文言でメール送信できることを確認しました。

この時点ではテンプレートは使用していません。

AWS SDKを使ってGolangからSES経由でメールを送る


メールテンプレート対応

SESテンプレートを登録し、メール送信時のSESのAPIとしてsendMailではなくSendBulkTemplatedEmailを呼び出すようにしていきます。


SESにテンプレート登録

SESテンプレートはAmazon SES API を使用してパーソナライズされた E メールを送信するの手順に従って登録しました。

上記手順に記載されているのと全く同じテンプレートを登録してみました。


SendTemplateEmailを使うようコードを編集

SES-APIのドキュメントを見つつ編集。

package main

import (
"errors"
"log"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ses"
)

func main() {
from := "from@example.jp"
template := "MyTemplate"
defaultTemplateData := "{ \"name\":\"\", \"favoriteanimal\":\"\" }"

// メール送信先
destinations := []*ses.BulkEmailDestination{
{
Destination: &ses.Destination{
ToAddresses: aws.StringSlice([]string{"to1@example.jp"}),
},
ReplacementTemplateData: aws.String("{ \"name\":\"太郎\", \"favoriteanimal\":\"ペンギン\" }"),
},
{
Destination: &ses.Destination{
ToAddresses: aws.StringSlice([]string{"to2@example.jp"}),
},
ReplacementTemplateData: aws.String("{ \"name\":\"次郎\", \"favoriteanimal\":\"あひる\" }"),
},
}

err := SendEmail(from, template, destinations, defaultTemplateData)
if err != nil {
log.Println("mail sending error")
}
log.Println("mail was sent!")
}

func SendEmail(from string, template string, destinations []*ses.BulkEmailDestination, defaultTemplateData string) error {
sess := session.Must(session.NewSession())
svc := ses.New(sess)
input := &ses.SendBulkTemplatedEmailInput{
DefaultTemplateData: aws.String(defaultTemplateData),
Destinations: destinations,
Source: aws.String(from),
Template: aws.String(template),
}
_, err := svc.SendBulkTemplatedEmail(input)
if err != nil {
return errors.New(err.Error())
}
return nil
}

これでテンプレートを使ってメール送信できました。

このコードでは送付先のアドレスやテンプレート内で動的に変える値を直接記述していますが、実際には”// メール送信先”とコメントを入れているあたりで、DBから取得した値をそれぞれに設定することになるイメージです。


However

テンプレートの日本語記載がメールにおいて文字化けする、という問題が未解決なので、解決したら追記します。