统 示 带 带 有 电 简 有 简 附 电 子 通 单 附 单 件 子 邮 讯 收 件 送 理 邮 邮 的 邮 件 件 的 件 件 簿 邮 的 管 接 邮 发 件 编 分 理 收 件 送 发 写 类 接 管 图 2.3 程序功能图2.4 发送邮件类 是发送邮件的核心,类名为 SmtpMail,隶属于命名空间 MailSend。
封装了发送邮件的具体实现方法,也是具体的 RFC 用代码实现的过程。
而用户通过具体的操作接口,接口与 SmtpMail 类通过交互操作来实现用户发送信件的操作。
2.5 附加小功能类 是获取一些诸如系统时间,当前用户名,以及本机 IP 之类的类,类名为AddExtra,隶属于命名空间 MailSend。
3 SMTP 协议的研究 由于要开发的是邮件客户端程序,就不得不用到 SMTP 协议和 POP 协议。
而我个人负责的是邮件发送功能的实现,因此就必然会涉及到 SMTP(SimpleMail Transfer Protocol)协议。
SMTP 被用来在因特网上发送邮件,该协议规定了一些基本的命令和方法使客户端与服务器进行交互,以达到发送邮件的目的。
3.1 SMTP 协议简介及工作原理3.1.1 介绍 简单邮件传输协议(SMTP)的目标是可靠高效地传送邮件,它独立于传送子系统而且仅要求一条可以保证传送数据单元顺序的通道。
SMTP 的一个重要特点是它能够在传送中接力传送邮件,传送服务提供了进程间通信环境(IPCE),此环境可以包括一个网络,几个网络或一个网络的子网。
理解到传送系统(或 IPCE)不是一对一的是很重要的。
进程可能直接和其它进程通过已知的 IPCE 通信。
邮件是一个应用程序或进程间通信。
邮件可以通过连接在不同 IPCE 上的进程跨网络进行邮件传送。
更特别的是,邮件可以通过不同网络上的主机接力式传送。
3.1.2 SMTP 模型 SMTP 设计基于以下通信模型:针对用户的邮件请求,发送 SMTP 建立与接收 SMTP 之间建立一个双向传送通道。
接收 SMTP 可以是最终接收者也可以是中间传送者。
SMTP 命令由发送 SMTP 发出,由接收 SMTP 接收,而应答则反方面传送。
一旦传送通道建立,SMTP 发送者发送 MAIL 命令指明邮件发送者。
如果SMTP 接收者可以接收邮件则返回 OK 应答。
SMTP 发送者再发出 RCPT 命令确认邮件是否接收到。
如果 SMTP 接收者接收,则返回 OK 应答;如果不能接收到, ,双方将如此重复多次。
当接收则发出拒绝接收应答(但不中止整个邮件操作)者收到全部邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回OK 应答。
SMTP 提供传送邮件的机制,如果接收方与发送方连接在同一个传送服务下时,邮件可以直接由发送方主机传送到接收方主机;或者,当两者不在同一个传送服务下时,通过中继 SMTP 服务器传送。
为了能够对 SMTP 服务器提供中继能力,它必须拥有最终目的主机地址和邮箱名称。
MAIL 命令参数是回复路径,它指定邮件从何处来;而 RCPT 命令的参数是转发路径的,它指定邮件向何处去。
向前路径是源路径,而回复路径是返回路径(它用于发生错误时返回邮件)。
当同一个消息要发往不同的接收者时,SMTP 遇到了向不同接收者发送同一份数据的复制品的问题,邮件命令和应答有一个比较奇怪的语法,应答也有一个数字代码。
在下面,例子中可以看到哪些使用实际的命令和应答。
完整的命令和应答在第四节。
命令与应答对大小写不敏感,也就是说,命令和应答可以是大写,小写或两者的混合,但这一点对用户邮件名称却不一定是对的,因为有的主机对用户名大小写是敏感的。
这样 SMTP 实现中就将用户邮箱名称保留成初始时的样子,主机名称对大小写不敏感。
命令与应答由 ASCII 字母表组成,当传送服务提供 8 位字节传送通道,每 7位字符正确传送,而最高位被填充为 0。
当指定一般的命令或应答格式后,参数会由一些类似于语言的字符串表示出来,如quotltstringgtquot或quotltreverse-pathgtquot,这里尖括号表示这是一种类似于语言的变量。
3.2 SMTP 协议的命令和应答3.2.1 SMTP 协议的命令 SMTP 命令定义了邮 件传输或由用户定义的系统功能。
它的命令是由ltCRLFgt结束的字符串。
而在带有参数的情况下,命令本身由ltSPgt和参数分开,如果未带参数可以直接和ltCRLFgt连接。
邮箱的语法格式必须和接收站点的格式一致。
下面讨论 SMTP 命令和应答。
发送邮件操作涉及到不同的数据对象,它们由不同的参数相互连接。
回复路 而转发路径则是 RCPT 命令的参数,径就是 MAIL 命令的参数, 邮件日期是 DATA命令的参数。
这些参数或者数据对象必须跟在命令后。
这种模式也就要求有不同的缓冲区来存储这些对象,也就是说,有一个回复路径缓冲区,一个转发路径缓冲区,一个邮件内容缓冲区。
特定的命令产生自己的缓冲区,或使一个或多个缓冲的内容被清除。
HELLO HELO 此命令用于向接收 SMTP 确认发送 SMTP。
参数域包括发送 SMTP 的主机名。
接收 SMTP 通过连接确认命令来向发送 SMTP 确认接收 SMTP。
引命令和 OK 响应确认发送和接收 SMTP 进入了初始状态,也就是说,没有操作正在执行,所有状态表和缓冲区已经被子清除。
MAIL MAIL 此命令用于开始将邮件发送到一个多个邮箱中。
参数域包括回复路径。
返回路径中包括了可选的主机和发送者邮箱列表。
当有主机列表时,它是一个回复路径源,它说明此邮箱是由在表中的主机一一传递发送(第一个主机是最后一个接收到此邮件的主机)过来的。
此表也有作向发送者返回非传递信号的源路径。
因为每个传递主机地址都被加在此表起始处,它就必须使用发送 IPCE 而不是接收IPCE(如果它们不是一个 IPCE 的话)清楚的名称。
一些出错信息的回复路径可能就是空的。
此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将此命令的回复路径信息插入到回复路径缓冲区中。
RECIPIENT RCPT 此命令用于确定邮件内容的唯一接收者;多个接收者将由多个此命令指定。
转发路径中包括一个可选的主机和一个必须的目的邮箱。
当出现主机列表时,这就是一个源路径,它指明邮件必须向列表中的上一个主机发送。
如果接收 SMTP未实现邮件的传递发送,就会返回如未知本地用户(550)的信息给用户。
当邮件被传递发送时,传递主机必须将自己的名称由转发路径的开始处移至回复路径的结束处。
当邮件最终到达目的地时,接收 SMTP 将以它的主机邮件格式自己的名称插入目标邮件中。
例如,由传递主机 A 接收的带有如下参数的邮件时,FROM:ltUSERXHOSTY.ARPAgt TO:ltHOSTA.ARPAHOSTB.ARPA:USERCHOSTD.ARPAgt将会变成如下形式: FROM:ltHOSTA.ARPA:USERXHOSTY.ARPAgt TO:ltHOSTB.ARPA:USERCHOSTD.ARPAgt. 此命令导致它的转发路径参数加入转发路径缓冲区中。
DATA DATA 接收者将跟在命令后的行作为邮件内容。
此命令导致此命令后的邮件内容加入邮件内容缓冲区。
邮件内容可以包括所有 128 个 ASCII 码字符。
邮件内容由只包括一个句号的行结束,也就是如下的字符序列:quotltCRLFgt.ltCRLFgtquot,它指示了邮件的结束。
邮件内容的结束指示要求接收者现在就处理保存的邮件内容。
此过程将回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区的内容全部清空。
如果操作成功,接收者必须返回 OK 应答;如果失败也必须返回失败应答。
当接收 SMTP 收到一条信息时,无论是用作转发还是此邮件已经到达目的地,它都必须在邮件内容的开始处加上时间戳这一行,这一行指示了接收到邮件主机和发出此邮件主机的标识,以及接收到邮件内容的时间和日期。
转发的信件将有多行这样的时间戳。
当接收 SMTP 作最后一站的传送时,它将返回路径信息行
上一篇:
四国军棋
下一篇:
那些令你为之触动的好句子,感慨万分