Web APIかSMTPリレーか: どうやってメールを送ればいいの?
この記事は Web API or SMTP Relay: How Should You Send Your Email? の抄訳です。
SendGrid経由でメールを送信したり、SendGridとシステムをインテグレートするときは、Web APIやSMTPリレーを用います。これら2つの手法の違いは、荷物を配達する方法の違いになぞらえることができます。荷物は郵送することもできますし、届け先まで自分で持っていくこともできますね。配達の方法は違えど、結果は同じ。荷物が届くわけです。
Web API
SendGridのWeb APIではHTTP経由でメールを送信します。SendGridにメールの送信リクエストを投げて、HTTP応答コード200が返ってきたら、そのメッセージはSendGridに受理されたということです。一方、400や500などが返ってきたら、何か異常が起きてSendGrid側でリクエストを処理できなくなったことを意味します。
すべてがうまくいったら、SendGridはリクエストを処理して宛先のISPに送ります。このISPは250か500番台のSMTP応答コードを返して、メールが受理されたかどうかをSendGridに伝えます。これは、荷物を郵便ポストに入れたら、それを郵便局員が確認して届け先に配達するプロセスに似ていますね。
注意 : 受信側のISPがSMTP応答コード250を返してきても、メールが受信トレイに届くことが保証されているわけではありません。SMTP応答コード250は、ISPが宛先アドレスが有効だと判断してメッセージを受理したことを意味するだけです。その後、ISPは受理したメールを受信トレイに入れるべきか、迷惑メールフォルダに入れるべきか、それとも保留すべきかを判断します。
SMTP応答コードについてもっと知りたい方は、「SMTP応答コードの基礎知識」をご覧ください。
SMTP リレー
SMTPリレーでメールを送るためには、Web APIに比べて、より多くのメッセージのやり取りが必要になります。配達のたとえ話で言えば、SMTPリレーは荷物を自分自身で運ぶ方法に近いでしょう。なぜなら、荷物を届けるためには、ポストに投函するよりも更にいろいろなことをやらなければならないからです。送信者がSMTPを利用してSendGridに接続する場合は、SendGridから受信側のISPにメッセージを送る前に、送信者とSendGridの間で個別の情報を複数やりとりしなければなりません。
SMTPを利用する場合、SendGridはメッセージの他に、DNSや認証情報も逐次的にチェックする必要があります。これらのチェック処理はそれぞれが個別に、うまくいった場合に応答コード250を、また何か異常が起きた場合に400番台か500番台のコードを返します。SendGridと受信側ISPの間にも、これと同様のやりとりが発生し、これらのやりとりが完了してはじめて、受信側のISPはメールを配信するか、ブロックするか、または迷惑メールフォルダに入れるかを決定できるのです。
SMTPリレーの詳細については、ブログ記事「SMTPとメール」をご参照ください。
結局どっちがいいの?
SMTP接続では余分な「おしゃべり」が必要になるので、もし可能であればWeb APIのご利用をお勧めいたします。具体的な理由は以下のとおりです。
- SMTPリレーでは複数の潜在的な障害点ができてしまい、送信者とSendGrid間で異常コードが発生し得る場所が増えてしまいます。
- Web APIの方が高速です。SMTPの余分なやり取りのせいで、インバウンドデータセンターから遠い場所からリクエストする場合は(ごく僅かではありますが)遅延が生じる可能性があります。
- SMTPリレーと同様にWeb APIでもAPIキーを利用することができるので、あなたのプログラムにもう一段高いセキュリティ設定を付加することがきます。APIキーを使うとユーザ名とパスワードのセットとは独立した認証情報を生成でき、あなたのアカウントが乗っ取られて迷惑メールやフィッシングメールを送信されてしまう可能性が極めて低くなります。
とは言うものの、SMTPはメールの業界標準ですし、全世界で用いられています。Web APIはSendGridの創業者がSendGridのシステムに効率よくアクセスするために作ったもので、すべてのユーザに適した方法とは言えないかもしれません。SMTPリレーはまた、既存のCRMシステムやOutlookのようなメールクライアントから利用できます。Web APIは、多くの場合、自身のプロダクトを開発する開発者に利用されています。
SendGridの各種ツールや機能については、SendGridの日本語ドキュメントをご覧ください。