对优雅地发送电子邮件的探索

1. 电子邮件相关概念

1) E-mail是什么?

按照电子邮件 - 维基百科的说法,电子邮件定义是:

一种由一寄件人将数字信息发送给一个人或多个人的信息交换方式

2) SMTP是什么?

按照简单邮件传输协议 - 维基百科的说法,SMTP定义是:

简单邮件传输协议(英语:Simple Mail Transfer Protocol,缩写:SMTP)是一个在互联网上传输电子邮件的标准。

简单来说,SMTP协议就是一个基于TCP/IP的、专门用于发送电子邮件的应用层协议。

3) 电子邮件送达率的意义?

不同于国内,在国外SMS(Short Message Service,短消息服务)其实使用没有国内这么广泛。国外网站很多和用户的交互仍然是通过电子邮件的。而ToC的邮件

ToC: OTA发货/退款成功后,给到用户的通知邮件

ToB: 对账

这些场景对邮件送达率和送达时延的要求非常高。试想一下:

  • 付钱买了机票火车票之后,票的相关信息一直没收到,或者是发车/起飞后你才收到
  • 和供应商对账约定好是十一点之前需要将对账结果以邮件形式发给他们,然而供应商没有收到或者收到时间非常滞后,导致他们按照合同认为我们昨天没有订单然后进行结算。

这些场景下,邮件的送达率要求是越接近100%越好,而送达时延是要求越接近0越好

2. 如何优雅地让用户收到邮件?

聊完邮件究竟在我们的业务场景会用来干什么,那么如何达成我们的目标–邮件的送达率要求是越接近100%越好,而送达时延是要求越接近0越好,就成为了另一个问题。

1) 选择SMTP服务

因为发送邮件基于SMTP协议,送达率和送达时延很大程度上基于中间的SMTP服务是否稳定和高可用。所以我们的第一个解决思路是找到靠谱的SMTP服务。

  • Google Mail(目前世界上最大的邮件服务提供商,截至2018年拥有15亿用户)
  • MailGun (MailGun是一个第三方邮件服务网关,提供各种各样的API来方便用户提供服务)

前者Gmail自身就是最大的邮件服务提供者,它的邮件送达率也比一般意义上的SMTP服务高一些。并且也能最优雅和简单地通过各个邮件服务提供商如Microsoft Outlook和Yahoo Mail等设置的风控和白名单等Anti-Fraud手段。

而后者是一个基于API的集成了发送、接收和追踪电子邮件等功能的邮件发送服务商,具体的介绍可以在这里看到MailGun

我们知道电商场景下,本身和用户的信息交互就会比较多。另外一个角度来看,国外的通知服务并不像国内这样习惯使用SMS(Short Message Service,短信息服务)进行交互。邮件仍然是国外主要的通知交互手段。

2) 优雅地通过Anti-Fraud

读到这里是不是有一些疑问:

  • 按照上面的说法,邮件不是正常的保障其符合SMTP协议,然后网络通畅将就可以将其正确的送达收件人的邮箱么?为什么网络的SLA在可以做到三四个甚至五个9的情况(理想情况,并不是指实际业务情况)下,邮件送达率连两个9都不能到达呢?

原因其实很真实,因为除了网络的因素之外,现代的电子邮件系统已经建立了强大的风控系统。

这里大家可以去体验一下自建服务:Github上随机找一个开箱可用的SMTP服务项目(如果自带了绕过风控检测的组件,关掉它。),run起来之后配置下DNS,然后发100封邮件给QQ、Outlook、Gmail这些开放式邮箱服务提供商。最后统计一下送达率,你会惊讶的发现,即使你只发送一个hello world,没有任何敏感词,你的邮件仍然会很容易让收件人收不到,即使收到了,也有很大概率在收件人的垃圾箱里面。

自建SMTP送达率低的情况为什么会出现,其实主要是现在的大型邮件服务提供商,都有通过判断发信人可信度的方式,来判定一封邮件是否是垃圾邮件的检查措施。这部分的技术主要有微软的Sender ID、雅虎的DomainKeys、网易的Spam Feedback等技术。但是判断发信人来源是否可信,只是众多反垃圾邮件手段其中的一项。现代反垃圾邮件系统,同时也会通过判断邮件内容是否有敏感词等等手段,来判断这封邮件是否是一封垃圾邮件。

总结一下,Anti-Fraud 对于邮件送达率的打击会比较高。因此正确地编写通知邮件内容、控制发送频率和使用稳定而可信的SMTP等对通过Anti-Fraud就显得至关重要。

有兴趣的同学可以继续参看:怎么样才能让自己服务器发出的邮件不被 Gmail、Hotmail、163、QQ 等邮箱放入垃圾箱?,里面的回答普遍质量比较高。

3) 优雅地使用SMTP

讲完了选择SMTP和如何绕开Anti-Fraud之后,还有一个至关重要的部分也需要注意:优雅地调用SMTP服务。这部分有以下几点需要注意:

  1. SMTP本身是一个基于TCP/IP的网络协议。SMTP服务器也和其他中间件一样,是需要通过网络调用的。对于存在网络调用的场景,就不可避免的谈到一点:调用开销。如果上传的文件比较大,而出口带宽又比较小时,就需要注意此时发送邮件设置的超时时间是否合理,是否足够邮件附件上传完成。
  2. SMTP服务器对附件大小有限制,对市面上的大部分邮件服务而言,附件限制都是25M。如果超过大小限制,建议是使用第三方存储服务来进行文件传递,邮件上只附上下载方式即可。
  3. SMTP服务器对邮件发送频率和发送上限也会有限制。对于Gmail,可以查看Google Workspace 中的 Gmail 发送上限 - Google Workspace 管理员帮助,按照文档里的描述,Gmail的每日发送上限是2000。并且这个24小时并不是自然天,而是滚动的24小时。也就是说Gmail的发送频率限制实际上是2000封/24小时
  4. SMTP服务器的调用ip需要稳定。Gmail的风控手段之一是:客户端数量限制。而这个客户端数量是以调用Gmail SMTP的ip数来确定的。同时由于现在hub的分布式部署,即使同一个实例,有可能在调用Gmail SMTP时,仍然有可能使用了不同的ip,造成Google的风控认为多点登录从而将账号短暂封禁。因此建议在使用Gmail时,通过固定IP进行调用。降低被风控的可能性。

4.参考

Gmail - Google Workspace 管理员帮助

怎么样才能让自己服务器发出的邮件不被 Gmail、Hotmail、163、QQ 等邮箱放入垃圾箱?

Wikipedia