概要

Azure Functions から SendGrid を使用してメール送信するサンプルを記載する。
尚、関数アプリは Azure Functions を Go で書く で作成したものをベースとする為、当記事の実装は Go となる。

目次

SendGird アカウントの登録

登録方法による FREEプランの利用枠の違い

Azure Marketplace からと 日本公式サイトから登録できるが、登録方法によってFREEプランの利用枠が異なる。

登録先FEEプランの利用枠
Marketplace25,000通/月
日本公式サイト400通/日

https://sendgrid.kke.co.jp/blog/?p=2621

日単位と月単位で紛らわしいが、Marketplace から登録する方が2倍近くの量を送信できる。

Marketplace から SendGird アカウント登録

Azure ポータルで検索バーから SendGrid Accounts を検索。
sendgrid_setup01.png

[追加] を押下。
sendgrid_setup02.png

アカウント情報を入力して登録。(とりあえずFREEプランで)
sendgrid_setup03.png

Azure ポータルの SendGrid Accounts から Manage を押下。
sendgrid_setup04.png

確認メールを送るか聞かれるのでボタンを押下。
sendgrid_setup05.png

こんな感じのメールが届くのでボタンを押下。
sendgrid_setup06.png

利用準備

SendGrid API キーの作成/確認

Send Grid 側の管理画面から API Keys を押下。
sendgrid_setup07.png

Create API Key を押下。
sendgrid_setup08.png

APIキー名を入力して、[Create & View]を押下。
sendgrid_setup09.png

APIキーが画面に表示されるので、メモしておく。
sendgrid_setup10.png

goパッケージインストール

SendGrid公式の Go パッケージをインストールしておく。

go get github.com/sendgrid/sendgrid-go

実装

基本的な実装は Azure Functions を Go で書く と変わらないので、以下メール送信部分のみ抜粋して記載する。

[補足]
複数の宛先に送信する実装を以下の公式サイトを参考に実装しようとしたが、
最新版では構成が微妙に変わっているらしく、ビルドが通らなかった為、GitHubのソース を参考に実装した。

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)
    }   
}

:
{
    "IsEncrypted": false,
    "Values": {
      "AzureWebJobsStorage": "UseDevelopmentStorage=true",
       :
      "SENDGRID_API_KEY": "上記で取得したSendGridのAPIキー",
      "MAIL_FROM_NAME": "送信者名",
      "MAIL_FROM_ADDRESS": "送信者のメールアドレス",
      "MAIL_TO_ADDRESSES": "送信先アドレス1,送信先アドレス2,送信先アドレス3"
    }   
}

添付ファイル: filesendgrid_setup10.png [詳細] filesendgrid_setup09.png [詳細] filesendgrid_setup08.png [詳細] filesendgrid_setup07.png [詳細] filesendgrid_setup05.png [詳細] filesendgrid_setup06.png [詳細] filesendgrid_setup04.png [詳細] filesendgrid_setup03.png [詳細] filesendgrid_setup02.png [詳細] filesendgrid_setup01.png [詳細]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-08-28 (金) 00:44:34 (25d)