Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

SMTP

最終更新 Markdown で表示Agent セットアップ

Cloudflare Email Service は、認証済み SMTP 送信エンドポイントを公開します。SMTP を話す任意のアプリケーション、フレームワーク、既製メールクライアントからメールを送れます。REST APIWorkers バインディング が適さないときに 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 でメールを送る前に、次が必要です。

  1. Email Sending が有効なアカウント。
  2. Cloudflare ダッシュボードの Email Service > Email Sendingオンボード済みのドメイン が 1 つ以上あること。
  3. 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 メカニズムに対応します。

どちらの場合も、ユーザー名はリテラル文字列 api_token、パスワードは Cloudflare API トークンです。

AUTH PLAIN ペイロードを組み立てる

AUTH PLAIN\0api_token\0<API_TOKEN> を base64 でエンコードして送ります。

printf '\0api_token\0%s' "<API_TOKEN>" | base64

生の SMTP トランスクリプト

次のトランスクリプトは、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 EHLOMAIL FROMRCPT 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.reasonsuppressed になります。

トラブルシューティング

535 5.7.8 Authentication failed

考えられる原因:

  • ユーザー名がリテラル文字列 api_token ではありません。API トークンは password フィールドに入れます。
  • トークンに Email Sending: Edit 権限がありません。
  • トークンが取り消されたか、期限切れです。
  • ユーザー所有トークンの場合、MAIL FROM のドメインが、そのトークンが操作できるアカウントに属していません。

550 5.7.1 Sender denied

MAIL FROM のアドレスが、API トークンを所有するアカウントで Email Sending にオンボードされていないドメインです。ダッシュボードの Email Service > Email Sending でドメインをオンボードするか、送信者アドレスを変更します。

552 5.3.4 Message too big

メッセージ本文(MIME エンコード後の添付ファイルを含む)が 5 MiB を超えています。添付サイズを減らすか、メッセージを分割します。

TLS ハンドシェイクの失敗

Cloudflare の SMTP エンドポイントは、接続時から TLS が必要です(implicit TLS)。クライアントがポート 465 の SSL/TLS 用に設定されていることを確認します。対応していないポート 587STARTTLS ではありません。

受信側の SPF、DKIM、DMARC に関連する認証問題は、SPF、DKIM、DMARC のトラブルシューティング を参照してください。

関連リソース

  • SMTP でメールを送る — curl、Nodemailer、Python、PHP の例。
  • REST API — HTTPS でメールを送ります。
  • Workers API — バインディングを使い、Cloudflare Worker からメールを送ります。
  • ドメイン設定 — Email Sending 用にドメインをオンボードします。
  • MTA-STS — 受信メールに TLS を強制します。
  • メールヘッダー — 対応ヘッダーとスレッドのヒント。
  • 制限 — アカウント、メッセージ、セッションの制限。

役に立ちましたか?