Goでメール送信!SendGridを使って簡単に実装する方法

GoからSendGrid公式ライブラリを使ってメールを送る方法

はじめに

最近、SendGridはGoをメインの開発言語として使用することを発表しましたが、今回はGoからSendGrid公式ライブラリを使ってメールを送信する方法をサンプルコードを交えながらご紹介します。メール文面(件名、本文)への文字列埋め込み、日本語、添付ファイルなどを利用しています。

前提条件

サンプルコードを試す前に以下の環境のセットアップを完了しておいてください。
・go
・git
SendGridアカウント

本記事の内容はUbuntu上に環境構築したものです。なお、SendGrid公式ライブラリ(sendgrid-go)はバージョン2.0.0を使用しています。

準備

コードサンプルをリポジトリからクローンします。

git clone https://github.com/sendgridjp/sendgridjp-go-example.git

リポジトリ内に移動して.env.exampleをコピーします。

cd sendgridjp-go-example
cp .env.example .env

.envファイルを編集(後述)します。

サンプルを実行するために、2つの環境変数(GOROOTおよびGOPATH)を設定します。
GOPATHにはクローンしたリポジトリのパスを指定します。

cat "export GOROOT=/usr/local/go" >> ~/.profile
cat "export GOPATH=/root/go/sendgridjp-go-example" >> ~/.profile
source ~/.profile

依存関係の解決を行います。

go get github.com/sendgrid/sendgrid-go
go get github.com/joho/godotenv

サンプルを実行します。

go run src/main/main.go

.envファイルの編集

.envファイルは以下のような内容になっています。

API_KEY=api_key
TOS=you@youremail.com,friend1@friendemail.com,friend2@friendemail.com
FROM=you@youremail.com
  • API_KEY
    SendGridのAPI Key(Mail SendへのFULL ACCESSパーミッションが必要)を指定してください。
  • TOS
    宛先をカンマ区切りで指定してください。サンプルコードの関係上、宛先は3つ以上指定してください。
  • FROM
    送信元アドレスを指定してください。

メール送信サンプルコード

今回使用したサンプルコードを以下に示します。

package main

import (
    "os"
    "fmt"
    "strings"
    "log"
    "github.com/sendgrid/sendgrid-go"
    "github.com/joho/godotenv"
)

func main() {

    err_read := godotenv.Load()
    if err_read != nil {
        log.Fatalf("error: %v", err_read)
    }


    API_KEY := os.Getenv("API_KEY")
    TOS := strings.Split(os.Getenv("TOS"), ",")
    FROM := os.Getenv("FROM")

    email := sendgrid.NewMail()
    email.SMTPAPIHeader.SetTos(TOS) // 宛先はこちらで指定したものが使用される
    email.AddTo(FROM)               // 実際には使用されない。エラー回避のため記載。
    email.SetFrom(FROM)
    email.SetFromName("送信者名")
    email.SetSubject("[sendgrid-go-example] フクロウのお名前はfullnameさん")
    email.SetText("familyname さんは何をしていますか?rn 彼はplaceにいます。")
    email.SetHTML("<strong> familyname さんは何をしていますか?</strong><br />彼はplaceにいます。")
    sub := make(map[string][]string)
    sub["fullname"] = []string{"田中 太郎", "佐藤 次郎", "鈴木 三郎"}
    sub["familyname"] = []string{"田中", "佐藤", "鈴木"}
    sub["place"] = []string{"office", "home", "office" }
    email.SetSubstitutions(sub)
    email.AddSection("office", "中野")
    email.AddSection("home", "目黒")
    email.AddCategory("category1")
    file, _ := os.OpenFile("./gif.gif", os.O_RDONLY, 0600)
    email.AddAttachment("gif.gif", file)
    defer file.Close()

    sg := sendgrid.NewSendGridClientWithApiKey(API_KEY)
    if r := sg.Send(email); r == nil {
        fmt.Println("Email sent!")
    } else {
        fmt.Println(r)
    }
}

解説

14~22行目

環境変数からSendGridの認証情報、送信元アドレス、宛先リストを読み込んでいます。

25〜28行目

宛先リスト、送信者名、送信元アドレスを設定しています。宛先を複数指定しても配信されたメールの宛先には他の宛先が見えることはありません。受信者のアドレスのみ設定されます。
また、複数の宛先を指定した場合でも送信リクエストは1回となるため、大量の宛先に対して高速に送信処理要求を送ることが可能です。宛先リストは最大で10,000アドレスまで指定可能です。

29~31行目

メールの件名と本文(text/plainおよびtext/html)を設定しています。「fullname」「familyname」「place」というSubstitutionタグ(後述)と、「office」「home」というSectionタグ(後述)を埋め込んでいます。尚、タグでスペースは使用できません。

32~36行目

Substitutionタグに対応する配列を設定しています。Substitutionタグは宛先ごとに件名、本文に文字列を埋め込むための機能です。sub配列に設定した値が25〜27行目で指定した各宛先に対応しています。

37〜38行目

Sectionタグで置換する文字列を設定しています。Sectionタグは対応する文字列に置換されます。複数箇所に同じ文字列を埋め込みたい場合に使用します。

39~42行目

カテゴリ、添付ファイルを設定しています。カテゴリを指定しておくと、カテゴリごとにメール配信に関わる統計情報を取得することができるようになります。

44~49行目

メールを送信して結果を出力しています。

実行結果

各宛先には次のようなメールが配信されます。
宛先には、自分のみが設定されていることがわかります。
Substitutionタグ、Sectionタグがそれぞれ指定した文字列に置換されていることが確認できます。

宛先1で受信したメール

宛先1で受信したメール

宛先2で受信したメール

宛先2で受信したメール

送信元アドレスに「sendgrid.info経由」と表示されているのはDomain Whitelabelを設定していないためです。正しく設定することで独自ドメインからメールを送信したように表示することができます。

さいごに

SendGrid公式ライブラリを利用すると、複雑なSMTPプロトコルに触れることなく簡単にメール送信を行うことができます。文字の埋め込みやカテゴリ指定なども簡単です。
また、バウンス時の処理や配信停止の管理、送信ドメイン認証の設定などもSendGridに任せることができるので、開発工数を大幅に削減することができます。

SendGridのフリートライアル(無期限)へのお申込みはこちらから。

その他の言語については、メール送信チュートリアル【まとめ】 をご覧ください。