Azure Functions から SendGrid を使用してメール送信するサンプルを記載する。
尚、関数アプリは Azure Functions を Go で書く で作成したものをベースとする為、当記事の実装は Go となる。
Azure Marketplace からと 日本公式サイトから登録できるが、登録方法によってFREEプランの利用枠が異なる。
登録先 | FEEプランの利用枠 |
Marketplace | 25,000通/月 |
日本公式サイト | 400通/日 |
※ https://sendgrid.kke.co.jp/blog/?p=2621
日単位と月単位で紛らわしいが、Marketplace から登録する方が2倍近くの量を送信できる。
Azure ポータルで検索バーから SendGrid Accounts を検索。
[追加] を押下。
アカウント情報を入力して登録。(とりあえずFREEプランで)
Azure ポータルの SendGrid Accounts から Manage を押下。
確認メールを送るか聞かれるのでボタンを押下。
こんな感じのメールが届くのでボタンを押下。
Send Grid 側の管理画面から API Keys を押下。
Create API Key を押下。
APIキー名を入力して、[Create & View]を押下。
APIキーが画面に表示されるので、メモしておく。
SendGrid公式の Go パッケージをインストールしておく。
go get github.com/sendgrid/sendgrid-go
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", : "SENDGRID_API_KEY": "上記で取得したSendGridのAPIキー", "MAIL_FROM_NAME": "送信者名", "MAIL_FROM_ADDRESS": "送信者のメールアドレス", "MAIL_TO_ADDRESSES": "送信先アドレス1,送信先アドレス2,送信先アドレス3" } }
基本的な実装は Azure Functions を Go で書く と変わらないので、以下メール送信部分のみ抜粋して記載する。
package main import ( "fmt" "log" "os" "strings" "github.com/sendgrid/sendgrid-go" "github.com/sendgrid/sendgrid-go/helpers/mail" ) : func sendmail(subject string, messages []string, result string) { API_KEY := os.Getenv("SENDGRID_API_KEY") senderName := os.Getenv("MAIL_FROM_NAME") senderMail := os.Getenv("MAIL_FROM_ADDRESS") recipients := strings.Split(os.Getenv("MAIL_TO_ADDRESSES"), ",") messageText := "" messageHtml := "" for _, s := range messages { messageText = fmt.Sprintf("%s%s\n", messageText, s) messageHtml = fmt.Sprintf("%s%s<br />", messageText, s) } if result != "SUCCESS" { messageHtml = fmt.Sprintf("<div style='color: #f00'>%s</div>", messageHtml) } from := mail.NewEmail(senderName, senderMail) email := mail.NewV3Mail() email.SetFrom(from) email.Subject = subject p := mail.NewPersonalization() for _, s := range recipients { fmt.Printf("name: %s\n", s) to := mail.NewEmail(s, s) p.AddTos(to) } email.AddPersonalizations(p) textContent := mail.NewContent("text/plain", messageText) htmlContent := mail.NewContent("text/html", messageHtml) email.AddContent(textContent, htmlContent) client := sendgrid.NewSendClient(API_KEY) response, err := client.Send(email) if err != nil { log.Println(err) } else if response.StatusCode == 202 { log.Printf("info: Mail sended. Status=%d", response.StatusCode) } else { log.Printf("error: status %d", response.StatusCode) log.Printf("error: header %v", response.Headers) log.Printf("error: body %s", response.Body) } } :