做了四个月的邮件系统,准备修改为开源版本,收集意见中~

2014-09-13 11:29:28 +08:00
 vincenting
做这个项目的初衷很简单,很多人吐槽mailgun、sendcloud的独立IP价格略贵,同时mailgun不能有效的去兼容特别是QQ的发送规则,目前的产品形态参加 http://jianxin.io/ (应该会在下面的某天关闭),简单介绍下现在的设计以及准备修改并且开源的版本。

当前功能(忽略各种用户体系):

1. 自动生成 dkim 的记录值,并检测 dns 情况。
2. 邮件分为普通邮件和紧急邮件,其中普通邮件为根据队列发送的邮件,紧急邮件为立刻发送的邮件。
3. 发送中遇到错误,分析是否为用户不存在,否则暂停发送一段时间后继续发送。
4. 支持 SMTP 协议以及 HTTP 协议的接口调用,并可选使用长连接直接返回邮件发送结果。

目前想到的开源版的功能:

1. 去除目前的用户体系,将域名添加变成域名和发送IP添加(可以使用自己的VPS进行发送,并且可以绑定反向域名解析)。
2. 增加针对收件域(例如 QQ)的发件频率控制。
3. 更丰富的日志。

如果想了解邮件发送的原理,可以参考我之前写的帖子 : http://blog.segmentfault.com/vincent/1190000000661065

当前的代码结构:

1. 发送器(golang实现),postfix 或者 nodemail 同等级的服务。负责邮件任务的处理(邮件队列、邮件的投递、以及邮件返回错误的初步处理(判断是否为收件人不存在))。
2. 服务分发(golang实现),目前主要负责和发送器间的通讯,以及发送器健康状况的检测。
3. API 服务(Ruby的cramp实现),HTTP 调用方式的请求服务,包括发邮件、获取发送列表、当前用户状态等等的接口。
4. 业务服务(Ruby的sinatra实现),就是你可以看到的网站自身。
5. MTA(Nodejs实现),负责将SMTP协议的请求转发给 API 服务。

思考了好久才决定转化为开源产品,如果有负责过邮件的前辈,希望分享下曾经遇到过的其他问题,大家一起来打造一款更好的开源邮件服务。
14140 次点击
所在节点    程序员
73 条回复
ichou
2014-09-13 18:17:06 +08:00
@qiuai 正在调试问题 不过我无法再现你的错误
方便给我邮件吗? me(at)ichou.cn 麻烦您了
coosir
2014-09-13 18:31:18 +08:00
很赞,前端也很厉害哦,一直很期望这方面有比较好的开源系统。
lfzyx
2014-09-13 18:40:40 +08:00
话说ls诸位都不关心lz用哪种开源协议吗?
qiuai
2014-09-13 18:58:02 +08:00
@ichou 已经发送邮件,我无法在服务器上ping通api.jianxin.io,没有禁用任何函数.
vincenting
2014-09-13 19:04:50 +08:00
@qiuai 因为我禁 ping 了,尝试 curl 'http://api.jianxin.io'
vincenting
2014-09-13 19:05:29 +08:00
@lfzyx 目前考虑采用 GPL 协议进行开源。
raincious
2014-09-13 19:10:17 +08:00
@vincenting 好严格呢。为什么不用MIT?
vincenting
2014-09-13 19:17:01 +08:00
@dbbbit 恩,我考虑的是单从发送组件说的话,只提供发送频率修改这样的一个功能。还有就是详细的发送结果日志(通过SMTP协议通信后,对方服务最终给出的是否投递成功的日志)。QQ 的的确只是加分项,让用户更好的把握投递频率。

邮件打开率/邮件链接打开率我的理解是通过在邮件内嵌入空白图片标签进行邮件阅读统计,加上类似短域名的类似的服务进行链接打开率统计。这个可以使用开源方案解决。

发送错误处理,我考虑的还是分为两种:
1. 普通广播形式的邮件(例如订阅的文章),这种不需要当日送达。虽然重复投递(间隔很久,会放到队列的最后)可能浪费当日的限额,但是后面的邮件可以依次推迟,放到后面。
2. 紧急并且需要实时投递的邮件,我有设计一个长连接式的接口,直接会返回发送情况,如果投递失败的话,用户可以在多台机器间(或者后期添加发送组的概念,直接程序集成)切换进行直到发送成功,毕竟目前主要还是对IP进行限制。
qiuai
2014-09-13 19:20:34 +08:00
@vincenting
# curl 'http://api.jianxin.io'
Your request couldn't be found
vincenting
2014-09-13 19:27:07 +08:00
@qiuai 恩啊,这个没有问题的。PHP所有版本的代码是 @ichou 提供的,尝试修改下代码,将 'expire' => time() + 10 里面的 10 换成更大的值看看。
qiuai
2014-09-13 19:27:58 +08:00
@vincenting 切换成100后 {"code":200,"id":"54142a2bc2a7**************","msg":"in queue"}
qiuai
2014-09-13 19:30:39 +08:00
@vincenting 什么时候推收费服务?一天30封我目前倒是够用的...但是如果你不知道啥时候就把服务停了...
vincenting
2014-09-13 19:35:39 +08:00
@qiuai 小量邮件建议接入 mailgun(项目很大程度借鉴了 mailgun 的设计)。这个服务很快就要停止维护转而专心准备开源版的项目。

到时候可以关注下开源版,可以在自己 VPS/服务器 上搭建个人版的邮件服务器。
qiuai
2014-09-13 19:37:12 +08:00
@vincenting 好吧...期待开源版本.至少要能完成现在的效果...
vincenting
2014-09-13 20:00:09 +08:00
@raincious

1. 开源是因为我希望对于开发者来说可以有一个更好的邮件发送服务的选择(够用并且好用)
2. 使用 GPL 是因为最终开源的我也会尽力做成产品基本的代码,而不是功能/模块级别的
3. 同时我自己也保留后期商业运作(提供云端邮件系统,让简信复活)这样的可能性(还是有点私心)
dbbbit
2014-09-13 20:08:07 +08:00
@vincenting
测试方面,是否有比较好的解决方案?
vincenting
2014-09-13 20:17:19 +08:00
@dbbbit 测试指的是调整策略来观察投递的效果么?这个的话目前没有,目前都是依赖之前一次大规模投送的经验还有看别人的总结来制定我的规则。实际投递的话风险太大。

如果是开发时候的测试,我是在测试的时候将实际投递的代码换成了模拟投递,随机返回错误。
gentleming
2014-09-13 20:29:11 +08:00
前端很赞,顶一个。
期待将来有机会能使用。
iwinux
2014-09-14 09:04:54 +08:00
看了一眼 UI 就觉得应该会很赞 XD

关于应用的部署和分发,如果依赖较多的话(比如需要 Ruby + Node.js),可以试试用 https://github.com/opscode/omnibus 将应用打包成 all-in-one 的安装包(支持 deb / rpm)~

期待项目的开源
TrickLin
2014-09-14 09:12:46 +08:00
支持,太赞

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/133221

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX