论坛通知邮件不能自建发信,国内邮件推送选型记录
2058 字约 7 分钟
摘要论坛要给几千个 QQ 邮箱发通知。检查发现云服务器的 25 端口出不去、IP 没有反向解析,自建邮件服务走不通,个人 QQ 邮箱也不合适,最后选了阿里云邮件推送,并用 QQ 邮箱兜底。
鼠洞是我做的一个依托 QQ 群的论坛,成员用 QQ 号登录,通知邮件直接发到 QQ号@qq.com。也就是说,收件人几乎全部在 qq.com,对方邮箱怎么看待我们这个发件人,决定了邮件能不能被看到。
论坛一开始配的发信邮箱,是我自己的 QQ 邮箱,用授权码走 SMTP。在准备让更多人进来之前,我心里有点不踏实,于是让助手先帮我查清楚几件事。发件量大概多少?用我自己的 QQ 邮箱发合不合适?能不能在自己的服务器上搭一个轻量的邮件服务,而且不被扔进垃圾箱?有没有免费的替代方案?
先估算发件量
两个群加起来约 2000 人。只有在论坛里产生的内容才会触发通知,从群聊里收录来的帖子不算。按默认会发邮件的几类通知估算,结果是下面这样。
| 来源 | 平时 | 高峰 |
|---|---|---|
| 邮箱验证码登录 | 每天 5 到 20 封 | 刚上线几天,每天 50 到 150 封 |
| 回复、@、答案被采纳等通知 | 每天 20 到 100 封 | 升学季热闹时翻两三倍 |
| 升级、抽奖、管理通知 | 每天个位数到几十封 | 开奖时一次几十封 |
| 每周来信 | 无 | 周一上午 9 点集中发 30 到 150 封 |
合起来,平时每天 30 到 150 封,高峰日 200 到 400 封,一个月 2000 到 5000 封。量并不大,但发信是一阵一阵的,周一早上和开奖的那一刻会突然集中。
自己的 QQ 邮箱不合适
我最先想到的就是继续用我自己的 QQ 邮箱,但有三个问题。
- 发件人就是我的 QQ 号,2000 个人收到的邮件上都能看到。
- 风险会连带。发多了会被限流,严重时邮箱冻结一段时间,我自己的私人邮件也跟着受影响。
- 额度偏紧。我查到的数字都来自第三方文章,普通用户每天大约 100 封,会员 500 封,每分钟超过大约 40 封就会被限。被限的时候返回 535,看着像授权码错了,其实是频率问题。
这些数字没有官方来源,可能已经过时,但量级足够说明问题。
自建邮件服务,两个检查就卡死了
自建邮件服务在技术上并不难。装好 Postfix,配上 SPF、DKIM 和 DMARC,半天能搞定。难的是邮件能不能被对方收下。所以我没有急着动手,先在服务器上做了几个只读的检查。
第一个检查是出方向的 25 端口。邮件服务器之间互相投递,走的就是 25 端口。我从服务器上分别连了 QQ 邮箱和 Gmail 的收信服务器,两个都超时。同样是这台服务器,连 QQ 邮箱的 465 和 587 端口却是通的。也就是说,我们只能把邮件交给别人的 SMTP 服务器代发,没法自己直接投递。
第二个检查是反向解析。我用公共 DNS 查了这个 IP 的 PTR 记录,返回的是不存在。要设置反向解析,必须找服务商。另外我顺手查了三个常见的垃圾邮件黑名单,都没有收录这个 IP,所以 IP 本身不脏,只是没有任何记录。
通俗比喻:陌生号码打来的电话收信的邮件服务器对陌生发件人,很像你对陌生号码的态度。没有来电显示(没有反向解析)、号码是新办的(IP 和域名没有信誉),多数人会选择不接,也就是拒收或者扔进垃圾箱。
要让对方接起电话,只能先打很多次正常的电话,慢慢攒下好名声,这需要几周甚至更久的耐心。
SPF、DKIM、DMARC 分别是什么它们是三道配合使用的验证。SPF 在域名的 DNS 里声明“哪些服务器可以替我发信”,DKIM 给每封邮件盖一个签名,证明内容没被改动,DMARC 告诉收信方,验证不通过的邮件该如何处理。
它们让收信方相信邮件确实来自这个域名,但不等于信誉。信誉是单独积累的。
就算服务商肯放开 25 端口并设置反向解析,一个新 IP 加上一个新域名,QQ 邮箱对这样的陌生发件人又特别严格,前几周很可能被拒收或进垃圾箱。邮件几乎全部发往 qq.com,为此花时间养信誉并不划算。所以结论很明确,自建这条路在这台服务器上走不通。
邮件推送服务怎么选
既然只能交给别人代发,选项就是各家的邮件推送服务。下表是我当时查到的情况,价格和额度都以官网为准。
| 方案 | 费用和额度 | 备注 |
|---|---|---|
| 专门注册几个 QQ 邮箱轮流发 | 免费,每个每天约 100 封 | 对 qq.com 的送达率最好,但额度紧 |
| 阿里云邮件推送 | 免费额度一共 2000 封,每天最多免费 200 封,之后每千封约 2 元 | 需要实名认证 |
| 腾讯云邮件推送 | 新账号一次性 1000 封,之后约 0.0019 元每封 | 同一个收件人每小时最多 10 封 |
| SendCloud | 每天 10 封,发邮件向客服申请可以提到 200 封 | 付费套餐每月 59 元起,付费账户要做企业认证 |
| Resend 等国外服务 | 免费,每天最多 100 封 | 周一和高峰日会超额度 |
所有这些都走 SMTP 的 465 端口,我们的服务器能连上。论坛发信用的 nodemailer 本来就能连任意 SMTP 服务器,所以换哪一家,都只是在后台改配置,不需要改代码。
国内这几家都要实名认证,有的还要验证网站,甚至要求域名已经备案。我的域名恰好就是在阿里云注册并且已经备案的,服务器本身没有备案。这不影响,因为论坛只是作为客户端去连阿里云的 SMTP 服务器,并不对外提供网站服务给它。最后我选了阿里云。
最后的配置
选定之后,我按下面的方式配置,其中涉及 DNS 和阿里云控制台的部分,由我自己动手。
- 发信用主域名下的一个子域名,而不是主域名本身。这样发信的信誉和主域名分开,以后主域名要收信也不会互相影响。
- 在 DNS 里加几条记录。一条所有权验证的 TXT,一条 SPF,一条 DKIM,一条 DMARC,DMARC 先用最宽松的
p=none观察。不加 MX,因为这个地址只发信、不收信。 - 新建发信地址时,类型选“触发邮件”,不要选批量邮件,并给这个地址设置 SMTP 密码。
- 在论坛后台的邮件页添加这个邮箱,端口 465,开启 SSL,然后挪到列表第一位。原来的 QQ 邮箱留在后面兜底,最好换成专门注册的号。
后台的邮件页支持多个邮箱按顺序使用,前一个出错就换下一个。账户里放二三十元余额就够用很久,余额不足时阿里云发信会失败,这时自动换到 QQ 邮箱。免费额度用完以后,按我们的发件量估计每月 0 到 10 元。
配置好以后点了测试发信,邮件能发出去。我只确认了能发出去,并没有系统统计过它进垃圾箱的比例,这件事留到之后用真实邮件继续观察。
适用边界这里的结论依赖这台服务器的网络环境(25 端口被封、没有反向解析),也依赖收件人几乎都在 qq.com 这一点。如果你的服务器没有这些限制,或者收件人分散在不同的邮箱服务商,自建与否的权衡会不太一样。