Backend

论坛通知邮件不能自建发信,国内邮件推送选型记录

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 和阿里云控制台的部分,由我自己动手。

  1. 发信用主域名下的一个子域名,而不是主域名本身。这样发信的信誉和主域名分开,以后主域名要收信也不会互相影响。
  2. 在 DNS 里加几条记录。一条所有权验证的 TXT,一条 SPF,一条 DKIM,一条 DMARC,DMARC 先用最宽松的 p=none 观察。不加 MX,因为这个地址只发信、不收信。
  3. 新建发信地址时,类型选“触发邮件”,不要选批量邮件,并给这个地址设置 SMTP 密码。
  4. 在论坛后台的邮件页添加这个邮箱,端口 465,开启 SSL,然后挪到列表第一位。原来的 QQ 邮箱留在后面兜底,最好换成专门注册的号。

后台的邮件页支持多个邮箱按顺序使用,前一个出错就换下一个。账户里放二三十元余额就够用很久,余额不足时阿里云发信会失败,这时自动换到 QQ 邮箱。免费额度用完以后,按我们的发件量估计每月 0 到 10 元。

配置好以后点了测试发信,邮件能发出去。我只确认了能发出去,并没有系统统计过它进垃圾箱的比例,这件事留到之后用真实邮件继续观察。

适用边界

这里的结论依赖这台服务器的网络环境(25 端口被封、没有反向解析),也依赖收件人几乎都在 qq.com 这一点。如果你的服务器没有这些限制,或者收件人分散在不同的邮箱服务商,自建与否的权衡会不太一样。

评论