SMTP経由のメール送信
SMTP (Simple Mail Transfer Protocol)は、インターネット上でメールを送信するために広く使用されている信頼性の高い標準通信プロトコルです。NTT CPaaS SMTP APIは、メールを送信するための安全でスケーラブルなインターフェイスを提供することにより、SMTPの上に構築されています。
このセクションでは、SMTP APIと統合し、SMTP経由でメールを送信する方法に関する包括的なガイドを提供します。
SMTP APIとの統合
SMTP APIと統合するには、該当するSMTPサーバー情報が必要です。次の表は、各地域によって分かれている、SMTPサーバーとポート番号で使用可能なエンドポイントを示しています。
地域 | SMTPサーバー | ポート |
---|---|---|
ヨーロッパ | smtp-api.infobip.com | 587、465 |
イギリス | smtp-api-gb1.infobip.com | 587、465 |
インド (ムンバイ) | smtp-api-mum.infobip.com | 587、465 |
インドネシア | smtp-api-id.infobip.com | 587、465 |
中東・北アフリカ | smtp-api-ae2.infobip.com | 587 |
パキスタン | smtp-api-pk2.infobip.com | 587 |
カタール | smtp-api-qa1.infobip.com | 587 |
サウジアラビア | smtp-api-sa2.infobip.com | 587 |
トルコ | smtp-api-tr1.infobip.com | 587 |
米国 | smtp-api-us.infobip.com | 587、465 |
Schrems II に準拠するには、使用可能な標準ポート (587または 465) のいずれかで smtp-api-eu.infobip.com を使用します。
ポート587を使用する場合、明示的なSTARTTLS
コマンドが必要であるのに対し、ポート465を介した接続は、TLSハンドシェイクがすでに完了していることを意味します。TLS通信は、どのポートでも必須 です。
SMTP認証
SMTP認証 (SMTP AUTH) は、許可されたユーザーのみがNTT CPaaS SMTP APIを介してメールを送信できるようにします。SMTP AUTHは、メッセージ送信を許可する前に有効な資格情報を適用することで、不正アクセスやサーバーの悪用を防ぐのに役立ちます。
NTT CPaaS SMTPは、PLAIN およびLOGIN 認証メカニズムをサポートしています。
- PLAIN - ユーザー名とパスワードを1つのBase64エンコード文字列で送信します。
- LOGIN - ユーザー名とパスワードを個別に送信し、それぞれBase64文字列としてエンコードします。
認証資格情報は、次の2つの方法で送信できます:
- 基本認証 - NTT CPaaSアカウントのユーザー名とパスワードを使用します。
- APIキー認証 - ユーザー名は常に App で、パスワードはNTT CPaaSアカウントで作成されたAPIキーです。
どちらの場合も、ユーザー名とパスワードは Base64でエンコードされた 文字列として送信する必要があります。
OpenSSLなどの一部のライブラリでは、文字Qが行の最初の文字として挿入されると、接続が終了する場合があります。これは、base64で QXBw
にエンコードされ、結果的にQで始まることになるAppなどのbase64でエンコードされたユーザー名を使用する場合に問題を引き起こす可能性があります。
この問題を回避するには、OpenSSL で-quiet
オプションを使用するか、ユーザー名を入力する前に行を1つ以上の空白スペースで開始します。
APIキーの使用法の詳細については、API認証 について詳述しているドキュメントをご参照ください。
サポートされているSMTPコマンド
NTT CPaaSのSMTPサーバーは、次のコマンドをサポートしています:
SMTPコマンド | 説明 |
---|---|
HELP | サポートされているSMTPコマンドとその使用法に関する情報を返します。 |
HELO | 新しいSMTPセッションを開始します。 クライアントのドメイン名またはホスト名を使って、SMTPサーバーと接続するクライアントを識別します。標準のSMTPで使用されます。 |
EHLO | 拡張 SMTP (ESMTP) セッションを開始します。 サーバーに接続するクライアントを識別し、サーバーがサポートするESMTP拡張機能の一覧をリクエストします。 |
STARTTLS | 既存のSMTP接続をアップグレードして、安全な通信のためにTLS(Transport Layer Security)を使用します。 |
AUTH | ユーザー名とパスワードを使用して、サーバーに接続するクライアントを認証します。 PLAIN とLOGIN の認証メカニズムがサポートされています。 |
MAIL | 送信者のメールアドレス (エンベロープ送信元) を指定します。 FROM パラメーターに加えて、SIZE パラメーターはメールのサイズをアナウンスするためにも使用されます。 新しいメールトランザクションの送信プロセスを開始します。 |
RCPT | 受信者のメールアドレス (Envelope Toとも呼ばれます) を指定します。 メッセージの各受信者 (To、Cc、Bcc) に使用されます。 受信者が複数いる場合は、アドレスごとにコマンドが繰り返されます。 |
DATA | メールの内容 (ヘッダーと本文)の始まりを伝達します。 サーバーは 354 で応答し、クライアントにメッセージデータを送信するように求めます。 データは <CRLF>.<CRLF> を含む1行で終わります。 |
RSET | 現在のメールトランザクションをリセットし、指定された送信者または受信者をクリアしますが、SMTP接続は開いたままにします。 |
QUIT | SMTPセッションを終了し、接続を閉じます。 |
NOOP | ヘルスチェックを行います。 |
DATA
セクション内のTo およびCc ヘッダーに含まれているすべてのメールアドレスは、SMTPトランザクション中にRCPT
コマンドを使用して受信者として指定されることが推奨されていますが、RFCでは厳密には要求されていません。
RCPT
を介して提供されたアドレスのみが実際にメッセージを受信しますが、ヘッダー内のアドレスだけでは受信できません。
オプションのカスタムヘッダー
カスタムヘッダーを使用すると、送信SMTPメールに追加情報を含めることができます。次の表に、メール通信で使用されるカスタム ヘッダー名の一覧を示します。
ヘッダー名 | 説明 |
---|---|
X-IB-Bulk-Id | 送信されたバルクを一意に識別するIDです。このフィルターを使用すると、クライアントは1つのリクエストだけで、すべてのメッセージの配信レポートを照会できます。 |
X-IB-Callback-Data | X-IB-Notify-Url で送信される追加のクライアントデータです。 |
X-IB-Intermediate-Report | クライアントのコールバックサーバーで送信されるリアルタイムの中間配信レポートです。 |
X-IB-Notify-Content-Type | 希望する配信レポートのコンテンツタイプです。application/json または application/xml を指定できます。 |
X-IB-Notify-Url | 配信レポートが送信されるクライアントのコールバック サーバー上のURLです。 |
X-IB-Tracking-Url | 開封とクリック通知が送信されるクライアントのコールバックサーバー上のURLです。 詳細については、トラッキング通知 について詳述しているドキュメントをご参照ください。 |
NTT CPaaS SMTP APIとの統合のセットアップ
ここでは、NTT CPaaS SMTP APIとの統合プロセスについて説明します:
- セキュアな接続を開く -NTT CPaaS SMTPサーバーへのセキュアな接続を確立します。
- 新しいSMTPセッションを開始する - メールの送信プロセスを開始する新しいセッションを立ち上げます。
- SMTP接続を認証する - 接続を認証してSMTPサーバーにアクセスするための資格情報を入力します。
- エンベロープを定義する - 送信者と受信者のメールアドレスを指定して、メールエンベロープを設定します。
- メッセージの内容を送信する - SMTPサーバーを介してメールの内容を送信し、受信者にメッセージを配信します。
次のセクションでは、手順について詳しく説明します。
セキュアな接続を開く
openssl
を使って、smtp-api.infobip.com への新しいSMTP接続を開始します。ポート587に接続し、コマンドプロンプトで次のように入力して、セキュアなコミュニケーションをリクエストします:
openssl s_client -connect smtp-api.infobip.com:587 -starttls smtp -quiet
-quiet
オプションを使用すると、入力する内容に特殊文字が含まれている場合でも接続は開いたままにしておけます。例えば、Q文字が含まれている入力の場合、このオプションを使用しないと、接続は閉じられてしまいます。
このコマンドで問題が発生した場合は、-crlf
オプションを使用してみてください。これにより、Enter キーを押すと強制的に改行されます。一部のサーバーでは、これが必要になる場合があります。
例えば:
openssl s_client -crlf -connect smtp-api.infobip.com:587 -starttls smtp -quiet
サーバーは、証明書に関する情報を含む、末尾が250 OK
で終わる応答を返します。
新しいSMTPセッションを開始する
EHLO
コマンドを使ってクライアントをNTT CPaaS SMTPサーバーに紹介し、ESMTPセッションを開始します。このコマンドはまたサーバーに対して、サポートされているSMTP拡張機能のリストを返すように促します。
EHLO <client_hostname>
NTT CPaaS SMTPサーバーは、サポートされているSMTP拡張機能のリストを含む、末尾が250 OK
で終わる応答を返します。 例えば:
250-smtp.email-messaging.com
250-8BITMIME
250-SIZE 20971520
250-STARTTLS
250-AUTH LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-PIPELINING
250 OK
SMTPセッションを認証する
許可されたユーザーのみがNTT CPaaS SMTP APIを介してメールを送信できるようにするには、SMTP認証 を使用する必要があります。
LOGIN
認証メカニズムによって認証プロセスを開始します。- 次に、
AUTH LOGIN
コマンドをSMTPサーバーに送信します。 - その後、サーバーはユーザー名とパスワードを順番に入力するように求め、認証が成功裏に終わると、確認が取れたことを応答します。
次の点にご留意ください:
- SMTPサーバーは、Base64でエンコードされたユーザー名のプロンプトとして
334 VXNlcm5hbWU6
を応答します。Base64でエンコードされたユーザー名を入力します。 - SMTPサーバーは、Base64でエンコードされたパスワードのプロンプトとして
334 UGFzc3dvcmQ6
を応答します。Base64でエンコードされたパスワードを入力します。
ユーザー名とパスワードの資格情報が有効な場合、NTT CPaaS SMTPサーバーは235 2.7.0 Authentication successful
と応答します。
エンベロープを定義する
認証が完了したら、送信者と受信者のアドレスを指定して エンベロープ を定義します。
- 送信者アドレスを指定するには、
MAIL
コマンドを使用します:MAIL FROM: <sender_address>
- オプションで、
MAIL
コマンドにSIZE
パラメーターを含めて、メッセージサイズをバイト単位で宣言できます:MAIL FROM: <sender_address> SIZE=number_of_bytes
SIZE
パラメーターを使用すると、サーバーはメッセージを処理できるかどうかを即時にチェックします。メッセージサイズが最大許容限度を超えると、サーバーはメッセージが大きすぎると応答します。SIZE
パラメーターを組み込まない場合、このチェックは、後でDATA
コマンドの実行中に実際のメッセージ内容で行われます。- 送信者が受け入れられると、NTT CPaaS SMTPサーバーは
250 2.1.0 Sender <sender_address> OK
と応答します。 - 受信者を指定するには、
RCPT
コマンドを使用します:RCPT TO: <recipient_address>
- 受信者が複数いる場合は、受信者ごとに
RCPT
コマンドを繰り返します。 - 受信者が受け入れられると、NTT CPaaS SMTPサーバーは
250 2.1.5 Recipient <recipient_address> OK
と応答します。 - エンベロープアドレスを正常に送信したら、
DATA
コマンドを使ってメッセージの内容を送信したいことをアナウンスするプロセスに進みます。
SMTPトランザクションあたりの受信者の最大数は、1000人に制限されています。
コマンドのパイプライン処理
NTT CPaaS SMTPサーバーは、コマンドのパイプライン処理 をサポートしています。
パイプラインなしでSMTPコマンドを使用する場合、クライアントとサーバー間の対話はリクエスト-レスポンスのサイクルに従います。クライアントは、各コマンドの後にサーバーの応答を待ってから、次のコマンドを送信する必要があります。
パイプライン処理により、クライアントは、各コマンドに対するサーバーの応答を待たずに、MAIL
、RCPT
、およびDATA
コマンドを同時に送信できます。このアプローチにより、トランザクションあたりの往復数と遅延が大幅に削減されます。サーバーは、送信された各コマンドまたはアドレスに対して明確で説明的な応答を提供します。
次の例は、パイプラインを使用しない場合とパイプラインを使用する場合のコマンドの順序とサーバーの応答を示しています。
パイプラインなし | パイプラインあり |
---|---|
クライアント→MAIL FROM: <sender_address> サーバー → 250 2.1.0 Sender <sender_address> 0K クライアント→ RCPT TO: <recipient_address> サーバー → 250 2.1.5 Recipient <recipient_address> 0K クライアント→ RCPT TO: <blacklisted_address> サーバー → 550 5.7.1 Recipient <blacklisted_address> not allowed クライアント→ RCPT TO: <invalid_address> サーバー → 501 5.1.7 Bad recipient address ‹invalid_address› クライアント → DATA サーバー→ 354 End data with <CR><LF>.<CR><LF> | クライアント→MAIL FROM: <sender_address> クライアント→ RCPT TO: <recipient_address> クライアント→ RCPT TO: <blacklisted_address> クライアント→ RCPT TO: <invalid_address> クライアント → DATA サーバー → 250 2.1.0 Sender <sender_address> 0K サーバー → 250 2.1.5 Recipient <recipient_address> 0K サーバー → 550 5.7.1 Recipient <blacklisted_address> not allowed サーバー → 501 5.1.7 Bad recipient address <invalid_address> サーバー→ 354 End data with <CR><LF>.<CR><LF> |
新しい SMTP コマンド<CRLF>を .<CRLF>
シーケンス。代わりに、セッションを終了するか、新しいメッセージトランザクションを開始する前に、メールの内容の終了を確認するサーバーの応答を待ちます。
メッセージ内容の送信
DATA
コマンドを送信することで、メッセージ内容の送信をリクエストできます。以前に送信したエンベロープアドレスとすべてが一致している場合、サーバーは次のように応答します:
354 End data with <CR><LF>.<CR><LF>
サーバーからステイタスコード354の応答を受信したら、メッセージ内容のMIMEバージョン (以下「MIMEコンテンツ」) を送信できるようになります。
許容される未加工メールのMIMEメッセージの最も単純な例を以下で示します:
From: "Sender Name" <sender@example.com>
To: recipient@example.com
Subject: Simple subject
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="example_boundary"
--example_boundary
Content-Type: text/plain; charset="utf-8"
This is the plain text content.
--example_boundary--
これは、フル機能のMIME例です:
Subject: Fully Featured SMTP Example
From: "Sender Name" <sender@example.com>
Reply-To: reply-to@example.com
To: recipient_1@example.com, recipient_2@example.com
Cc: recipient_cc@example.com
Message-ID: <custom-message-id@example.com>
X-IB-Bulk-Id: 1234567890
X-IB-Tracking-Url: https://www.example.com/email/webhook/server
X-IB-Intermediate-Report: true
X-IB-Notify-Url: https://www.example.com/email/delivery/server
X-IB-Notify-Content-Type: application/json
X-IB-Callback-Data: [{"id": 1, "desc": "Callback Data Example as JSON"}]
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary="example_boundary"
--example_boundary
Content-Type: text/html; charset=UTF-8
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<p>Hello world from Infobip! Happy testing :)</p>
<img src="cid:pixel_cid" alt="Pixel as the inline image">
</body>
</html>
--example_boundary
Content-Type: image/png
Content-Id: <pixel_cid>
Content-Disposition: inline; filename="pixel.png"
Content-Transfer-Encoding: base64
iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mPkT1GpBwACOQEYP+FHpAAAAABJRU5ErkJggg==
--example_boundary
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="simple.pdf"
Content-Transfer-Encoding: base64
JVBERi0xLjEKMSAwIG9iajw8L1R5cGUvQ2F0YWxvZy9QYWdlcyAyIDAgUj4+ZW5kb2JqCjIgMCBvYmo8PC9UeXBlL1BhZ2VzL0tpZHMgWzMgMCBSXS9Db3VudCAxPj5lbmRvYmoKMyAwIG9iajw8L1R5cGUvUGFnZS9QYXJlbnQgMiAwIFIvTWVkaWFCb3hbMCAwIDMwMCAyMF0vQ29udGVudHMgNCAwIFIvUmVzb3VyY2VzPDwvRm9udDw8L0YwIDUgMCBSPj4+Pj4+ZW5kb2JqCjQgMCBvYmo8PC9MZW5ndGggNjM+PnN0cmVhbQpCBiAwIFRMIDAgMCAxMCAxMCAwIDAKL0YwIDEyIFRmCjI1IDAgVGQKKCJTaW1wbGUgUERGIC0gRnVsbHkgRmVhdHVyZWQgU01UUCIpIFRqCkUKZW5kc3RyZWFtCmVuZG9iago1IDAgb2JqPDwvVHlwZS9Gb250L1N1YnR5cGUvVHlwZTEvTmFtZS9GMC9CYXNlRm9udC9IZWx2ZXRpY2EvRW5jb2RpbmcvV2luQW5zaUVuY29kaW5nPj5lbmRvYmoKeHJlZgowIDYKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMTAwIDAwMDAwIG4gCjAwMDAwMDA2MDggMDAwMDAgbiAKMDAwMDAwMTcyOSAwMDAwMCBuIAowMDAwMDAxOTMxIDAwMDAwIG4gCnRyYWlsZXI8PC9Sb290IDEgMCBSL1NpemUgNj4+CnN0YXJ0eHJlZgoyMDQxCiUlRU9GCg==
--example_boundary--
メッセージの終了を知らせるには、<CRLF>.<CRLF>
MIME コンテンツの後。メッセージが受け入れられると、NTT CPaaS SMTP APIは 250 2.6.0 メッセージがキューに登録されました<message_id>
で応答します 。
SMTPセッションを終了し、接続を閉じるには、QUIT
コマンドを送信します。
<message_id>
は、NTT CPaaS SMTP API によって受け入れられた各メッセージに割り当てられる一意の識別子です。配信レポートを取得する場合は、<message_id>
を使用して、どのレポートがどの元のメッセージに属しているかを識別します。
NTT CPaaS SMTP APIは、エンベロープ送信元
ドメインと ヘッダー送信元
ドメインの間で緩やかな配置チェック (ルートドメインの照合) を行います。