メールサービスのSendGridを触ってみました。今回はSendGridのメール送信の機能について書いていきます。
SendGridでメールを送信するにはSMTPを使うSMTP APIとHTTPを使うWeb APIの2つの方法があります。
SMTP APIで送信
SMTPのプロトコルを使ってSendGridに情報を伝達する方式で、X-SMTPAPIという独自ヘッダを使うことで送信メールのカテゴリやトラッキング用の任意の属性をセットしたり、受信者に応じたパーソナライズをすることができます。X-SMTPAPI以外は通常のSMTPを使ったメール送信になるので、OutlookやThunderbird等の任意のメーラーを使ったメール送信ができるのが利点です。
SMTPのホストには”smtp.sendgrid.net”、ポート番号は25, 465, 587が利用可能です。ユーザ名、パスワードはSendGridのクレデンシャルをそれぞれ設定するだけでOKです。詳細はリファレンスを参照。
X-SMTPAPIヘッダについて
送信するメールの属性値をセットしたり受信者に応じたパーソナライズをすることができるSendGridのSMTP独自拡張ヘッダになります。ヘッダの値は以下のようなJSONになります。
{
"category": [
"HogeCategory"
],
"unique_args": {
"hoge_key": "fuga_value"
},
"sub": {
"%key%": [
"hello"
]
},
"send_at": 1439813847
}
この場合は送信するメールのカテゴリを”HogeCategory”、トラッキング用の変数としてHOGE_KEY=fugavalue、本文に”%key%“という文字列があれば”hello”に置き換えて、unixtimestampで1439813847の時間になったらメールを送信する、という設定になります。 X-SMTPAPIのリファレンスはこちら。
ちなみにWeb APIでもX-SMTPAPIの設定をすることが可能です。
SMTP APIのサンプル
Python+SMTP APIで送信してみます。PythonのSendGrid SMTP APIのライブラリであるsendgrid/smtpapi-pythonを使います。X-SMTPAPIヘッダのJSON生成を補助してくれるライブラリになります。サンプルは以下になります。
from smtpapi import SMTPAPIHeader
import smtplib
from email.MIMEText import MIMEText
import time
host = 'smtp.sendgrid.net'
port = 587
user = '******@kke.com'
passwd = '******'
server = smtplib.SMTP(host, port)
server.set_debuglevel(1)
server.starttls()
server.login(user, passwd)
# building base SMTP values
from_addr = 'hoge@example.com'
to_addrs = ['fuga@hogehoge.com']
body = 'Test Body %key%'
message = MIMEText(body)
message['From'] = from_addr
message['To'] = ",".join(to_addrs)
message['Subject'] = 'Test Subject'
# building X-SMTPAPI header
header = SMTPAPIHeader()
header.add_category('HogeCategory')
header.add_substitution('%key%', 'hello')
header.add_unique_arg('hoge_key', 'fuga_value')
header.set_send_at(int(time.time()+60))
message['X-SMTPAPI'] = header.json_string()
server.sendmail(from_addr, to_addrs, message.as_string())
server.quit()
Web APIで送信
HTTPで送信する方式になります。以下のようなHTTPリクエストを投げることでメールを送信できます。
$ curl -X POST https://api.sendgrid.com/api/mail.send.json \
-d api_user=****@kke.com \
-d api_key=****** \
-d to=to@example.com \
-d subject=HogeSubject \
-d text=TextBody \
-d from=from@example.com \
-d headers={"X-HogeHoge":"FugaFuga"}
リファレンスにPlay Groundもあるので、確認する際はそちらでリクエスト/レスポンスを確認するのが楽です。
また、ファイルを添付する場合は、multipart/form-data形式で送信する必要があります。