SMTP简介

SMTP称为简单邮件传输协议(Simple Mail Transfer Protocal),目标是向用户提供高效、可靠的邮件传输。它的一个重要特点是它能够在传送中接力传送邮件,即邮件可以通过不同网络上的主机接力式传送。通常它工作在两种情况下:一是邮件从客户机传输到服务器;二是从某一个服务器传输到另一个服务器。SMTP是一个请求/响应协议,它监听25号端口,用于接收用户的Mail请求,并与远端Mail服务器建立SMTP连接。

邮件

SMTP连接发送过程

  1. 建立TCP连接
  2. 客户端发送HELO命令以标识发件人自己的身份
  3. 客户端发送MAIL命令
  4. 客户端发送RCPT命令,以标识该电子邮件的接收人,可以存在多个RCPT行
  5. 协商结束,准备发送邮件,用命令DATA发送
  6. 以.表示结束,邮件发送
  7. 使用QUIT命令退出

ESMTP(Extended SMTP)连接发送过程

  1. 建立TCP连接
  2. 客户端发送HELO命令以标识发件人自己的身份
  3. 客户端发送AUTH LOGIN命令,进行身份验证
  4. 客户端发送MAIL命令
  5. 客户端发送RCPT命令,以标识该电子邮件的接收人,可以存在多个RCPT行
  6. 协商结束,准备发送邮件,用命令DATA发送
  7. 以.表示结束,邮件发送
  8. 使用QUIT命令退出

使用Telnet命令发送邮件

  1. 基于ESMTP模式
  2. 使用smtp.126.com服务器
  3. AUTH LOGIN 使用加密的BASE64用户名密码,文中账号密码非真实有效账号
telnet smtp.126.com 25  // 以telnet方式连接163邮件服务器
Trying 220.181.15.112...
Connected to smtp.126.com.
Escape character is '^]'.
220 126.com Anti-spam GT for Coremail System (126com[20140526])  // 220为响应数字,其后的为欢迎信息
helo smtp.126.com  // 除了HELO所具有的功能外,EHLO主要用来查询服务器支持的扩充功能
250 OK
ehlo smtp.126.com
250-mail
250-PIPELINING
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UrHWNPzUCa0xDrUUUUj
250-STARTTLS
250 8BITMIME
AUTH LOGIN  // 请求认证
334 dXNlcm5hbWU6  // dXNlcm5hbWU6 为 username: 的base64编码
eG1sd2NoQDEyNi5jb20=  // 发送经过BASE64编码的用户名(xmlwch@126.com)
334 UGFzc3dvcmQ6  // UGFzc3dvcmQ6 为 Password: 的base64编码
U1********************==  // 发送经过BASE64编码的密码(去邮箱申请smtp密码之后base64加密)
235 Authentication successful  // 认证成功
MAIL FROM: <xmlwch@126.com>  // 发送者邮箱  
250 Mail OK
RCPT TO: <xmlwch@126.com>  // 接收者邮箱,包含所有的TO、CC、BCC
250 Mail OK
DATA  // 请求发送数据  
354 End data with <CR><LF>.<CR><LF>  // 注意使用<CR><LF>.<CR><LF>作为结尾
FROM: <xmlwch@126.com>  // 邮件需注意 from to subject格式否则可能出现空邮件
TO: <xmlwch@126.com>
SUBJECT: test

I am test!

.
250 Mail OK queued as smtp2,DMmowADHz8+aFpNhj6fBBg--.25488S3 1637029787
quit  // 退出连接
221 Bye
Connection closed by foreign host.

按照上述步骤就可以在邮件中接收到刚才发送的邮件了。 image-20211116103810366

状态码

状态码 解释
500 格式错误,命令不可识别(此错误也包括命令行过长)
501 参数格式错误
502 命令不可实现
503 错误的命令序列
504 命令参数不可实现
211 系统状态或系统帮助响应
214 帮助信息
220 服务就绪
221 服务关闭传输信道
421 服务未就绪,关闭传输信道(当必须关闭时,此应答可以作为对任何命令的响应)
250 要求的邮件操作完成
251 用户非本地,将转发向
450 要求的邮件操作未完成,邮箱不可用(例如,邮箱忙)
550 要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,或不可访问)
451 放弃要求的操作;处理过程中出错
551 用户非本地,请尝试
452 系统存储不足,要求的操作未执行
552 过量的存储分配,要求的操作未执行
553 邮箱名不可用,要求的操作未执行(例如邮箱格式错误)
354 开始邮件输入,以.结束
554 操作失败
535 用户验证失败
235 用户验证成功
334 等待用户输入验证信息

SMTP常用命令

命令 解释
ehlo SMTP邮件发送程序与SMTP邮件接收程序建立连接后第一条发送命令,参数表示SMTP邮件发送者的主机名
ehlo 命令用于替代传统SMTP协议中的helo命令
auth 如果SMTP邮件接收程序需要SMTP邮件发送程序进行认证时,它会向SMTP邮件发送程序提示它所采用的认证方式,SMTP邮件发送程序接着应该使用这个命令回应SMTP邮件接收程序,参数表示回应的认证方式,通常是SMTP邮件接收程序先前提示的认证方式
mailFrom: 此命令用于指定邮件发送者的邮箱地址,参数表示发件人的邮箱地址
rcptTo: 此命令用于指定邮件接收者的邮箱地址,参数表示接收者的邮箱地址。如果邮件要发送给多个接收者,那么应使用多条rcptTo命令来分别指定每一个接收者的邮箱地址
data 此命令用于表示SMTP邮件发送程序准备开始输入邮件内容,在这个命令后面发送的所有数据都将被当做邮件内容,直至遇到“.“标志符,则表示邮件内容结束
quit 此命令表示要结束邮件发送过程,SMTP邮件接收程序接收到此命令后,将关闭与SMTP邮件发送程序的网络连接

具体命令可参考

  1. SMTP RFC821
  2. ESMTP RFC1869
  3. 其他RFC文档 Email相关RFC

关于TO、CC、BCC

  • TO 收件人
  • CC 即 carbon copy 抄送
  • BCC 即 blind carbon copy 暗送

简单解释就是邮件发送到到A,再抄送到B,再暗送到C。那么A、B、C都会收到这封邮件,并且内容一样。但是A、B能看到收件人是A并抄送给了B,但是它们(A、B)都不知道C也收到了这封邮件。

但邮件真是先发送到到A,再抄送到B,再暗送到C吗?

例如,发送一封邮件: FROM: from_user@xmlwch.cn TO: to_user@xmlwch.cn CC: cc_user@xmlwch.cn BCC: bcc_user@xmlwch.cn 这封邮件要发送出是这样子的。

MAIL FROM: <from_user@xmlwch.cn>
RCPT TO: <to_user@xmlwch.cn>
RCPT TO: <cc_user@xmlwch.cn>
RCPT TO: <bcc_user@xmlwch.cn>
DATA
FROM: <from_user@xmlwch.cn>
TO: <to_user@xmlwch.cn>
SUBJECT: test
I am 1018ji!
.

那显而易见的是邮件的DATA中并不包含BCC,但是与SMTP协商之时却告诉服务器邮件要发送给TO、CC、BCC,这就是为什么TO、CC看不见BCC的原因!

由于时间仓促,错误与疏忽之处在所难免,希望各位朋友们以邮件的形式反馈问题给我,再次表示感谢!