零成本域名邮箱:Cloudflare 收信,Resend 发信,Gmail 只当客户端

域名放在 Cloudflare 上,不必再开一个企业邮箱。把「邮箱」拆成收信和发信两件事:收信用 Cloudflare Email Routing 转发到 Gmail,发信用 Resend 的 SMTP,Gmail 只负责读和写。全程免费,mail-tester 满分,也说清楚这套方案的边界。

想给自己的域名配一个 contact@你的域名.com,第一反应往往是去开企业邮箱:Google Workspace、Microsoft 365,或者国内几家的免费版。但如果域名已经托管在 Cloudflare,这一步多半是多余的。

所谓「邮箱」,其实是三件事捆在一起卖:收信(别人的信送到哪)、发信(你的信从哪台服务器出去)、客户端(你在哪读、在哪写)。企业邮箱把三件全包了,所以要收费;拆开来看,每一件都有现成的免费方案:

  • 收信:Cloudflare Email Routing,把 任意前缀@你的域名 转发到你已有的邮箱
  • 发信:Resend 的 SMTP 服务,免费额度每天 100 封、每月 3000 封
  • 客户端:你天天在用的 Gmail

拼起来之后,在 Gmail 里收发 contact@eimoon.com,对方看不到背后的 Gmail 地址。我用这套配置发到 mail-tester 测了一次,10 分满分。

先想清楚:只收信,还是也要发信

只做第一步(Cloudflare 转发),所有发到域名邮箱的信都能收到,适合拿来注册网站、收验证码、在页面上挂一个联系地址。

但只要你在 Gmail 里点「回复」,对方看到的发件人就是你的 Gmail 地址。Gmail 不允许直接冒用别的域名发信,要以 contact@你的域名 发出去,必须给它一台能代发这个域名的 SMTP 服务器——这就是 Resend 的作用。

所以:只想收,做完第一步就停;要用它跟人通信,再做后面两步。

第一步:Cloudflare Email Routing 收信

进入 Cloudflare 控制台 → 选中域名 → Email → Email Routing,点开启。它会自动在 DNS 里加好需要的记录:

类型 名称 内容
MX @ route1/route2/route3.mx.cloudflare.net
TXT @ v=spf1 include:_spf.mx.cloudflare.net ~all
TXT cf2024-1._domainkey Cloudflare 的 DKIM 公钥

开启前先看一眼 DNS 里有没有别家的 MX 记录。一个域名的 MX 只能指向一家,之前接过其他邮箱服务的话,要先确认不再用了再删。

然后配两样东西:

  1. 目标地址(Destination addresses):填你的 Gmail,Cloudflare 会发一封验证邮件,点确认。
  2. 路由规则(Routing rules):
    • 自定义地址:比如 contact@ → 转到 Gmail
    • Catch-all:开启后,任意前缀@你的域名 都会转过去

Catch-all 很好用:注册 GitHub 就用 github@,注册某个网站就用 网站名@,不需要提前建。哪个地址开始收垃圾邮件,就知道是谁泄露的,直接加一条规则把它丢弃。代价是垃圾邮件也会全部进来。即便开了 catch-all,常用的对外地址也建议单独建一条规则,以后关掉 catch-all 它照样能用。

配完用别的邮箱给 contact@你的域名 发一封,几十秒内 Gmail 就能收到。

前缀怎么选

收信不限前缀,但对外公布的那一个值得想一下:

  • hi@ / hello@:个人站点、博客最常见,语气友好
  • contact@:偏正式,适合网站底部、商务合作
  • me@ / 名字@:个人身份,适合用自己名字做的域名
  • noreply@ / notify@:留给程序发通知
  • server@ / admin@:像系统账号,对方容易当成自动邮件,不适合对外

如果域名是品牌名而不是你的名字,me@品牌.com 读起来会有点别扭,contact@ 或 hi@ 更自然。

第二步:Resend 验证域名

