Golang でメールを送信する - SMTP & Email Sending API

Customers Mail Cloudではメール送信に際して、SMTPとAPIの二種類を提供しています。昔からの使い慣れたSMTPを使っても良いですし、SMTPのポート制限されている場合でも使えるAPIを利用しても良いでしょう。

今回はこの二つのメール送信方法について、Golang(Go)から利用する方法を紹介します。

APIユーザを作成する

API設定画面にて、APIユーザを作成します。アクセス権限として、SMTPは必須になります。API経由での配信を行う場合はSMTPに加えて、HTTP-APIも有効にしてください。

f:id:moongift:20190524133446p:plain

SMTPを使ったメール送信について

標準ライブラリだけで実装します。SMTPサーバのアドレスは指定されたものに置き換えてください。まず必要なライブラリを読み込みます。

import (
    "log"
    "bytes"
    "net/smtp"
    "strings"
    "encoding/base64"
)

続いてSMTP認証情報を提供するオブジェクトを作ります。これは smtp.PlainAuth を使います。この認証情報は先ほど作成したAPIユーザ名とAPIキーになります。

auth := smtp.PlainAuth(
    "",
    "api@smtps.jp",
    "YOUR_API_KEY",
    "sandbox.smtps.jp")

次にメール送信先、件名、本文を定義します。件名がmsgの中に定義されることに注意してください。

toAddress := "test@smtps.jp"
to := []string{toAddress}
msg := []byte("Subject: " + encodeSubject("日本語の件名") + "\r\n" +
    "\r\n" +
    "日本語の本文\r\n")

そしてメールを送信します。これは smtp.SendMail を実行します。SMTPサーバのアドレスとポートは管理画面で指定されるものを使ってください。

// メール送信
err := smtp.SendMail(
    "sandbox.smtps.jp:10025",
    auth,
    "info@smtps.jp",
    to,
    msg)
if err != nil {
    log.Fatal(err)
}

なお、日本語の件名については文字化け防止処理を行っています(encodeSubject)。この処理はgo で utf8メールを送信 - Qiitaのコードをお借りしました。

これでSMTP経由でのメール送信が完了します。

API経由でのメール送信について

APIサーバについて

APIサーバのエンドポイントURLは契約しているプランによって異なりますのでご注意ください。

プラン名 エンドポイントURL
無料トライアル https://sandbox.smtps.jp/api/v2/emails/send.json
Standardプラン https://te.smtps.jp/api/v2/emails/send.json
Proプラン https://SUBDOMAIN.smtps.jp/api/v2/emails/send.json

SUBDOMAINは、サービス利用開始時に申請いただいたものです

構造体を作成する

APIにはJSONを送信します。そのための構造体を用意します。JSON全体を表すのがSendMailです。

type SendMail struct {
  ApiUser string `json:"api_user"`
  ApiKey  string `json:"api_key"`
  To   []MailAddress `json:"to"`
  From MailAddress `json:"from"`
  Subject string `json:"subject"`
  Text    string `json:"text"`
}

メールアドレス部分だけを表すのがMailAddressです。

type MailAddress struct {
  Name string `json:"name"`
  Address string `json:"address"`
}

配信内容は先ほどの構造体を使って定義します。

to := MailAddress{
    Name: "Test User",
    Address: "test@smtps.jp",
}
from := MailAddress{
    Name: "Admin",
    Address: "info@smtps.jp",
}
mail := &SendMail{
  ApiUser: "api@smtps.jp",
  ApiKey: "YOUR_API_KEY",
  From: from,
  To: []MailAddress{to},
  Subject: "日本語",
  Text: "本文",
}

そして構造体を json.Marshal を使ってJSON文字列にします。

jsonBytes, err := json.Marshal(mail)
if err != nil {
  return err.Error()
}

JSONの内容については 共通仕様 | Customers Mail Cloud を参照してください。

送信を行う

ではAPIサーバのエンドポイントURLと配信情報のパラメータを使ってメール送信を行います。メール送信APIはPOSTメソッドを使います。HTTPアクセスは net/http を使います。JSON文字列にするjsonも読み込みます。

import (
    "net/http"
    "encoding/json"
    "io/ioutil"
)

HTTPメソッドとヘッダーの定義をし、HTTPリクエストオブジェクトを作成します。

req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonBytes))
req.Header.Set("Content-Type", "application/json")

そしてHTTPリクエストを実行します。

client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
    panic(err)
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)

送信が成功すると、下記のようにメールIDが返ってきます。

{"id":"\u003C1003630265.17240.1562219702628@mta01.sandbox.smtps.jp\u003E"}

エラーがあると、下記のようにエラー内容が返ってきます。

{"errors":[{"code":"02-001","field":"text","message":"text is required."}]}

まとめ

サーバ上の制限によってSMTPが使えない場合でもHTTP経由でメール配信が行えますので、APIをぜひ使ってみてください。今回はGo(Golang)を使いましたが、汎用的なHTTPアクセスを行っていますので、他のプログラミング言語でも簡単に実装できるでしょう。

さらに詳しい使い方についてはEmail Sending APIを参照してください。