从SMTP到阿里云邮件推送

EndlessLethe原创文章,转载请注明: 转载自小楼吹彻玉笙寒

本文链接地址: 从SMTP到阿里云邮件推送

前言

本文前半部分介绍了SMTP,后半部分讲述了如何通过阿里云SMTP Server来实现WordPress的推送。

事实上,我们是先在阿里云ECS通过SMTP发送邮件到Server上,阿里云Server再帮我们转发到目标邮箱。

SMTP

基本原理

SMTP协议最早在RFC 821(1982年)中定义,最后更新是在RFC 5321(2008年)中,更新中包含了扩展SMTP(ESMTP)。
Model for SMTP
two host (server) are connected to the same transport service, or via one or
more relay SMTP-servers when the source and destination hosts are not
connected to the same transport service.

The argument to the MAIL command is a reverse-path, which specifies
who the mail is from. The argument to the RCPT command is a
forward-path, which specifies who the mail is to. The forward-path
is a source route, while the reverse-path is a return route (which
may be used to return a message to the sender when an error occurs
with a relayed message).

上图实际上只展示了Server和Server之间使用SMTP,实际上上传的Client端也是通过SMTP连接。而下载的Client端则是通过POP3和IMAP来下载邮件。

本文不想在SMTP的基础内容上叙述太多。想了解基本原理的朋友可以看”Computer Networking: A Top-Down Approach”的SMTP一章。

基本命令

最初的SMTP协议不包含安全认证的,所谓的ESMTP在安全性方面扩展了SMTP,通过增加命令EHLO和AUTH。如今的SMTP服务器,无论是公网的还是内网的,大都要求安全认证。

  1. HELO
    标识自己的ip(域名)。通常服务器会响应OK,AUTH LOGIN后便可以输入MAIL开始准备传文件了。但用户名和密码通常需要先按一定方式加密,再提交,所以推荐使用EHLO(先获取加密方式)。

  2. MAIL FROM:CR.LF

  3. RCPT TO:CR.LF
    RCPT TO标识接收者的邮件地址。如果邮件接收者不是本地用户,则说明希望对方邮件服务器为自己转发(Relay)邮件。如果该邮件服务器是OPEN RELAY的,那么该机器就会转发这个邮件,否则说明该服务器不允许RELAY。1

  4. DATA CR.LF
    说明后面的内容为数据(7位ASCII)

  5. EHLO
    向服务器表明自己支持扩展简单邮件传输协议 (ESMTP) 命令。服务器会返回一些ESMTP的配置项,其中包括加密方式。

  6. AUTH LOGIN
    进行用户身份认证。服务器会返回加密后的”Username:”,比如base64的”VXNlcm5hbWU6″

基本流程

  1. 建立TCP连接
  2. 客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令;服务器端正希望以OK作为响应,表明准备接收
  3. 客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行;服务器端则表示是否愿意为收件人接收邮件
  4. 协商结束,发送邮件,用命令DATA发送
  5. 以.表示结束输入内容一起发送出去
  6. 结束此次发送,用QUIT命令退出
    例子见“任性DIY——赤裸的技术人生之剥开SMTP的衣裳”和“使用 SMTP 发送邮件”。

常见Server响应

本来想简单地粘贴复制,但是下面的两行内容引起了我的注意:2

251——用户非本地,将转发向<forward-path>  
551——用户非本地,请尝试<forward-path>  

这两句话是什么意思呢?

参考RFC 3463,协议把状态码分为了’2”4’和’5’开头的三类,其中’2’代表”Success”,’5’代表Permanent Failure。嗯…?好像有点不太对吧,551显然应该不会再尝试了,因为已经返回”Permanent Failure”。

RFC 821中其实提到了:

Either
S: RCPT TO:<Postel@USC-ISI.ARPA>
R: 251 User not local; will forward to <Postel@USC-ISIF.ARPA>
Or
S: RCPT TO:<Paul@USC-ISIB.ARPA>
R: 551 User not local; please try <Mockapetris@USC-ISIF.ARPA>

这两个response不同的原因是reciver的设置不同。一个reciver选择了forward(relay),而另外一个拒绝,而交给Sender自行修改。
而在现在,551出现的原因更多是因为安全验证的原因。
在“SMTP Status Codes, SMTP Error Codes, SMTP Reply Codes”:

SMTP Status 251 : User not local will forward to <forward-path>
    The email account is not local to the ISP server but the ISP server will accept the email and will forward it.
SMTP Error 551 : User not local or invalid address – Relay denied.
    If neither the sending mail address nor the recipient’s address are locally hosted by the server, then the ISP’s servers may refuse to relay the message on.

551 error是因为ISP为了避免垃圾邮件而拒绝不可信(没有auth)来源的转发请求。

SMTP errors and reply codes“提供了面对errors的解决方案。
以上两篇文章详细讲解了常见Server的响应。

阿里云配置邮件推送

  1. 开通阿里云邮件推送服务
  2. 进入“发信域名”,点击新建域名,并输入“emai.域名”作为后缀
  3. 根据确认后出现的提示,在域名解析中添加相应的记录
    (注:这个解析记录和企业邮箱的记录不同。企业邮箱应该是在购买域名后自动开通、自动添加的)
  4. 添加完成后,在“发信域名”中验证
  5. 进入“发信地址”,点击“新建发信地址”。回信地址可以使用企业邮箱的子账户来避免回信过多干扰日常生活,其主要功能是接受未能成功发送的邮件reply。
  6. 验证回信地址并设置密码,即完成SMTP邮箱注册
    参考文献

WordPress配置SMTP

  1. 下载插件WP Mail SMTP或SMTP Mailer。个人推荐SMTP Mailer,因为功能相似,SMTP Mailer维护更频繁
  2. 按照下图配置
    wp SMTP setting
  3. 注意SMTP的SSL和网站的SSL不是一回事。推荐使用SSL端口使用466。阿里云服务器封禁了出口方向的25端口 4

1 评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注