SendGrid(Web API v3)でメール配信(Golang)

サンプルコード

SendGridでよく利用するテキストメール/HTMLメール/テンプレートを利用したメール配信のサンプルコードです。
テキストメール/HTMLメールを分けていますが、両方mail.SGMailV3.AddContentする事でマルチパートメールにする事も可能です。
※ 実行するには環境変数(SENDGRID_API_KEY、SENDGRID_TEMPLATE_ID)が必要です。

package main

import (
    "log"
    "os"

    "github.com/sendgrid/sendgrid-go"
    "github.com/sendgrid/sendgrid-go/helpers/mail"
)

var MailClient *sendgrid.Client

func init() {
    MailClient = sendgrid.NewSendClient(os.Getenv("SENDGRID_API_KEY"))
}

type User struct {
    Name  string
    Email string
}

func (user *User) GetPersonalization() *mail.Personalization {
    personalization := mail.NewPersonalization()
    personalization.AddTos(user.GetEmail())
    return personalization
}

func (user *User) GetEmail() *mail.Email {
    return mail.NewEmail(user.Name, user.Email)
}

func GetUsers() []*User {
    return []*User{
        &User{
            Name:  "User1",
            Email: "user1@example.com",
        },
        &User{
            Name:  "User2",
            Email: "user2@example.com",
        },
    }
}

func NewMail(from *mail.Email) *mail.SGMailV3 {
    message := mail.NewV3Mail()
    message.SetFrom(from)
    return message
}

func SendMail(message *mail.SGMailV3) {
    response, err := MailClient.Send(message)
    if err != nil {
        log.Println(err)
    } else {
        log.Println(response.StatusCode)
        log.Println(response.Body)
        log.Println(response.Headers)
    }
}

func main() {
    from := mail.NewEmail("FromName", "from@example.com")
    users := GetUsers()

    // テキストメールの配信
    plainTextMail := NewMail(from)
    plainTextMail.Subject = "Sample Text Mail"
    textContent := mail.NewContent("text/plain", "こんにちは、%name% さん!")
    plainTextMail.AddContent(textContent)

    for _, user := range users {
        personalization := user.GetPersonalization()
        personalization.SetSubstitution("%name%", user.Name)
        plainTextMail.AddPersonalizations(personalization)
    }

    SendMail(plainTextMail)

    // HTMLメールの配信
    htmlMail := NewMail(from)
    htmlMail.Subject = "Sample HTML Mail"
    htmlContent := mail.NewContent("text/html", "こんにちは、<strong> %name% </strong>さん!")
    htmlMail.AddContent(htmlContent)

    for _, user := range users {
        personalization := user.GetPersonalization()
        personalization.SetSubstitution("%name%", user.Name)
        htmlMail.AddPersonalizations(personalization)
    }

    SendMail(htmlMail)

    // SendGridのDynamicTemplateを利用したメールの配信
    templateMail := NewMail(from)
    templateMail.TemplateID = os.Getenv("SENDGRID_TEMPLATE_ID") // Subject,Contentはテンプレートで指定

    for _, user := range users {
        // テンプレート内で展開する変数の定義
        data := make(map[string]interface{})
        data["name"] = user.Name

        personalization := user.GetPersonalization()
        personalization.DynamicTemplateData = data
        templateMail.AddPersonalizations(personalization)
    }

    SendMail(templateMail)
}

Reply-to(返信先)を指定したい

送信元とは別のメールアドレスに返信させたい場合はReply-toを指定します。

replyTo := mail.NewEmail("ReplyToName", "reply@example.com")
plainTextMail.SetReplyTo(replyTo)
SendMail(plainTextMail)

ファイルを添付したい

ファイルを添付する場合は*mail.Attachmentにファイルのデータを設定してAddAttachmentすることで添付できます。

attachment := mail.NewAttachment()
file, _ := os.OpenFile("./0123.jpeg", os.O_RDONLY, 0600)
defer file.Close()
data, _ := ioutil.ReadAll(file)
dataEnc := base64.StdEncoding.EncodeToString(data)
attachment.SetContent(dataEnc)
attachment.SetType("image/jpeg")
attachment.SetFilename("image.jpeg")
attachment.SetDisposition("attachment")
plainTextMail.AddAttachment(attachment)
SendMail(plainTextMail)