文档章节

搭建百万级别邮件发送平台

_夜枫
 _夜枫
发布于 2017/06/28 14:11
字数 2207
阅读 22
收藏 0
点赞 0
评论 0

原文链接

 

一. 前言

 

调用邮件接口发送邮件是再简单不过的功能。但是要做成平台并且支持百万级别的发送量,就没那么简单。

如何快速的将数百万封邮件推送出去?这个功能看上去和发送数百万条短信一样。找个靠谱的第三方推送平台,起多个进程,分分钟的事情,瓶颈肯定是在第三方平台而不是我们这里。但是这个简单的百万级别邮件发送平台(EDM)耗费了我3个多月的时间。

EDM(Email Direct Marketing)主要用于较大量的营销和推广类邮件发送。我搭建的EDM平台主要用于给订阅用户发送推广类邮件和通知类邮件。

二. 思考

最初我们的需求是需要定期给100W用户推送邮件,接到这个需求时我最初的想法如下:

  1. 因为发送邮件、短信、APP推送的业务非常相似,所以我打算做成一个消息中心,发邮件功能只是调用消息中心接口时传的一个名为email的消息类型。

  2. 因为第三方邮件平台对接口调用频率肯定会有限制,所以我们需要计算申请多少个发件邮箱,起多少个发送进程。

  3. 因为邮件是按顺序发送(新用户先发,老用户后发),所以需要在进程间进行通信,使用信号量或者消息队列。

  4. 还有一些零散的优化点。比如要支持任务中断,支持用户已读功能,邮件样式需要兼容Mac版Outlook客户端,右上角一定要有『在浏览器中查看此邮件』,右下角要有『取消订阅』。

依照如上规划,EDM平台很快就搭建完成,各个功能点测试一路畅通,于是正式上线投入生产。看着自己一气呵成写的项目完美上线,心情无比舒畅,不过这只是噩梦的开始……

按道理说不可能出问题,EDM项目中使用的每一个技术点都是我拿手的方案……当问题出现时我才发现EDM项目原来这么难,很多问题不是技术能解决的。成功投递一封邮件很简单,但是成功投递100W封就难于上青天,技术只是解决问题的工具,当出现的问题没法用工具解决时,我们只能寻求理论支撑。

三. 我要的理论支撑

我接触互联网时QQ这种IM工具就人人必备了,邮件对我来说是一种古老的沟通工具,除了工作中需要使用外,生活中都不会打开。Gmail中全是Facebook,Twitter,Linkedin的广告,QQ和网易邮箱更是惨不忍睹。这也导致我对Email协议的了解少的可怜。而我首先要面对的就是各种『反垃圾邮件策略』导致的投递失败问题。

反垃圾邮件策略有很多,Email协议也定义了大量的规范,详情 http://www.faqs.org/rfcs/ 我将拿出主要的优化点来说明。

  1. 添加 MX 与 SPF 记录

    MX(Mail Exchanger)是邮件交换记录,它指向一个邮件服务器,用于电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器。用户可以将该域名下的邮件服务器指向到自己的mail server上,然后可自行操控所有的邮箱设置。

    SPF (Sender Policy Framework)发信者策略架构,通常都直接称为SPF,SPF是为了防范垃圾邮件而提出来的一种DNS记录类型,它是一种TXT类型的记录,它用于登记某个域名拥有的用来外发邮件的所有IP地址。

    SPF是跟DNS相关的一项技术,它的内容写在DNS的txt类型的记录里面。MX记录的作用是给寄信者指明某个域名的邮件服务器有哪些。SPF的作用跟MX相反,它向收信者表明,哪些邮件服务器是经过某个域名认可会发送邮件的。

    SPF的作用主要是反垃圾邮件,主要针对那些发信人伪造域名的垃圾邮件。

    这两个参数很好加,添加两条DNS解析记录就行。

  2. 支持 DKIM、DMARC 协议

    DKIM(DomainKeys Identified Mail)域名密钥识别邮件标准。发送方会在电子邮件的标头插入DKIM-Signature及电子签名信息。接收方则透过DNS查询得到公钥后进行验证。

    DMARC(Domain-based Message Authentication, Reporting and Conformance)由Paypal,Google,微软,雅虎,ReturnPath等15家行业巨头(主要包括 金融机构,Email服务提供商,数据分析机构等)联手宣布成立了新的互联网联盟,致力于提交并推广一款[DMARC]新电子邮件安全协议。随着该联盟的日渐发展,继而有网易等其他行业先行者也加入到其中。

    这两个协议特别不好加……如果你使用的是阿里云邮箱服务,可以联系客服帮忙添加。

  3. 配置 List-Unsubscribe

    List-Unsubscribe用来设置取消订阅参数,通常设置一个收件箱,比如 unsubscribe@test.com。主流的邮件服务器都会检测有没有该参数,有的话会直接在客户端显示一个『取消订阅』的按钮。比如Gmail中有时候就会显示,点击这个按钮就会自动往 unsubscribe@test.com 发送一封邮件,我们需要实时去检测 unsubscribe@test.com 邮箱中有没有收到用户发送的邮件,有的话下次就别再给该用户发邮件了,否则处罚严重。

    如果你不设置这个参数很容易被邮件服务商拒收或者限制频率。List-Unsubscribe参数是设置在Email协议的请求头中,并不是在邮件内容中添加一个『取消订阅』的超链接。

  4. 调试技巧

    可以到 http://www.mail-tester.com/ 去看邮件的得分情况,主要就是检测如上参数,生效与否一目了然。

    Gmail中可以查看原始邮件的内容,https://mail.google.com/mail/u/0/#inbox

