LoginSignup
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-10-28

はじめに

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

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

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
3