Resend 本来是给开发者用的发信 API,但它同时提供 SMTP 接口,Gmail 可以直接接。

  1. 登录 resend.com,Domains → Add Domain,填根域名(例如 eimoon.com)。
  2. 页面会列出需要添加的 DNS 记录:一条 resend._domainkey 的 TXT(DKIM 公钥),以及 send 子域名下用于退信和 SPF 的记录。如果页面上有 Cloudflare 的自动配置入口,授权后它会直接把记录写进去。
  3. 这些记录在 Cloudflare 里保持「仅 DNS」(灰色云朵),不能开代理。
  4. 等几分钟,点 Verify DNS Records,全部变成 Verified 即可。

两点容易想不到:

Resend 的记录不会和第一步冲突。 它的 MX、SPF 都放在 send 这类子域名上,根域名的 MX 仍然指向 Cloudflare,收信不受影响。

添加哪个域名,就只能用哪个域名发信。 想用 contact@eimoon.com 发信,就得添加 eimoon.com;添加 mail.eimoon.com 的话,只能从 xxx@mail.eimoon.com 发。子域名适合隔离用途,比如程序群发通知走 notify.你的域名,万一被标记成垃圾邮件,不连累你本人的地址。

最后去 API Keys → Create API Key,权限选 Sending access,域名选你刚验证的那个。这个 Key 就是下一步的 SMTP 密码,只显示一次。

想确认 Key 能用,可以在终端直接调一次 API:

curl -s https://api.resend.com/emails \
  -H "Authorization: Bearer re_你的Key" \
  -H "Content-Type: application/json" \
  -d '{"from":"contact@你的域名","to":"你的Gmail","subject":"test","text":"hi"}'

返回 {"id":"..."} 就说明 Key 和域名都没问题。

第三步:Gmail 用域名地址发信

Gmail 设置 → 查看所有设置 → 账号和导入(Accounts and Import) → 用这个地址发送邮件(Send mail as) → 添加其他电子邮件地址。

  1. 名称填对方看到的名字,地址填 contact@你的域名,「视为别名」保持勾选。
  2. 下一页填 SMTP:
字段 值
SMTP 服务器 smtp.resend.com
端口 465
用户名 resend
密码 上一步的 API Key
加密 SSL
  1. Gmail 会给 contact@你的域名 发一封验证邮件。它走第一步的转发规则回到你的 Gmail,点里面的链接即可。
  2. 同一页的「回复邮件时」选 从收到邮件的地址回复。这样别人发到 contact@ 的信,你回复时自动用 contact@,不会不小心露出 Gmail 地址。

这一步有两个坑:

  • Gmail 会自动猜一个 SMTP 服务器。 它查到域名的 MX 指向 Cloudflare,就预填 route1.mx.cloudflare.net、端口 587、用户名 contact。Cloudflare 的 MX 只负责收信,不能登录发信,这三项都要手动改掉。
  • 别进错页面。 「转发和 POP/IMAP」里的「添加转发地址」是把 Gmail 的信再转出去。在那里填域名地址,就会和 Cloudflare 的转发形成死循环。

加好之后,Gmail 原来的地址照样能用,写信时发件人变成一个下拉框可以切换。用 Gmail 地址发信仍然走 Google 自己的服务器,不占 Resend 的额度。每个想用来发信的地址都要在这里单独加一次;收信不用,catch-all 已经全包了。

第四步:补一条 DMARC,然后验证

前面两家已经各自配好了 SPF 和 DKIM,再补一条 DMARC,告诉收件方「这两项都没通过的信该怎么处理」:

类型 名称 内容
TXT _dmarc v=DMARC1; p=none; rua=mailto:contact@你的域名

p=none 只观察、不拦截,先用一段时间。确认正常收发没问题后,可以改成 p=quarantine,让冒充你域名发出的信直接进垃圾箱。

验证方法:用 contact@ 给 mail-tester.com 给出的临时地址发一封,看分数;或者发到另一个邮箱,打开「显示原始邮件」,确认 SPF、DKIM、DMARC 三项都是 PASS。

为什么能全部通过:用 contact@eimoon.com 发出的信,DKIM 签名域是 eimoon.com,退信地址在 send.eimoon.com 下,SPF 按宽松模式也能和 eimoon.com 对齐,DMARC 检查自然通过。

