邮件系统之smtp协议
1 smtp
SMTP称为简单邮件传输协议(Simple Mail Transfer Protocal),目标是向用户提供高效、可靠的邮件传输。它的一个重要特点是它能够在传送中接力传送邮件,即邮件可以通过不同网络上的主机接力式传送。通常它工作在两种情况下:一是邮件从客户机传输到服务器;二是从某一个服务器传输到另一个服务器。SMTP是一个请求/响应协议,它监听25号端口,用于接收用户的Mail请求,并与远端Mail服务器建立SMTP连接。
2 smtp协议交互
SMTP通常有两种工作模式。发送SMTP和接收SMTP。具体工作方式为:发送SMTP在接收到用户的邮件请求后,判断此邮件是否为本地邮件,若是直接投送到用户的邮箱,否则向DNS查询远端邮件服务器的MX记录,并建立与远端接收SMTP之间的一个双向传送通道,此后SMTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方向传送。一旦传送通道建立,SMTP发送者发送MAIL命令指明邮件发送者。如果SMTP接收者可以接收邮件则返回OK应答。SMTP发送者再发出RCPT命令确认邮件是否接收到。如果SMTP接收者接收,则返回OK应答;如果不能接收到,则发出拒绝接收应答(但不中止整个邮件操作),双方将如此反复多次。当接收者收到全部邮件后会接收到特别的序列,入伏哦接收者成功处理了邮件,则返回OK应答。
SMTP的连接和发送过程
(a)建立TCP连接
(b)客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令;
服务器端正希望以OK作为响应,表明准备接收
(c)客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行;
服务器端则表示是否愿意为收件人接收邮件
(d)协商结束,发送邮件,用命令DATA发送
(e)以.表示结束输入内容一起发送出去
(f)结束此次发送,用QUIT命令退出
C: telent SMTP.163.com 25 //以telenet方式连接163邮件服务器 S: 220 163.com Anti-spam GT for Coremail System //220为响应数字,其后的为欢迎信息 C: HELO SMTP.163.com //除了HELO所具有的功能外,EHLO主要用来查询服务器支持的扩充功能 S: 250-mail S: 250-AUTH LOGIN PLAIN S: 250-AUTH=LOGIN PLAIN S: 250 8BITMIME //最后一个响应数字应答码之后跟的是一个空格,而不是'-' C: AUTH LOGIN //请求认证 S: 334 dxNlcm5hbWU6 //服务器的响应——经过base64编码了的“Username”= C: Y29zdGFAYW1heGl0Lm5ldA== //发送经过BASE64编码了的用户名 S: 334 UGFzc3dvcmQ6 //经过BASE64编码了的"Password:"= C: MTk4MjIxNA== //客户端发送的经过BASE64编码了的密码 S: 235 auth successfully //认证成功 C: MAIL FROM: bripengandre@163.com //发送者邮箱 S: 250 … . //“…”代表省略了一些可读信息 C: RCPT TO: bripengandre@smail.hust.edu.cn //接收者邮箱 S: 250 … . // “…”代表省略了一些可读信息 C: DATA //请求发送数据 S: 354 Enter mail, end with "." on a line by itself C: Enjoy Protocol Studing C: . S: 250 Message sent C: QUIT //退出连接 S: 221 Bye
3 smtp协议指令
SMTP 命令 | 命令功能 |
---|---|
HELO |
客户端为标识自己的身份而发送的命令(通常带域名) |
EHLO |
使服务器可以表明自己支持扩展简单邮件传输协议 (ESMTP) 命令。 |
MAIL FROM |
标识邮件的发件人;以 MAIL FROM: 的形式使用。 |
RCPT TO |
标识邮件的收件人;以 RCPT TO: 的形式使用。 |
TURN |
允许客户端和服务器交换角色,并在相反的方向发送邮件,而不必建立新的连接。 |
ATRN |
ATRN (Authenticated TURN) 命令可以选择将一个或多个域作为参数。如果该会话已通过身份验证,则 ATRN 命令一定会被拒绝。 |
SIZE |
提供一种使 SMTP 服务器可以指出所支持的最大邮件大小的机制。兼容的服务器必须提供大小范围,以指出可以接受的最大邮件大小。客户端发送的邮件不应大于服务器所指出的这一大小。 |
ETRN |
SMTP 的扩展。SMTP 服务器可以发送 ETRN 以请求另一台服务器发送它所拥有的任何电子邮件。 |
PIPELINING |
提供发送命令流(而无需在每个命令之后都等待响应)的能力。 |
CHUNKING |
替换 DATA 命令的 ESMTP 命令。该命令使 SMTP 主机不必持续地扫描数据的末尾,它发送带参数的 BDAT 命令,该参数包含邮件的总字节数。接收方服务器计算邮件的字节数,如果邮件大小等于 BDAT 命令发送的值时,则该服务器假定它收到了全部的邮件数据。 |
DATA |
客户端发送的、用于启动邮件内容传输的命令。 |
DSN |
启用传递状态通知的 ESMTP 命令。 |
RSET |
使整个邮件的处理无效,并重置缓冲区。 |
VRFY |
确认在邮件传递过程中可以使用邮箱;例如, |
HELP |
返回 SMTP 服务所支持的命令列表。 |
QUIT |
终止会话。 |
扩展的 SMTP 命令 | 命令功能 |
---|---|
X-EXPS GSSAPI |
Microsoft Exchange Server 2003 和 Exchange 2000 Server 服务器用来进行身份验证的方法。 |
X-EXPS=LOGIN |
Exchange 2000 和 Exchange 2003 服务器用来进行身份验证的方法。 |
X-EXCH50 |
在服务器到服务器通信的过程中,提供传播邮件属性的能力。 |
X-LINK2STATE |
在 Exchange 中添加链接状态路由支持。 |
4 smtp协议返回码
状态码 | 描述 |
---|---|
211 | System status, or system help reply 系统状态或显示系统帮助。 |
214 | Help message 显示系统帮助,通常用于显示非标准命令的帮助。 |
220 | <domain> Service ready 服务就绪。 |
221 | <domain> Service closing transmission channel 服务关闭了传输通道。 |
250 | Requested mail action okay, completed 所要求的邮件动作完成,可以继续邮件对话。通常在EHLO/HELO命令后会通过“250-”来描述服务器所支持的特性。 |
251 | User not local; will forward to <forward-path> 收件人非本地用户,将转发到 <forward-path>。 |
354 | Start mail input; end with <CRLF>.<CRLF> 开始接收邮件内容输入,以<CRLF>.<CRLF>(即单行一个点)结束输入。 |
421 | <domain> Service not available, closing transmission channel 无法提供正常服务,关闭传输管道。邮件保留在本地,可能会尝试重新投递。通常这种情况发生在服务器遇到问题,必须关闭传输。 |
450 | Requested mail action not taken: mailbox unavailable 所要求的邮件动作无法执行:邮箱不可用。邮件保留在本地,可能会尝试重新投递。通常这种情况发生在邮箱忙或被拒绝等。 |
451 | Requested action aborted: local error in processing 要求动作中断:本地端发生错误。邮件保留在本地,可能会尝试重新投递。通常这种情况发生在系统投递时遇到意外的错误。 |
452 | Requested action not taken: insufficient system storage 要求动作无法执行:系统空间不足。邮件保留在本地,可能会尝试重新投递。通常这种情况发生在邮箱限额满。 |
500 | Syntax error, command unrecognized 命令格式错误,不可识别。当命令行太长时也会发生这样的错误。 |
501 | Syntax error in parameters or arguments 命令参数错误。 |
502 | Command not implemented 命令尚未实现。 |
503 | Bad sequence of commands 错误的命令顺序。 |
504 | Command parameter not implemented 命令的参数尚未实现。 |
543 | |
550 | Requested action not taken: mailbox unavailable 所要求动作无法执行:信箱不存在。不再尝试投递。 |
551 | User not local; please try <forward-path> 收件人不属于本地用户,转发到<forward-path>。不再尝试投递。 |
552 | Requested mail action aborted: exceeded storage allocation 所要求的动作中断:超出所分配的储存空间。不再尝试投递。 |
553 | Requested action not taken: mailbox name not allowed 所要求的动作未执行:不接受该信箱。通常发生在邮件地址错误、被作为垃圾邮件拒收。不再尝试投递。 |
554 | Transaction failed 传输失败。 |