YodaNote启用了可靠的邮件服务,基于Amazon SES


YodaNote在最开始使用BAE内置的邮件服务,开始时能够给大部分邮箱发送邮件,而且还能够设置users(at)yodanote.com地址作为发件人。但很快发现发到qq.com的邮件经常发送失败,经过追查发现,是因为QQ邮箱对于外来地址进行了IP频率限制,具体一个IP最多能发送多少,它又作为内部机密不透露出来。没办法向BAE反映这个问题,似乎安静了一段时间。后来发现aol.com的邮件经常发不出去,有时发现发送异常时就只有手工发一下。

直到某一天,突然发现除了163.com的邮箱,其它很多邮箱似乎就发不到,而且不再能够显示users(at)yodanote.com这样的发件人地址,显示的是noply(at)duapp.com之类,而且很可能在进入用户邮箱的垃圾箱,我意识到问题的严重,就赶紧找解决办法。在BAE环境下,BAE禁用了PHP的mail等方法,而且没有openssl模块,无法使用SSL连接SMTP,似乎没有更好的办法了。在SAE里情况差不多,所幸的是SAE提示一种SMTP发送邮件的方式,每天可以最多500封,目前来看足够用了。就很快在SAE做了一个SMTP发送邮件的页面,测试发现,只有qq.com或者163.com这样的大众邮箱可以SMTP,而users(at)yodanote.com这样的企业域名邮箱,无法正常使用SMTP发送邮件。各种抓耳挠腮撞墙无奈。一时没有更好的办法,只有使用我的163.com的个人邮箱,使用SMTP方式给用户发送邮件。然后给所有用户写了个邮件,说明了这种情况,另外一方面着手找更可靠的邮件服务。

首先想到收费稳定的邮件服务,比如国内sendcloud,最低每月要59,而且我目前每月只有1k左右的发送量,显然大材小用,而且如此屌丝的我只能把这当作最后的选择。国外其它收费的邮件服务,有些地方可能更便宜一些,但觉得到不得不的地步才会使用。

然后想到使用Amazon的服务,能够每天免费2000封,而且收费价格也适中。但查看知乎的使用经验,显示为amazonses.com代发,不够专业可靠,后来又了解到Amazon SES能够支持DKIM签名,似乎还是可以的。然后就费了一番周折,搭建起EC2,通过域名的DKIM验证。其中有一个搞笑的地方,我翻遍了Amazon文档,在管理界面找了N遍,一直找不到启用DKIM签名的按钮,最后只有去Amazon论坛里求助,有人告诉我在域名的左边有个小图标......顿时傻了,这个小图标见了N次,一直以为只是标志化的图标,而没想到是按钮,由它展开的详细页面里,才能启用DKIM。这样将域名与邮箱的DKIM签名功能启用后,再发邮件,会自动加上DKIM。这样的邮件在gmail里不会显示由amazonses.com代发了,在hotmail等也能显示正常,不会进入垃圾箱,但在163.com仍然显示amazonses.com代发,更可恶的是qq.com,是根本连邮箱都进不了,同样因IP频率限制,给拒掉了。真是冤啊,别人发垃圾邮件,但我们不发,也成受害者了。没办法对于qq.com这样的特殊大人物区别对待,仍然使用SMTP给qq.com发。

但别高兴太早,远远还没有把问题解决了,因为本网站在BAE上,直接与EC2通讯是不合适的,因为有伟大的GFW,EC2的服务很可能被盾掉,而且连接超时的情况下,是无法集成到网站里。只使用异步模式+Pull模式才可行,初步的方案是将邮件任务放置在云存储内,然后由EC2来定时查询与取邮件任务。因为EC2上访问国内BAE是没有问题,这个GFW不是双向的,很牛叉的。但仍然有个问题,这样EC2处要定时查询,即使是10秒一次,邮件平均也要多延时5秒,而且这样频繁的查询显然对BAE的网站也形成不必要的负担。然后想到一个折中的方案,触发与轮询结合:BAE发送邮件时,将邮箱任务保存到云存储内,然后发送一个调用EC2的触发事件到队列中。EC2如果被调用到,将会及时将邮件任务取出并发送出来,而同时EC2又有定时Cron任务保证在触发失效后,仍然能够发送出去。

实际使用表明,目前异步触发机制运行良好,即使EC2因为IP或者GFW盾掉,预计定时查询还是能够保证的,这样基于Amazon SES的DKIM,并穿越GFW,补充BAE不足,一个完全免费而又可靠的邮件服务可以使用了。

虽然这个可靠的邮件服务方案比较屌丝,期间也费了很大的周折,但总体上还是非常超值,特别是Amazon的稳定服务与百度的方便易用的BAE结合,真是绝配到家了。


返回目录