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

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

はじめに

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

前提条件

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

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

準備

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

git clone git@github.com:SendGridJP/sendgridjp-go-example.git

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

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

.envファイルを編集(後述)したら、サンプルを実行します。

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 (
	"fmt"
	"log"
	"os"
	"strings"
	"io/ioutil"
	"encoding/base64"

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

func main() {

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

	// .envから環境変数読み込み
	API_KEY := os.Getenv("API_KEY")
	TOS := strings.Split(os.Getenv("TOS"), ",")
	FROM := os.Getenv("FROM")

	// メッセージの構築
	message := mail.NewV3Mail()
	// 送信元を設定
	from := mail.NewEmail("", FROM)
	message.SetFrom(from)

	// 1つ目の宛先と、対応するSubstitutionタグを指定
	p := mail.NewPersonalization()
	to := mail.NewEmail("", TOS[0])
	p.AddTos(to)
	p.SetSubstitution("%fullname%", "田中 太郎")
	p.SetSubstitution("%familyname%", "田中")
	p.SetSubstitution("%place%", "中野")
	message.AddPersonalizations(p)

	// 2つ目の宛先と、対応するSubstitutionタグを指定
	p2 := mail.NewPersonalization()
	to2 := mail.NewEmail("", TOS[1])
	p2.AddTos(to2)
	p2.SetSubstitution("%fullname%", "佐藤 次郎")
	p2.SetSubstitution("%familyname%", "佐藤")
	p2.SetSubstitution("%place%", "目黒")
	message.AddPersonalizations(p2)

	// 3つ目の宛先と、対応するSubstitutionタグを指定
	p3 := mail.NewPersonalization()
	to3 := mail.NewEmail("", TOS[2])
	p3.AddTos(to3)
	p3.SetSubstitution("%fullname%", "鈴木 三郎")
	p3.SetSubstitution("%familyname%", "鈴木")
	p3.SetSubstitution("%place%", "中野")
	message.AddPersonalizations(p3)

	// 件名を設定
	message.Subject = "[sendgrid-go-example] フクロウのお名前は%fullname%さん"
	// テキストパートを設定
	c := mail.NewContent("text/plain", "%familyname% さんは何をしていますか?\r\n 彼は%place%にいます。")
	message.AddContent(c)
	// HTMLパートを設定
	c = mail.NewContent("text/html", "<strong> %familyname% さんは何をしていますか?</strong><br>彼は%place%にいます。")	
	message.AddContent(c)

	// カテゴリ情報を付加
	message.AddCategories("category1")
	// カスタムヘッダを指定
	message.SetHeader("X-Sent-Using", "SendGrid-API")
	// 画像ファイルを添付
	a := mail.NewAttachment()
	file, _ := os.OpenFile("./gif.gif", os.O_RDONLY, 0600)
	defer file.Close()
	data, _ := ioutil.ReadAll(file)
	data_enc := base64.StdEncoding.EncodeToString(data)
	a.SetContent(data_enc)
	a.SetType("image/gif")
	a.SetFilename("owl.gif")
	a.SetDisposition("attachment")
	message.AddAttachment(a)

	// メール送信を行い、レスポンスを表示
	client := sendgrid.NewSendClient(API_KEY)
	response, err := client.Send(message)
	if err != nil {
		log.Println(err)
	} else {
		fmt.Println(response.StatusCode)
		fmt.Println(response.Body)
		fmt.Println(response.Headers)
	}
}

解説

23~26行目

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

34~59行目

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

61~68行目

メールの件名と本文(text/plainおよびtext/html)を設定しています。「%fullname%」「%familyname%」「%place%」というSubstitutionタグを埋め込んでいます。

70~84行目

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

86~95行目

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

実行結果

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

宛先1で受信したメール

宛先1で受信したメール

宛先2で受信したメール

宛先2で受信したメール

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

さいごに

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

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

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

参考

その他の機能の使い方については、リポジトリに含まれるサンプルコードをご確認ください。

メールを成功の原動力に

開発者にもマーケターにも信頼されているメールサービスを利用して、
時間の節約、スケーラビリティ、メール配信に関する専門知識を手に入れましょう。