配置了如上所有参数之后,我们平台发送的邮件到测试平台测试得分基本在99分以上,皆大欢喜!不过开心的太早了,通过配置各种协议和参数我们只能提高邮件的到达率,但是并不能保证邮件不被拒收。国内的邮件服务商网易和腾讯属于邮箱巨头,这两巨头并不是所有邮件都收,他们的策略如下:

  1. 每分钟,每小时,每天都有对应的发送量限制;

    针对不同的厂商我们通过计划任务去执行不一样的发送频率,比如网易的每分钟只发15个,腾讯的每分钟只发20个,以此类推……但是我们有上百万封邮件要发送,肯定不能发几个月。于是申请了多个邮箱来同时发送,这些发送逻辑都能通过代码实现,代码能解决的问题都不算问题。

  2. 邮件内容的质量把控

    归根到底如果邮件内容的质量很低,技术优化的再好用户还是会扔到垃圾桶或者举报。举报的次数一多,邮件服务商给的额度就越低,比如一分钟只让发5封……100万封得发送2年(当然真实情况不会这样,加入邮件服务商的联盟之后都好办)。

    所以我们花了大量的工作在邮件内容的把控上,每一封发出去的邮件都需要多人审核,多端多平台样式测试。最后确保每一封邮件都很精致,让用户有欲望打开。当然作为程序员,很多我很反感和觉得不适合的内容最后还是会发送到用户手中,这点技术没办法优化。

四. 最后

现在EDM平台能保证邮件的到达率保持在96%以上,百万级别的邮件发送一次就是几千块钱的费用,如果不努力提高送达率就是把钱打水漂,做这个功能也没有存在的意义。写代码时间越久就越发的觉得技术只是拿来服务用户的,如果代码产生不了价值其实就是垃圾代码。

我的博客:搭建百万级别邮件发送平台

 

原文链接

 

本文转载自:http://click.aliyun.com/m/24379/

共有 人打赏支持
_夜枫
粉丝 9
博文 506
码字总数 0
作品 0
朝阳
后端工程师
“撒币”狂欢在直播,如何成为稳定的大“撒币”平台? | 产品经理说第1篇

时隔十年后的撒币狂欢 2008年一部《贫民窟的百万富翁》把丹尼·博伊尔推到了电影殿堂的最高峰奥斯卡最佳外语片大奖,电影中把来自贫民窟的印度街头少年贾马勒刻画成靠知识走向成功殿堂的楷模...

OneAPM蓝海讯通 ⋅ 01/24 ⋅ 0

一个智能家居平台有百万终端,上万管理用户,目前用的mina框架但是不知道如何做心跳如何在平台与终端间传输数据

@老盖 你好,想跟你请教个问题:一个智能家居平台有百万终端,上万管理用户,目前用的mina框架但是不知道如何做心跳如何在平台与终端间传输数据;第一个问题:我如何让百万终端跟平台保持通讯...

stephen_118 ⋅ 2015/07/05 ⋅ 3

AfterLogic WebMail-类似126的网页邮件客户端详细介绍

原文来自龙博方案网http://www.fanganwang.com/product/1444 类似126的邮件客户端 类似126的邮件客户端 类似126的邮件客户端 类似126的邮件客户端 AfterLogic WebMail-类似126的网页邮件客户...

javascript1 ⋅ 2014/06/03 ⋅ 0

beego日志处理

1. 使用入门 beego 的日志处理是基于 logs 模块搭建的,内置了一个变量 ,默认已经是 类型,初始化了 console,也就是默认输出到 2. 设置输出 我们的程序往往期望把信息输出到 log 中,现在设...

huwh_ ⋅ 2017/09/10 ⋅ 0

直播竞答的技术痛点及解决方案详解

2018 年元旦刚刚过去不久,互联网的第一个风口就来了。百万英雄、冲顶大会、芝士超人等互联网竞答 App 点燃了新年的第一把火。 只需答对 12 题,即可瓜分百万奖池,重赏之下必有勇夫,一时间...

又拍云 ⋅ 01/11 ⋅ 0

乐视秒杀架构解读:从零开始搭建百万每秒订单系统

