在发送 email 的时候,若是邮件收件人是一个不存在的 email 帐号、或者收件人帐号存在问题、收件箱没法接收 email, 那么 email server 就会将该没法接收的信息响应回来, 这种状况称之为 bounce email,对应的衡量指标是 bounce 率。bounce email 是影响邮件送达率(email delivery rate)的一个重要因素。根据 Sendgrid 统计结果, bounce 率在 5% 以上,送达率为71%;但若是 bounce 率在2%或如下,平均送达率能够提升到91%。html
目前咱们平台每月邮件发送量在千万封左右,包括通知类和营销类邮件,其中 marketing campaigns 占了大部分。 由于 marketing campaigns 会让客户自定义 contacts,这部分是潜在 bounce email 的一个风险,因此在发送邮件前检测收件人 email 地址是否可送达,过滤掉其中的垃圾和无效的 email 地址,能够有效减小 bounce rate。这篇文章咱们会详细介绍如何经过校验 email 地址以及最佳实践 , 来提升邮件送达率。git
上面 Sendgrid 对 bounce email 的统计数据, 能够较明显地看出 bounce 率和送达率的相关关系。但其中的相关性不只仅只是 bounce 占了总发送邮件数的比例大才影响送达率,而是 bounce 率高会进而影响到正经常使用户的邮件送达。github
每个 email 帐号都有一个发件人信誉的分数(reputation),来帮助收件人的 email 服务提供商(ESP)决定邮件的质量。分数越高,邮件的送达率也会越高,反之亦然。若是频繁的 bounce ,会致使收件的 Email Server “质疑” 发件人邮箱帐号是否为真实帐号,当到达必定程度, 该 sender 帐号会被列入各类 ESP 的垃圾邮件索引,最后发送给其余用户就会被 blocked。而且 bounce 会影响发件人 domain 和 ip 的 reputation。正则表达式
因此 email bounces 能够说是 marketing campaigns 的一个“噩梦”。校验 email 地址有助于将邮件发送给正确的收件人,同时使 email 账户保持可用状态,并提升 reputation。对业务来讲,也会提高 email campaign 的质量。api
完整的 email 地址的校验过程主要包括如下4个维度:安全
拼写的语法错误是 email 地址检查最多见的问题之一。 根据经常使用的 email 地址正则表达式,能够确认出地址是否有格式问题。通常检查的表达式相似于 abc@aftership.com
, 包括3个部分: local part 、@
分隔符 和 domain。服务器
较重点检查的是 local part 部分,由如下3部分组成:dom
!#$%&'*+-/=?^_
~`.
– 可是 local part 不能以 .
开头或结尾、或者连续使用,好比 example..dot@aftership.com
是一个非法的 email 地址。不一样的 email 服务提供商对 local part 有不一样的规定,这里 mailgun 提供了一份常见 ESP 的 校验规则。ide
domain 跟对域名的命名约定是一致的:包括只使用字母数字和-
符号且不能连续使用。工具
除了根据正则表达式对 email 地址作检查,还须要考虑的一些点是 IETF 标准和 non-ASCII domains。
一次性邮箱是指那些小段时间内有效的 email 地址,被称做 disposable email。 disposable email 是一个正确语法的地址,且能够接收和发送 email, 正常只能用一次,通常是用来注册新帐号绕过登陆、发送恶意邮件等场景。
常见的 disposable email 提供商包括 Nada 和 Mailinator 等。识别它们的方法是判断 domain 是否为disposable domain。目前开源社区有维护一些实时更新的 disposable domain 列表, 经过在列表里搜索 domian 的方式快速过滤掉 diposable email。
DNS 查询是指向 DNS 服务器请求 DNS 记录的过程。DNS 记录包括多种 domain 记录,这里咱们主要确认 MX record(_mail exchanger record, 邮件交换记录_)。该解析记录用来指定 email server 接收特定域名的 email。举个例子,咱们对 aftership.com
查询 DNS 记录以下:
能够看到 aftership.com
对应有4条 MX 记录。MX 记录存在表示 domain 对应的 ESP 是存在, 不然不是一个有效的 email 地址。
确认完 MX record 记录存在, 能够经过与 SMTP server 创建链接,来完成对 email 地址有效性的校验。如上一步所示,MX records 通常会有多条(_有的 SMTP server 会设置 record 的权重值_),SMTP server 的地址是: MX 记录 + SMTP Relay 端口。 Ping 收件人邮箱的原理是使用 SMTP ,链接到其中有效的 SMTP server,并请求收件人地址,请求后 server 会有响应, 根据响应信息来判断地址是否存在。
若是 SMTP server 响应 250 OK
, 那么这个 email 地址是可能就是一个有效地址;若是返回 550-5.1.1
相似错误那么就是一个无效的地址。
以 example@aftership.com
这个 email 地址为例, 下面是一个完整的 SMTP 链接的验证过程。
首先 telnet
连上收件人的 SMTP server, 经过 ehlo
标识发件人的身份,mail
设置 email 的发件人,最后 rcpt
设置 email 的收件人, rcpt
只能设置 SMTP domain 的 email 地址, 不然分类器(SMTP rewriter)会重写邮件中的电子邮件地址,使其与主 SMTP 地址相匹配 。若是 rcpt
没有拒绝该请求,代表 SMTP server 校验经过该地址,将会把收件人添加到邮件列表。下图是一张使用 SMTP 协议发送 email 的全流程图:
SMTP Ping 收件人地址的方法,是整个 email 地址校验过程可能最有效的一环,SMTP server 能帮你确认收件人是否存在和可达。须要注意到这里所说的“可能”,好比 example@aftership.com
实际上是一个无效的地址, rcpt
响应250,email 地址不必定是可达的。
这里又涉及一个概念,是 Catch-All Email Server,也叫 accept-all server,指那些被配置为接受全部发送到 domain 的 email 的 SMTP server,不管指定的 email 地址是否存在。catch-all 会将错误地址重定向到一个通用的邮箱,以按期审查,可是带来的问题是提升 bounce 率的风险且 catch-all 地址没法被正确校验。( 好比 Gmail 是一个 catch-all email server )
因此 Ping 收件人邮箱来校验地址有效性, 须要确保对方的 SMTP server 是非 catch-all email server, rcpt
命令响应250,才能说明地址是 deliverable,不然没法校验可达性。
更多关于连上 SMTP 服务器后校验过程的其余细节,好比为何是用 rcpt
而不是其余命令来验证地址,能够参考 Email box pinging。
校验 email 地址能够不是一个常常性的过程, 建议有下面几种状况时必须进行校验:
通过以上步骤来完整地校验 email 列表,哪怕只有一个地址的验证也要多花很多时间。可是也能够没必要进行手动验证,由于有许多第三方的 email 校验服务,通常有提供 API 来完成对地址的校验。调研了几个相似服务(好比 emailchecker),它们提供的功能主要包括如下几点:
因此这两种验证方案哪个是更好的选择呢?本地验证 email 地址无疑是首选, 由于自行校验其实更快,更好地支持批量校验邮件列表;要注意的是不少较好的第三方验证服务是付费的,在线验证时须要确认服务是否有 GDPR 数据保护以确保不会与第三方共享用户我的数据,或者存在安全问题,可是第三方校验不会有各类限制(多数 ISP 禁止在 25 端口上创建出站链接),且不存在影响 IP 段 和域名 reputation 的风险。
若是是本地验证 email 地址,目前社区其实有一些开源的验证 email 地址的工具, 其中 stars 数最可能是 trumail 项目,它提供了地址校验 API。可是这个项目有两个问题, 一是校验慢,性能有些问题;二是不支持 disposable domain 的校验,且该项目 archived, 已再也不维护。
在开发和维护 Messages Platform 上,做为平台方,咱们除了对业务提供高可用、简单易接入的 email 消息通道服务外,下降 bounce 率和提升邮件送达率也是咱们重要的指标之一。因此咱们须要有一个高效的邮件校验服务,过滤非法 email 地址(平台邮件平均发送量在1000+w封/月),以提升送达率。基于咱们的技术栈是 Go, 在调研了 git 社区其余开源的 email 验证工具后,发现 Go 项目对 email verifier 这一块建设是相对缺失,暂时尚未一个既提供多维度的 email 检查(包括 diposable domain, 和 Role Account 等)且校验地址可达性的工具。
因为 trumail 已再也不维护,因此咱们内部实现了一个新的 email 校验库 – email-verifier, 目前已经在线上环境上运行。对比 trumail, 校验 email 地址的效率更加明显,检查维度更多。
相比于现有其余的 email 地址校验工具, 咱们提供高性能、多维度、高准确性的免费 email 地址校验方案,来解决在不一样场景下对 email 地址校验的痛点问题。 期待 email-verifier 也能在更好地帮助到社区解决相似问题。
本文主要从 bounce email 引入,详细介绍了如何在不发送邮件状况下来校验 email 地址,同时给出合适时间点校验 email 地址的几个建议;对比本地校验和第三方校验服务二者的优缺点以及为何咱们会选择自建校验服务的缘由。最后是咱们在这一过程当中,基于校验原理孵化的一个检测工具。
通常来讲, Marketing Campaigns 展开以后,确定会遇到 bounce email 影响 campaigns 质量的问题,这个时候在发邮件前校验地址有效性的优势就不难理解:一是提升邮件送达率;二是维护和提升 sender 帐号的 reputation,对业务方和平台方都是必要的。