想给自己的域名配一个 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 只能指向一家,之前接过其他邮箱服务的话,要先确认不再用了再删。
然后配两样东西:
- 目标地址(Destination addresses):填你的 Gmail,Cloudflare 会发一封验证邮件,点确认。
- 路由规则(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 可以直接接。
- 登录 resend.com,Domains → Add Domain,填根域名(例如
eimoon.com)。 - 页面会列出需要添加的 DNS 记录:一条
resend._domainkey的 TXT(DKIM 公钥),以及send子域名下用于退信和 SPF 的记录。如果页面上有 Cloudflare 的自动配置入口,授权后它会直接把记录写进去。 - 这些记录在 Cloudflare 里保持「仅 DNS」(灰色云朵),不能开代理。
- 等几分钟,点 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) → 添加其他电子邮件地址。
- 名称填对方看到的名字,地址填
contact@你的域名,「视为别名」保持勾选。 - 下一页填 SMTP:
| 字段 | 值 |
|---|---|
| SMTP 服务器 | smtp.resend.com |
| 端口 | 465 |
| 用户名 | resend |
| 密码 | 上一步的 API Key |
| 加密 | SSL |
- Gmail 会给
contact@你的域名发一封验证邮件。它走第一步的转发规则回到你的 Gmail,点里面的链接即可。 - 同一页的「回复邮件时」选 从收到邮件的地址回复。这样别人发到
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。
- Email Routing → Destination addresses 添加新邮箱,去新邮箱里点验证链接。
- Routing rules 里把各条规则和 catch-all 的目标改成新邮箱。
- 还要用域名地址发信的话,在新邮箱里重新配一次 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 的事。
关于
关注我获取更多资讯