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| 设置 | 值 |
|---|---|
| Host | smtp.mx.cloudflare.net |
| Port | 465 |
| Security | 隐式 TLS(也称为 SMTPS) |
SMTP AUTH |
PLAIN 或 LOGIN |
| Username | 字面字符串 api_token |
| Password | Cloudflare API 令牌(见下文) |
Cloudflare 仅在端口 465 上提供使用隐式 TLS 的 SMTP 提交。不支持出站提交使用明文 SMTP、端口 587 上的机会性 STARTTLS,以及端口 25 上的未经验证中继。端口 25 保留用于发往 Email Routing 的入站邮件。
在通过 SMTP 发送电子邮件之前,你需要:
- 已启用 Email Sending 的账户。
- 在 Cloudflare 仪表板的 Email Service > Email Sending 下至少接入一个域名。
- 具有 Email Sending: Edit 权限的 Cloudflare API 令牌。账户拥有(推荐)和用户拥有的令牌均可接受;该令牌用作 SMTP 密码。
请将此令牌视为凭据。任何持有它的人都可以从匹配账户上任何已接入的域名发送电子邮件。
只需一条 curl 命令即可发送电子邮件。请将 <API_TOKEN> 替换为具有 Email Sending: Edit 权限的 Cloudflare API 令牌,并将 --mail-from 和 --mail-rcpt 地址替换为您自己的地址。
cat > mail.txt <<EOF
From: [email protected]
To: [email protected]
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 "[email protected]" \
--mail-rcpt "[email protected]" \
--upload-file mail.txt发件人域名([email protected])必须在拥有该 API 令牌的账户上完成 Email Sending 的登记。
Cloudflare 的 SMTP 端点支持两种 SASL 机制,均由 RFC 4954 ↗ 定义:
AUTH PLAIN— 首选。单次往返,RFC 4616 ↗。AUTH LOGIN— 旧版 draft-murchison-sasl-login ↗。为与旧客户端兼容而支持。
在这两种情况下,用户名均为字面字符串 api_token,密码为你的 Cloudflare API 令牌。
AUTH PLAIN 发送编码为 base64 的 \0api_token\0<API_TOKEN>:
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:<[email protected]>
250 2.1.0 Ok
> RCPT TO:<[email protected]>
250 2.1.5 Ok
> DATA
354 Start mail input; end with <CR><LF>.<CR><LF>
From: [email protected]
To: [email protected]
Subject: Welcome
Thanks for signing up.
.
250 2.0.0 Ok <[email protected]>
> QUIT
221 mx.cloudflare.net Cloudflare Email ESMTP Service closing transmission channel消息正文之后的 250 2.0.0 Ok 响应包含分配的 Message-ID。使用它将提交与仪表板中的投递日志关联起来。
有关特定语言的示例——curl、Nodemailer、Python smtplib 和 PHPMailer——请参阅 Send email over SMTP。
以下每会话限制适用于 SMTP 提交:
| 限制 | 值 |
|---|---|
RCPT TO 收件人 |
每个会话 50 个 |
EHLO 中通告的 SIZE |
5 MiB |
AUTH 命令超时 |
30 秒 |
DATA 命令超时 |
300 秒 |
账户范围的配额(每日发送限制、内容限制、标头限制)与 REST API 和 Workers 绑定共享。完整列表请参阅 Limits。
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 |
事务失败——内容因策略被拒绝。 |
可能的原因:
- 用户名不是字面字符串
api_token。API 令牌应放在 password(密码) 字段中。 - 令牌没有 Email Sending: Edit 权限。
- 令牌已被吊销或已过期。
- 对于用户拥有的令牌,
MAIL FROM中的域名不属于该令牌可操作的账户。
MAIL FROM 中的地址位于未在拥有 API 令牌的账户下为 Email Sending 接入的域名上。在仪表板的 Email Service > Email Sending 下接入域名,或更改发件人地址。
消息正文(包括 MIME 编码后的附件)大于 5 MiB。减小附件大小或拆分消息。
Cloudflare 的 SMTP 端点要求从连接开始就使用 TLS(隐式 TLS)。确保你的客户端配置为在端口 465 上使用 SSL/TLS,而不是在端口 587 上使用 STARTTLS(不受支持)。
对于收件人端与 SPF、DKIM 或 DMARC 相关的身份验证问题,请参阅 Troubleshoot SPF, DKIM and DMARC。
- Send email over SMTP — curl、Nodemailer、Python 和 PHP 的示例。
- REST API — 通过 HTTPS 发送电子邮件。
- Workers API — 使用绑定从 Cloudflare Worker 发送电子邮件。
- Domain configuration — 为 Email Sending 接入域名。
- MTA-STS — 为传入邮件强制执行 TLS。
- Email headers — 支持的标头和线程提示。
- Limits — 账户、消息和会话限制。