2019年9月13日金曜日

Golang言語でAWS SESを介してメールを送信する方法

Golangで開発したウェブアプリケーションからメール送信機能が必要になりました。インフラはAWS上にあるので、AWS SES(Simple Email Service)を使うことにしました。AWS SESサービスの開始から、Golangで送信までの手順をまとめてみました。

SESサービスを開始

AWSのSimple Email Serviceコンソール画面を開きます。
最初はリージョン選択になります。日本リージョンがないので、3つから任意の一つを選びます。

ドメイン認証

左メニュー「Domains」/「Verify a New Domain」順にドメイン認証画面を開きます。
自分のドメインを入力し、「Generate DKIM Settings」もチェックします。

確認画面の「Use Route 53」ボタンをクリックします。

Use Route 53画面の「Create Record Sets」ボタンをクリックします。
※一つ注意してほしいのは、もし「Email Receiving Record」にチェックを入れたら、MXタイプのレコードが全部上書きされることになります。回避するにはここでチェックを外して、Route 53の管理画面から手動でレコードを追加することです。

Route53の管理画面に、対象ドメインに先程のレコードが追加されたことを確認できます。
そのまましばらく待つと、認証ステータスが「verified」に変わります。

「FROM Domain」の設定

FROMドメインを設定しないと、メールの送信元はamazonses.comとなってしまいます。以下の手順で自分のドメインに変えられます。
「Domains」/「対象ドメイン名」/「MAIL FROM Domain」/「Set MAIL FROM Domain」の順にクリックします。
FROMドメインの設定画面に、MAIL FROMドメインの名前を入力します。例:info
そして、「Use amazonses.com as MAIL FROM」をチェックします。

次の画面に、「Publish Records Using Route 53」ボタンをクリックします。

更に次のUse Route 53画面に、「MX Record」と「SPF Record」にチェックを入れて、「Create Record Sets」ボタンをクリックします。

前のステップと同じくしばらく待つと、ステータスが「pending verification」から「verified」に変わります。

最後、サンドボックスの外への移動

サンドボックスから"脱出"するに、上限申請が必要です。
「Sending Statistics」/「Request a Sending Limit Increase」の順に申請画面に移動します。

申請する上限数のところに、自分の負荷に応じで必要な数値を入力します。
申請後1日、2日を待ってば処理されます。

ちなみに、申請が通りまでに、テストメールを送信すると、以下のエラーが起きます。

Email address is not verified. The following identities failed the check in region US-EAST-1: test@gmail.com (Request ID: 32301551-966e-462e-bdab-6a23ef58f6a4)


最後、Golangで送信する

まず、以下の4つのパッケージをインストール

  go get github.com/aws/aws-sdk-go/aws
  go get github.com/aws/aws-sdk-go/aws/credentials
  go get github.com/aws/aws-sdk-go/aws/session
  go get github.com/aws/aws-sdk-go/service/ses
次に、メールを送信(送信部分のソースコードのみ)
awsAccessKey := "awsのアクセスキー"
awsSecretKey := "awsのシークレットキー"
awsSession := session.New(&aws.Config{
Region:      aws.String("us-east-1"),
Credentials: credentials.NewStaticCredentials(awsAccessKey, awsSecretKey, ""),
})
client := ses.New(awsSession)
input := &ses.SendEmailInput{
Destination: &ses.Destination{
ToAddresses: []*string{
aws.String("送信先のメールアドレス"),
},
},
Message: &ses.Message{
Body: &ses.Body{
Text: &ses.Content{
Charset: aws.String("UTF-8"),
Data:    aws.String("メール本文"),
},
},
Subject: &ses.Content{
Charset: aws.String("UTF-8"),
Data:    aws.String("メール件名"),
},
},
Source: aws.String("送信元のメールアドレス"),
}
_, err := client.SendEmail(input)

0 件のコメント:

コメントを投稿