公司有业务网站跑在AWS 的EC2上,要求用户帐号用邮件注册。这就要求网站要向邮件注册用户发送一个激活邮件。也就是说,要对外发送邮件。在国内的阿里云或Ucloud很方便,在VPS上架个postfix, 再在DNS上设置个mx+spf记录,就可以对外发送邮件了。但在AWS的EC2上就没那么方便了。因为AWS把EC2对外的25端口给封掉了,无法对外连接TCP 25端口。这就只能申请使用他们的 SES(simple Email Service)了。下面是我解决在EC2上发送邮件问题的思路,具体方法可以参考我给的链接,就不再重复造轮子了。
首先在EC2上是无法对外访问TCP 25端口
AWS上的EC2实例是无法对外访问TCP 25端口的,即使你在安全组上设置对外全开也是不起作用的。具体可以查看下面的官方链接 。有趣的是即使你Request to Remove Email Sending Limitations ,也是不会给你回复的。推荐的方法是使用Connecting to the Amazon SES SMTP Endpoint aws的SES服务。
具体SES的申请可以参考下面的页面
如何在AWS中发送电子邮件,中文的,自己看一下就可以了。
申请SES大概下面几步:
- 域名认证,也就是在你的申请域中加一个认证用的TXT记录
- 然后要求向客服发一个CASE,一个Limit Increase: SES Sending Limits的CASE。不然你只能对你在控制台中做过认证的邮箱发邮件。这个我也搞了两天,因为第一次发申请时,没有把AWS所有要求的条件选YES(AWS 处理CASE的频率大概是4小时左右一次)。记得把下图的几个都先上YES哈。
我就是第一次因为没有把YES都选上,直接被拒绝了。多一个来回就是两天。 - 申请的每天发送邮件的数量是 10000/day,AWS给我批的是50000/day
在申请开通SES的limit后,就可以配置邮件发送的方式了
- 你可以在SMTP Settings里点击 “Create My SMTP Credentials”,这将可以生成一个用户名密码对,可用于向SES认证。
- 在DNS中配置 MX 记录指向 inbound-smtp.us-west-2.amazonaws.com (根据你的SES服务所在的区域配置)
将 Amazon SES 与 postfix 集成
- 说一下,进行这个操作的原因:我们的业务是向提供注册用户的邮箱发送一个账号激活邮件,也就是只发不收。代码是php实现的,没有做异步机制,所以在本机启动一个postfix,php直接向本机的SMTP发送邮件,可以实现邮件更快的发送,提升用户在做邮箱注册时的体验。
- 具体配置方式AWS已经有很好的中文文档了,点击链接按文档配置就可以了。
- 最后,说一下原理吧,php 程序把邮件发送到—-127.0.0.1:25的Postfix, Postfix 把邮件relayhost到—-Stunel的2525端口,Stunel用TLSv1连接到—-SES服务器(email-smtp.us-west-2.amazonaws.com:465端口),最后SES对外发送邮件。使用这个方案,就是因为php向127.0.0.1:25的Postfix发送邮件会比较快。
这样,整个AWS上实现对外邮件发送的功能就算完成了,用SES对外发邮件的一个好处是向国外的hotmail和Gmail发送邮件不会进垃圾邮箱 ,哈哈。
我没有把具体的操作都贴出来,更多的是给了相关的链接和实现原理。因为AWS的文档已经很完善了,不用再重复造轮子了。