邮件定义:(电子邮件)消息由头域(统称消息头)以及后面可选的消息体组成。根据 RFC 2822,“唯一需要的消息标题只有发送日期字段和发送地址字段”,即“Date:”和“From:”(MAIL FROM、RCPT TO、DATA)。
电子邮件工作原理:
发送主机需要找到某一台中间主机,而这台中间主机最终能到达最后的接收主机。接着这台中间主机需要找到一台离接收主机更近一些的主机。所以,在发送主机和接收主机之间,可能会有多台称为“跳板”的主机。
电子邮件最重要的组件是:消息传输代理(message transfer agent,MTA)。这是在邮件交换主机上运行的服务器进程,它负责邮件的路由、队列处理和发送工作。MTA 就是邮件从发送主机到接收主机所要经过的主机和“跳板”,所以也称为“消息传输”的“代理”。
所有这些要运行起来,MTA需要做两件事:1)如何找到消息应该到达的下一台MTA。2)如何与另一台MTA通信。第一件事由域名服务(DNS)来查找目的域名的 MX(MaileXchange,邮件交换)来完成。
为了发送邮件,邮件客户端必须连接到MTA,然后两个MTA之间必须使用相同的协议进行通信。
SMTP (Mail Transfer Protocol,邮件传输协议)由已故的 JonathanPostel(加州大学信息学院)创建,记录在 RFC 821 中,于1982 年 8 月公布,其后有一些小修改。ESMTP是SMTP的扩展。
LMTP(Local Mail Transfer Protocol,本地邮件传输协议),其基于SMTP和 ESMTP,作为 RFC 2033 于 1996 年 10 月定义。SMTP 需要有一个邮件队列,但这需要额外的存储和管理工作。而 LMTP 提供了更轻量级的系统,移除了对邮件队列的需求。但邮件需要立即发送(即不会入队)。LMTP 服务器不暴露到外面,直接与连接到因特网的邮件网关工作,以表示接收还是拒绝一条消息。而网关作为 LMTP 的队列。
一些实现SMTP的著名MTAs:
开源 MTA
• Sendmail
• Postfix
• Exim
• qmail
商业 MTA
• Microsoft Exchange
• Lotus Notes Domino Mail Server
SMTP是因特网上MAT之间用于信息交换的最常用的MTS。用 SMTP 把电子邮件从一台(MTA)主机传送到另一台(MTA)主机。 发电子邮件时,必须要连接到一个外部 SMTP服务器,此时邮件程序是一个 SMTP 客户端。而 SMTP 服务器也因此成为消息的第一站。
是的,也存在一个smtplib模块和需要实例化的smtplib.SMTP()类。实现过程如下:
1.连接到服务器。
2.登录(根据需要)。
3.发出服务请求。
4.退出。
和NNTP一样,登陆是可选的,只有在服务器打开了SMTP身份认证(SMTP-AUTH)时才需要登陆。SMTP-AUTH 在 RFC 2554 中定义。还是与 NNTP 一样,SMTP 通信时只要一个端口,这里是端口号 25。
Python 实现SMTP客户端的伪代码:
from smtplibimport SMTP
n =SMTP('smtp.yourdomain.com')
...
n.quit()
Python对SMTP的更多支持内容可以访问:http://docs.python.org/library/smtplib
关于 SMTP 的更多信息可以阅读 SMTP 协议定义/规范,即 RFC5321,参见 https://docs.python.org/3/library/smtplib.html。
关于如何正确设定因特网地址的格式和电子邮件消息。可以参考RFC 5322,参见:https://tools.ietf.org/html/rfc5322。
这种在家用电脑中运行的应用程序叫邮件用户代理(Mail User Agent,MUA)。MUA可以从服务器上下载邮件,同时也能够使用SMTP和MTA进行通信。
第一个用于下载邮件的协议是邮局协议(Post Office Protocol,POP),记录在 RFC 918中,于 1984 年10 月公布。POP的目的是让用户的工作站可以访问邮件服务器里的邮件,并且能够通过SMTP协议将邮件发送到邮件服务器。目前,POP的最新版本是POP3。
在 POP 出现几年之后有了一个与之竞争的协议,即因特网消息访问协议(Internet Message Access Protocol,IMAP)。当前广泛使用的版本是 IMAP4rev1。邮件系统的结构如下图所示:
与之前一样,这里导入 poplib 并实例化 poplib.POP3 类。标准流程如下所示。
1.连接到服务器。
2.登录。
3.发出服务请求。
4.退出。
Python 伪代码如下。
from poplib import POP3
p = POP3('pop.python.is.cool')
p.user(...)
p.pass_(...)
...
p.quit()
……
1.连接到服务器。
2.登录。
3.发出服务请求。
4.退出。
下面是对应的 Python 伪代码。
from imaplib import IMAP4
s= IMAP4('imap.python.is.cool')
s.login(...)
...
s.close()
s.logout()