Cloudflare Email Service は、認証済み SMTP 送信エンドポイントを公開します。SMTP を話す任意のアプリケーション、フレームワーク、既製メールクライアントからメールを送れます。REST API や Workers バインディング が適さないときに SMTP を使います。たとえば、すでに SMTP を話す既存アプリケーションや、言語ネイティブの SMTP ライブラリ(Nodemailer、smtplib、PHPMailer、JavaMail)と連携するときです。
SMTP 経由で送信したメールは、REST API および Workers バインディングと同じ配信パイプラインに入ります。同じ 制限 が適用され、同じ DKIM と ARC 署名を受け、同じ配信ログを出します。
smtp.mx.cloudflare.net:465| 設定 | 値 |
|---|---|
| ホスト | smtp.mx.cloudflare.net |
| ポート | 465 |
| セキュリティ | Implicit TLS(SMTPS とも呼ばれます) |
SMTP AUTH |
PLAIN または LOGIN |
| ユーザー名 | リテラル文字列 api_token |
| パスワード | Cloudflare API トークン(下記参照) |
Cloudflare が提供する SMTP 送信は、ポート 465 の implicit TLS のみです。平文 SMTP、ポート 587 の opportunistic STARTTLS、ポート 25 の未認証リレーは、送信には使えません。ポート 25 は、Email Routing への受信メール用に予約されています。
SMTP でメールを送る前に、次が必要です。
- Email Sending が有効なアカウント。
- Cloudflare ダッシュボードの Email Service > Email Sending で オンボード済みのドメイン が 1 つ以上あること。
- Email Sending: Edit 権限を持つ Cloudflare API トークン。アカウント所有(推奨)とユーザー所有のトークンの両方を受け付けます。トークンは SMTP パスワードとして使います。
このトークンは認証情報として扱います。持っている人は、一致するアカウント上のオンボード済みドメインからメールを送れます。
curl コマンド 1 つでメールを送信します。<API_TOKEN> を Email Sending: Edit 権限のある Cloudflare API トークン に置き換え、--mail-from と --mail-rcpt のアドレスも自分のものに置き換えます。
cat > mail.txt <<EOF
From: welcome@yourdomain.com
To: recipient@example.com
Subject: Welcome to our service!
Thanks for signing up.
EOF
curl --ssl-reqd \
--url "smtps://smtp.mx.cloudflare.net:465" \
--user "api_token:<API_TOKEN>" \
--mail-from "welcome@yourdomain.com" \
--mail-rcpt "recipient@example.com" \
--upload-file mail.txt送信元ドメイン(welcome@yourdomain.com)は、API トークンを所有するアカウントで Email Sending にオンボードされている必要があります。
Cloudflare の SMTP エンドポイントは、RFC 4954 ↗ で定義された 2 つの SASL メカニズムに対応します。
AUTH PLAIN— 推奨。1 往復です。RFC 4616 ↗。AUTH LOGIN— レガシーの draft-murchison-sasl-login ↗。古いクライアントとの互換性のために対応しています。
どちらの場合も、ユーザー名はリテラル文字列 api_token、パスワードは Cloudflare API トークンです。
AUTH PLAIN は \0api_token\0<API_TOKEN> を base64 でエンコードして送ります。
printf '\0api_token\0%s' "<API_TOKEN>" | base64次のトランスクリプトは、openssl s_client を使った認証済み送信の全体です。> で始まる行はクライアントが送ります。
$ openssl s_client -quiet -connect smtp.mx.cloudflare.net:465 -crlf
220 mx.cloudflare.net Cloudflare Email ESMTP Service ready
> EHLO client.example.com
250-mx.cloudflare.net greets client.example.com
250-AUTH PLAIN LOGIN
250-SIZE 5242880
250-8BITMIME
250 ENHANCEDSTATUSCODES
> AUTH PLAIN AGFwaV90b2tlbgBpd0RQLi5oZWw=
235 2.7.0 Authentication successful
> MAIL FROM:<welcome@yourdomain.com>
250 2.1.0 Ok
> RCPT TO:<recipient@example.com>
250 2.1.5 Ok
> DATA
354 Start mail input; end with <CR><LF>.<CR><LF>
From: welcome@yourdomain.com
To: recipient@example.com
Subject: Welcome
Thanks for signing up.
.
250 2.0.0 Ok <jZTWt0pQO4p2LG7ByfkeSYUvT62k85Q12nCA@yourdomain.com>
> QUIT
221 mx.cloudflare.net Cloudflare Email ESMTP Service closing transmission channelメッセージ本文のあとの 250 2.0.0 Ok 応答には、通常、割り当てられた Message-ID が含まれます。ダッシュボードの配信ログと送信を突き合わせるときに使います。
Drop suppressed recipients がオンで、すべての受信者が配信停止対象の場合、SMTP は Message-ID なしで 250 2.0.0 Ok を返し、配信しないことがあります。配信停止された受信者 を参照してください。
言語別の例(curl、Nodemailer、Python smtplib、PHPMailer)は、SMTP でメールを送る を参照してください。
SMTP 送信には、次のセッション単位の制限が適用されます。
| 制限 | 値 |
|---|---|
RCPT TO 受信者 |
セッションあたり 50 |
EHLO で広報される SIZE |
5 MiB |
AUTH コマンドのタイムアウト |
30 秒 |
DATA コマンドのタイムアウト |
300 秒 |
アカウント全体のクォータ(日次送信制限、本文制限、ヘッダー制限)は、REST API および Workers バインディングと共有されます。一覧は 制限 を参照してください。
Cloudflare の SMTP サーバーは、標準の RFC 5321 ↗ 応答コードと、RFC 3463 ↗ 拡張ステータスコードを返します。
| コード | 意味 |
|---|---|
220 |
サービス準備完了(TLS ハンドシェイク後のグリーティング)。 |
235 2.7.0 |
認証に成功しました。 |
250 |
EHLO、MAIL FROM、RCPT TO、または DATA が正常に完了しました。 |
354 |
メッセージ本文の受信準備完了です。<CR><LF>.<CR><LF> で終了します。 |
421 |
サービスは一時的に利用できません。あとで再試行します。 |
451 4.3.0 |
ローカルエラーです。メッセージは受け付けましたが、延期されました。あとで再試行します。 |
452 4.5.3 |
このセッションの受信者が多すぎます。残りは新しいセッションを開きます。 |
500 / 501 |
コマンドまたは引数の構文エラーです。 |
503 |
コマンドの順序が正しくありません(例: AUTH の前の MAIL FROM)。 |
530 5.7.0 |
認証が必要です。 |
535 5.7.8 |
認証に失敗しました。トラブルシューティング を参照してください。 |
550 5.7.1 |
送信者またはリレーが拒否されました。多くの場合、MAIL FROM ドメインがオンボードされていません。 |
552 5.3.4 |
メッセージが 5 MiB の SIZE 制限を超えています。 |
554 |
トランザクションに失敗しました。ポリシーによりコンテンツが拒否されました。 |
SMTP は、構文的に有効な受信者を RCPT TO 中に 250 2.1.5 Ok で受け付けます。Email Service は、メッセージ本文を受け取ったあとに、アカウントの 配信停止リスト を確認します。
動作は、送信ドメインごとの Drop suppressed recipients 設定 によって変わります。設定はデフォルトでオフです。
設定がオフのとき、配信停止対象の受信者が 1 人でもいると、SMTP はメッセージ全体を拒否します。設定がオンのとき、Email Service は配信停止対象の受信者を除き、残りの受信者の処理を続けます。
削除がオンで、すべての受信者が配信停止対象の場合、SMTP は Message-ID なしで 250 2.0.0 Ok を返すことがあります。この場合は何も配信しません。
配信の確認には Email sending ログ を使います。配信停止された受信者は、Rejected 結果で表示されます。
配信停止は、Email Sending イベントサブスクリプション に message.rejected イベントを出し、rejection.reason は suppressed になります。
考えられる原因:
- ユーザー名がリテラル文字列
api_tokenではありません。API トークンは password フィールドに入れます。 - トークンに Email Sending: Edit 権限がありません。
- トークンが取り消されたか、期限切れです。
- ユーザー所有トークンの場合、
MAIL FROMのドメインが、そのトークンが操作できるアカウントに属していません。
MAIL FROM のアドレスが、API トークンを所有するアカウントで Email Sending にオンボードされていないドメインです。ダッシュボードの Email Service > Email Sending でドメインをオンボードするか、送信者アドレスを変更します。
メッセージ本文(MIME エンコード後の添付ファイルを含む)が 5 MiB を超えています。添付サイズを減らすか、メッセージを分割します。
Cloudflare の SMTP エンドポイントは、接続時から TLS が必要です(implicit TLS)。クライアントがポート 465 の SSL/TLS 用に設定されていることを確認します。対応していないポート 587 の STARTTLS ではありません。
受信側の SPF、DKIM、DMARC に関連する認証問題は、SPF、DKIM、DMARC のトラブルシューティング を参照してください。
- SMTP でメールを送る — curl、Nodemailer、Python、PHP の例。
- REST API — HTTPS でメールを送ります。
- Workers API — バインディングを使い、Cloudflare Worker からメールを送ります。
- ドメイン設定 — Email Sending 用にドメインをオンボードします。
- MTA-STS — 受信メールに TLS を強制します。
- メールヘッダー — 対応ヘッダーとスレッドのヒント。
- 制限 — アカウント、メッセージ、セッションの制限。