电子邮件:SMTP、报文格式、POP3与IMAP
SMTP(Simple Mail Transfer Protocol)
电子邮件系统由用户代理(user agent)、邮件服务器(mail server)和SMTP组成,其中例如Outlook、Apple Mail、Gmail就是用户代理。当Alice发送邮件时,她的用户代理就会向邮件服务器发送邮件,此时邮件被放在邮件服务器的待发报文队列中。当Bob要查看邮件时,他的用户代理就会从其邮件服务器中获取该报文。
SMTP是电子邮件中使用的应用层协议,它使用TCP可靠数据传输服务,使用25号端口。
SMTP使用命令和应答对报文进行传输:
| 命令 | 描述 |
|---|---|
| HELO | 与服务器确认信息 |
| AUTH | 登录验证 |
| MAIL FROM | 发件人信息 |
| RCPT TO | 收信人地址 |
| DATA | 输入邮件基本信息 |
| FROM | 发信人显示信息 |
| TO | 服务器收件人显示信息 |
| SUBJECT | 邮件标题 |
| QUIT | 断开连接 |
| 返回码 | 含义 |
|---|---|
| 220 | 服务就绪 |
| 250 | 请求动作成功完成 |
| 235 | 认证通过 |
| 221 | 处理中 |
| 354 | 发送开始 |
| 500 | 指令错误 |
| 550 | 命令无法执行 |
信封与邮件内容
需要区分两组信息:MAIL FROM与RCPT TO属于SMTP信封;From、To、Subject是DATA阶段传输的邮件首部,不是三个独立的SMTP命令。信封决定交付给哪个邮箱,而显示首部让用户阅读发件人与主题。它们可能不同,显示的From也不能独自证明发件人身份。
354表示服务器准备接收邮件数据;数据阶段通常用独占一行的句点结束,内容中本来以句点开头的行需要相应处理。221表示服务正在关闭传输通道,而不是仍在处理邮件。这里先理解阶段边界,不需要连接真实邮件服务。
路由邮件信封,再获取邮件
解锁完整互动实验、进阶解析与精选参考答案。
知识测验
邮件访问
当用户调用用户代理查看邮件报文时就需要用到邮件访问协议。流行的邮件访问协议有邮局协议版本3(POP3)、因特网邮件访问协议(IMAP, Internet Mail Access Protocol)和HTTP。
SMTP主要负责推送邮件。POP3提供较简单的下载访问,下载后是否删除取决于客户端与服务器策略。IMAP让客户端操作服务器上的邮箱、文件夹与邮件状态,适合多设备保持同步。通过网页读取邮件时,浏览器使用HTTP/HTTPS与Web服务通信,后台仍可能与邮件系统交互。
邮件报文本身在首部与正文之间有空行。Python的email标准库能解析它;不要把每个冒号都当作任意可拆分的分隔符,也不要把一行首部当作整个SMTP对话。
知识测验
用Python解析合成邮件
邮件包含From: [email protected]、To: [email protected]、Subject: Meeting、一个空行,以及正文Meet at 10.。使用email.parser.Parser与policy.default,分别打印To、Subject、去掉两端空白的正文。解释这些字段能否证明SMTP信封收件人或经过认证的发件人。不发送邮件。