在各种秒杀活动大行其道的今天,订单系统的性能与稳定日益重要。乐视集团作为这一技术的佼佼者,在多次的电商狂欢节中都能抢占商机、拔得头筹,其表现无疑为其他企业和厂商提供了非常有价值的...

DBAplus社群 ⋅ 2016/06/15 ⋅ 0

分布式TCP推送系统--GPush

一个linux下高效的,分布式TCP推送系统实现,单台连接服务器支撑超过百万以上连接,主要适用于千万在线级别规模的应用,对比第三方推送平台,主要优势在于,服务自建,推送效率高,而且可以很...

老强 ⋅ 2016/03/17 ⋅ 0

小米开源监控系统OpenFalcon应对高并发7种手段

小米开源监控系统OpenFalcon应对高并发7种手段 原创 2016-04-01 秦晓辉 高可用架构编者按:本文是秦晓辉在 3 月 27 日数人云“百万并发”活动的演讲,授权「高可用架构」首发。转载请注明来自...

tantexian ⋅ 2016/07/18 ⋅ 0

电子邮件存储系统--ElasticInbox

ElasticInbox 是一个开源、可靠、分布式、可伸缩的 Email 存储系统。其目标是提供高可用的电子邮件存储,杜绝单点故障,可进行线性的伸缩;支持数以百万级的邮箱,每个邮箱成百上千的邮件。支...

匿名 ⋅ 2013/03/27 ⋅ 1

环信即时通讯的技术要点学习【转】

转自: http://www.biaodianfu.com/huanxin.html 即时通讯(IM)功能是APP的重要功能之一,而开发好移动IM却绝非易事。通常来说,IM技术选型至少要解决以下问题: 协议选型 IM服务器选型 对协议...

强子哥哥 ⋅ 2016/06/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从零开始搭建Risc-v Rocket环境---(1)

为了搭建Rocke环境,我买了一个2T的移动硬盘,安装的ubuntu-16.04 LTS版。没有java8,gcc是5.4.0 joe@joe-Inspiron-7460:~$ java -version程序 'java' 已包含在下列软件包中: * default-...

whoisliang ⋅ 11分钟前 ⋅ 0

大数据学习路线(自己制定的,从零开始学习大数据)

大数据已经火了很久了,一直想了解它学习它结果没时间,过年后终于有时间了,了解了一些资料,结合我自己的情况,初步整理了一个学习路线,有问题的希望大神指点。 学习路线 Linux(shell,高并...

董黎明 ⋅ 17分钟前 ⋅ 0

systemd编写服务

一、开机启动 对于那些支持 Systemd 的软件,安装的时候,会自动在/usr/lib/systemd/system目录添加一个配置文件。 如果你想让该软件开机启动,就执行下面的命令(以httpd.service为例)。 ...

勇敢的飞石 ⋅ 19分钟前 ⋅ 0

mysql 基本sql

CREATE TABLE `BBB_build_info` ( `community_id` varchar(50) NOT NULL COMMENT '小区ID', `layer` int(11) NOT NULL COMMENT '地址层数', `id` int(11) NOT NULL COMMENT '地址id', `full_......

zaolonglei ⋅ 28分钟前 ⋅ 0

安装chrome的vue插件

参看文档:https://www.cnblogs.com/yulingjia/p/7904138.html

xiaoge2016 ⋅ 31分钟前 ⋅ 0

用SQL命令查看Mysql数据库大小

要想知道每个数据库的大小的话,步骤如下: 1、进入information_schema 数据库(存放了其他的数据库的信息) use information_schema; 2、查询所有数据的大小: select concat(round(sum(da...

源哥L ⋅ 53分钟前 ⋅ 0

两个小实验简单介绍@Scope("prototype")

实验一 首先有如下代码(其中@RestController的作用相当于@Controller+@Responsebody,可忽略) @RestController//@Scope("prototype")public class TestController { @RequestMap...

kalnkaya ⋅ 58分钟前 ⋅ 0

php-fpm的pool&php-fpm慢执行日志&open_basedir&php-fpm进程管理

12.21 php-fpm的pool pool是PHP-fpm的资源池,如果多个站点共用一个pool,则可能造成资源池中的资源耗尽,最终访问网站时出现502。 为了解决上述问题,我们可以配置多个pool,不同的站点使用...

影夜Linux ⋅ 今天 ⋅ 0

微服务 WildFly Swarm 管理

Expose Application Metrics and Information 要公开关于我们的微服务的有用信息,我们需要做的就是将监视器模块添加到我们的pom.xml中: 这将使在管理和监视功能得到实现。从监控角度来看,...

woshixin ⋅ 今天 ⋅ 0

java连接 mongo伪集群部署遇到的坑

部署mongo伪集群 #创建mongo数据存放文件地址mkdir -p /usr/local/config1/datamkdir -p /usr/local/config2/data mkdir -p /usr/local/config3/data mkdir -p /usr/local/config1/l......

努力爬坑人 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部