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用户名密码,文中账号密码非真实有效账号
高版本 Mac OS 的 telnet 因安全愿意已废弃,可使用 brew install telnet 安装
1 | C: telnet smtp.126.com 25 // 以telnet方式连接163邮件服务器 |
安装上述步骤就可以在邮件中接收到刚才发送的邮件了。
状态码,摘自SMTP状态码
状态码 | 解释 |
---|---|
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
| ehlo | 命令用于替代传统SMTP协议中的helo命令 |
| auth
| mail
| rcpt
| data
| quit
具体命令可参考
- 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@qudian.com
TO: to_user@qudian.com
CC: cc_user@qudian.com,
BCC: bcc_user@qudian.com
这封邮件要发送出是这样子的。
1 | MAIL FROM: <from_user@qudian.com> |
那显而易见的是邮件的DATA中并不包含BCC,但是与SMTP协商之时却告诉服务器邮件要发送给TO、CC、BCC,这就是为什么TO、CC看不见BCC的原因!666!
一个问题?
假定一个场景,一封邮件发送给
TO: to_user@qudian.com
BCC: bcc_group@qudian.com
bcc_group@qudian.com作为一个邮件组包含 to_user@qudian.com 与 to_user_other@qudian.com
那么 to_user@qudian.com、to_user_other@qudian.com会收到几封邮件,测试结果如下:
to_user@qudian.com | to_user_other@qudian.com | |
---|---|---|
WEB发送 | 1 | 1 |
Swift Mailer 5.4.8 | 2 | 1 |
PHPMailer 5.2.23 | 1 | 1 |
Swift Mailer 对于BCC的实现为先发送TO、CC一封邮件,然后发送BCC一封邮件,但其余的为同时发送TO、CC、BCC一封邮件。
THE END