概要
SMTP,即Simple Mail Transfer Protocol,是基于TCP/IP用于发送邮件的协议。
从邮件发送到邮件接收,有三个阶段:
- 客户端通过SMTP协议将邮件发送给自己的邮件服务器;
- 邮件服务器通过SMTP协议把邮件投递到收件人的邮件服务器;
- 收件人借助POP3/IMAP从自己的邮件服务器收取最新的邮件。
发送邮件过程中用到SMTP的有两个阶段submitting(客户端发送给邮件服务器)和relaying(一个邮件服务器投递邮件给另一个邮件服务器)(也称transfer阶段)。
submitting
- 登录认证:需要进行登录认证,再发信。
- 端口:理论上使用587,这个端口需要身份认证。如果使用25作为submitting阶段的端口,很可能会被一些ISP拦截,QQ邮箱和163邮箱暂时不存在这种情况。
- 域名:从邮件服务商的官网获取。
relaying
- 登录认证:无需进行登录认证,而且由于不同邮件服务商的账号体系不一致,也不可能进行身份认证。
- 端口:理论上使用25。
- 域名:可以通过nslookup/dig/host等命令获取该服务器的MX地址。
SMTP的端口与服务器
SMTP的服务器
如果要连接SMTP服务器,依然是得分submitting阶段和relaying阶段,
submitting阶段的host
submitting阶段的SMTP服务器可以从邮件服务商的官网获取。
relaying阶段的host
relaying阶段的host,我们可以通过nslookup/dig/host等工具,查询邮件服务器的MX记录。
什么是MX记录
MX记录(MX Record)是DNS中的一种资源记录类型,使用dig工具可以查询邮箱的MX记录。每个MX记录左边有一个表示优先级的数值,越小表示优先级越大。可以选择优先级最高的MX记录用于relaying阶段的host,向它投递邮件。
SMTP的端口
SMTP相关的端口有这几个,25/587/465
- 25:该端口默认是不支持SSL并且不用身份认证,而且很多ISP会拦截该端口的请求,所以推荐用于relaying阶段。
- 587:该端口需要身份认证,推荐用于submitting阶段。
- 465:这个端口设计的初衷是用于SSL连接,但是最终未被IETF采纳。建议不使用它。
但是,很多邮件服务器在submitting阶段,可以通过25/587建立TCP明文连接,然后再通过starttls和服务器进行协商,把TCP明文连接升级为SSL/TLS连接。如果希望在和服务器第一次建立连接就是一个SSL/TLS连接,则不得不使用465端口。
SMTP的返回码
SMTP协议是通过一系列命令来实现身份认证以及发送邮件。服务器收到每一条命令,都会返回一个2yz~5yz(200多到500多)区间的返回码,不同返回码有不同的含义。SMTP除了提供用于发送邮件的命令,还有一系列工具类型的命令,比如VRFY/EXPN。
SMTP发送一封邮件,可以分为五个阶段,下面是这五个阶段各自使用的SMTP命令。
- 建立会话:HELO/EHLO
- 身份认证:AUTH LOGIN/PLAIN/NTLM/etc
- 发送邮件信封:MAIL FROM,RCPT TO(有多个收件人时,需要执行多次RCPT TO)
- 发送邮件内容:DATA
- 关闭会话:QUI
SMTP不同的返回码具备不同的含义:
-
2yz:命令被成功处理。
-
3yz:命令被成功处理,但是服务器需要更多信息才能完成任务,比如auth和data命令就会遇到3yz的返回。
-
4yz:表示服务器发生暂时性的失败,客户端可以进行重试直至成功(2yz)或者失败(5yz)。
-
5yz:发生不可恢复错误。
返回码221,它表示连接已断开,发送QUIT指令成功后,会返回221,每个请求都可能遇到返回221表示连接已断开。
利用
在swaks中,可以通过配置SMTP,来绕过SPF伪造邮件。