TOC

SMTP 拓展

RFC#821 定义的 SMTP 协议非常简单(简陋):

HELO <SP> <domain> <CRLF>
MAIL <SP> FROM:<reverse-path> <CRLF>
RCPT <SP> TO:<forward-path> <CRLF>
DATA <CRLF>
RSET <CRLF>
SEND <SP> FROM:<reverse-path> <CRLF>
SOML <SP> FROM:<reverse-path> <CRLF>
SAML <SP> FROM:<reverse-path> <CRLF>
VRFY <SP> <string> <CRLF>
EXPN <SP> <string> <CRLF>
HELP [<SP> <string>] <CRLF>
NOOP <CRLF>
QUIT <CRLF>
TURN <CRLF>

1993 年,RFC#1425 SMTP Service Extensions 定义了 SMTP 协议的拓展框架。
这个向前兼容的安全拓展框架是通过 EHLO 命令来实现。

其他相关 RFC:

  • 1999 年,RFC#1651 SMTP Service Extensions
  • 1995 年,RFC#1869 SMTP Service Extensions
  • 2001 年,RFC#2821 Simple Mail Transfer Protocol
  • 2008 年,RFC#5321 Simple Mail Transfer Protocol Draft Standard

示例

220 SendCloud Inbound Server ESMTP Haraka/2.8.25 ready
ehlo localhost
250-SendCloud Inbound Server Hello Unknown [127.0.0.1], Haraka is at your service.
250-PIPELINING
250-8BITMIME
250-SMTPUTF8
250-SIZE 73400320
250-STARTTLS
250 AUTH LOGIN
helo localhost
250-SendCloud Inbound Server Hello Unknown [127.0.0.1], Haraka is at your service.
250-PIPELINING
250-8BITMIME
250-SIZE 73400320
250-STARTTLS
250 AUTH LOGIN
quit
221 SendCloud Inbound Server closing connection. Have a jolly good day.
telnet smtp.qq.com 25
220 newxmesmtplogicsvrszb1-0.qq.com XMail Esmtp QQ Mail Server.
ehlo localhost
250-newxmesmtplogicsvrszb1-0.qq.com
250-PIPELINING
250-SIZE 73400320
250-STARTTLS
250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
250-AUTH=LOGIN
250-MAILCOMPRESS
250 8BITMIME
helo localhost
250-newxmesmtplogicsvrszc2-0.qq.com-11.176.204.108-75761867
250-SIZE 73400320
250 OK
quit
221 Bye.
220 163.com Anti-spam GT for Coremail System (163com[20141201])
ehlo localhost
250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN XOAUTH2
250-AUTH=LOGIN PLAIN XOAUTH2
250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UrBfaIrUCa0xDrUUUUj
250-STARTTLS
250-ID
250 8BITMIME
helo localhost
250 OK
quit
221 Bye

SMTP Service Extension for

有很多相关拓展,不过大部分不怎么常见,参考:

https://datatracker.ietf.org/doc/search?name=smtp+service+extension+for&sort=&rfcs=on
https://www.rfc-editor.org/search/rfc_search_detail.php?title=smtp+service+extension+for&pubstatus%5B%5D=Standards+Track&std_trk=Proposed+Standard&pub_date_type=any

SIZE 邮件尺寸

RFC 1427 / 1653 / 1870
SMTP Service Extension for Message Size Declaration

服务器会通过 ehlo 响应的 size 指令提供一个最大邮件大小,如果 data 数据大小超出这个值,服务器会返回错误码
同时,客户端 mail from 命令后面可以加上一个附加参数 size=xxx,服务器应该判断这个 size 是否符合要求,如果不符合要求直接失败,避免无效的数据传输。

PIPELINE 命令流水

如果不用这个拓展,SMTP 客户端和服务器端是一问一答的模式。

C: mail from: xxx
S: 250 ok
C: rcpt to: xxx
S: 250 ok
C: data
S: 354 ok
C: ......
S: 250 ok

用上 PIPELINE 之后:

C: mail from: xxx
C: rcpt to: xxx
C: data
S: 250 ok
S: 250 ok
S: 354 ok
C: ......
S: 250 OK

部分必须等待服务器响应,根据响应进行下一步操作:

  • ehlo
  • data
  • vrfy
  • turn
  • quit
  • noop

8BITMIME

mail from 附加参数 body=8bitmime 表明采用 8bit 数据,否则是 7bit(默认值)。