以后要改:什么时候动 DNS

配好之后,DNS 只负责一件事:让外面的信找到 Cloudflare,让 Resend 能代发这个域名。信最终送到哪、用哪个地址发,都不在 DNS 里。所以日常调整基本不用碰它。

加一个新地址,比如 likun@:不动 DNS。

  • 收信:开着 catch-all 就已经能收到。想以后关掉 catch-all 也能用,就在 Email Routing → Routing rules 里给它单独建一条转发规则。
  • 发信:在 Gmail 的「用这个地址发送邮件」里再加一次,SMTP 设置和之前完全一样,同一个 Key 可以给所有地址共用。Resend 验证的是整个域名,不需要为每个前缀单独配置。

把收信邮箱从 Gmail 换成别的:也不动 DNS。

  1. Email Routing → Destination addresses 添加新邮箱,去新邮箱里点验证链接。
  2. Routing rules 里把各条规则和 catch-all 的目标改成新邮箱。
  3. 还要用域名地址发信的话,在新邮箱里重新配一次 SMTP,参数照旧。前提是它支持「用其他地址发信」:Gmail、Outlook 支持,国内的 163、QQ 邮箱基本不支持,换过去就只能收、不能以域名身份发。

改用真正的企业邮箱(Google Workspace、腾讯企业邮等):这时才要动 DNS。

先在 Email Routing 里关掉转发,再把根域名的 MX 和 SPF 换成新服务商给的记录。Resend 的记录都在 send 这类子域名上,可以留着继续给程序发信用;如果新邮箱也负责发信,记得把它的发信服务器加进根域名的 SPF。

用命令行配置(可选)

Cloudflare 在 9 月底发布了新的命令行工具 cf,用来接替 Wrangler,覆盖了全部 API。上面第一步和第四步也能用它完成。它目前还是 beta,命令可能变动,以 cf <命令> --help 为准:

npm i -g cf
cf auth login                       # 浏览器 OAuth 登录

cf email-routing enable -z 你的域名  # 开启并自动写入 MX / SPF

cf email-routing rules create -z 你的域名 --name "contact" \
  --matchers '[{"type":"literal","field":"to","value":"contact@你的域名"}]' \
  --actions '[{"type":"forward","value":["你的Gmail"]}]'

cf email-routing rules catch-all update -z 你的域名 --enabled \
  --matchers '[{"type":"all"}]' \
  --actions '[{"type":"forward","value":["你的Gmail"]}]'

cf dns records create -z 你的域名 --body \
  '{"type":"TXT","name":"_dmarc.你的域名","content":"\"v=DMARC1; p=none; rua=mailto:contact@你的域名\"","ttl":1}'

找不到命令时用 cf cli search "描述要做的事" 搜索。目标地址的验证仍然需要你去邮箱里点链接。

这套方案的边界

它免费,但不是企业邮箱的平替。用之前要知道几件事:

  • 信不存在你的域名下,存在 Gmail 里。 Gmail 账号出问题,域名邮箱跟着瘫痪。换客户端很容易,改一下转发目标就行;但历史邮件留在 Gmail。
  • Resend 是事务邮件服务,不是邮箱托管。 个人每天几封、几十封完全没问题,免费额度每天 100 封。要群发营销邮件,或者多人共用,就该认真考虑付费方案。
  • Cloudflare 只转发,不存储。 转发失败的信(比如目标邮箱拒收)不会给你留底。
  • 多人协作做不了。 每人一个独立邮箱、共享通讯录、管理员后台,这些只有真正的企业邮箱才有。

一个人、一个域名、需要一个看起来体面的对外地址,这套组合足够了,也不用为此每月付费。等哪天真的有了团队,再迁去企业邮箱也只是改几条 DNS 的事。

关于

关注我获取更多资讯

月球基地博客公众号二维码,扫码关注获取更多 AI 与编程资讯
📢 公众号
月球基地博客作者个人微信二维码,扫码交流 AI 与编程话题
💬 个人号
使用 Hugo 构建
主题 Stack 由 Jimmy 设计