关于 SMTP 发送邮件的那些事
SMTP简介
SMTP称为简单邮件传输协议(Simple Mail Transfer Protocal),目标是向用户提供高效、可靠的邮件传输。它的一个重要特点是它能够在传送中接力传送邮件,即邮件可以通过不同网络上的主机接力式传送。通常它工作在两种情况下:一是邮件从客户机传输到服务器;二是从某一个服务器传输到另一个服务器。SMTP是一个请求/响应协议,它监听25号端口,用于接收用户的Mail请求,并与远端Mail服务器建立SMTP连接。
SMTP连接发送过程
- 建立TCP连接
- 客户端发送HELO命令以标识发件人自己的身份
- 客户端发送MAIL命令
- 客户端发送RCPT命令,以标识该电子邮件的接收人,可以存在多个RCPT行
- 协商结束,准备发送邮件,用命令DATA发送
- 以.表示结束,邮件发送
- 使用QUIT命令退出
ESMTP(Extended SMTP)连接发送过程
- 建立TCP连接
- 客户端发送HELO命令以标识发件人自己的身份
- 客户端发送AUTH LOGIN命令,进行身份验证
- 客户端发送MAIL命令
- 客户端发送RCPT命令,以标识该电子邮件的接收人,可以存在多个RCPT行
- 协商结束,准备发送邮件,用命令DATA发送
- 以.表示结束,邮件发送
- 使用QUIT命令退出
使用Telnet命令发送邮件
- 基于ESMTP模式
- 使用smtp.126.com服务器
- 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.
按照上述步骤就可以在邮件中接收到刚才发送的邮件了。
状态码
状态码 | 解释 |
---|---|
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邮件发送程序的网络连接 |
具体命令可参考
- SMTP RFC821
- ESMTP RFC1869
- 其他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的原因!
由于时间仓促,错误与疏忽之处在所难免,希望各位朋友们以邮件的形式反馈问题给我,再次表示感谢!
- 作者:xmlwch
- 原文链接:https://m730.xmlwch.cn/2021/11/15/network/smtp.html
- 版权声明:本作品采用 知识共享 署名-相同方式共享 4.0 国际(CC BY-SA 4.0)许可协议 进行许可,转载无需与我联系,但请注明出处。