1C#网络编程技术教程第八章电子邮件协议编程第8章电子邮件协议编程2学习目标•了解电子邮件协议的相关基础知识。•掌握SMTP、ESMTP协议格式及其编程方法。•掌握POP3协议格式及其编程方法。•掌握System.Web.Mail邮件编程。第8章电子邮件协议编程3本章内容8.1电子邮件协议概述8.2SMTP协议编程8.3ESMTP协议编程8.4POP3协议编程8.5System.Web.Mail第8章电子邮件协议编程48.1电子邮件协议概述电子邮件是Internet上最常见的服务。电子邮件可以允许两个或多个用户间建立通信联系,实现电子化的邮政通信方式。电子邮件的收取、发送等服务必须由基于电子邮件协议的电子邮件系统来实现。电子邮件系统主要由邮件服务器和邮件客户端组成,邮件服务器又包括邮件发送处理服务器(遵循SMTP)和邮件接收处理服务器(遵循POP3协议)。一般的邮件服务器(126、Yahoo、Hotmail、Sohu等)都包括这两个功能。常见电子邮件系统组成如图8.1所示。图8.1电子邮件系统组成第8章电子邮件协议编程58.1电子邮件协议概述对应于邮件服务器的两个部分,邮件客户端有发送邮件和接收邮件两个功能以及其他一些辅助功能,其中发送邮件的部分遵循SMTP,接收邮件的部分遵循POP3协议。通常各个邮件服务器都提供了Web方式的邮件客户端,用户只需要用IE浏览器就可以访问邮箱,但是Web邮件客户端有一定的局限性,例如每次都需要打开IE、进入网站,再登录邮箱。Web邮件客户端只能在线浏览邮件,在没有网络连接的情况下,就不能浏览邮件了。与电子邮件相关的协议主要有:RFC822、SMTP、POP3和IMAP4。1.RFC822邮件格式RFC822定义了SMTP、POP3、IMAP以及其他电子邮件传输协议所提交、传输的内容。RFC822定义的邮件由两部分组成:信封和邮件内容。信封包括与传输、投递邮件有关的信息。邮件内容包括标题和正文。2.SMTPSMTP(SimpleTransferProtocol,简单邮件传输协议)是Internet上传输电子邮件的标准协议,用于提交和传送电子邮件,该协议规定了主机之间传输电子邮件的标准交换格式和邮件在链路层上的传输机制。SMTP通常用于把电子邮件从客户机传输到服务器,以及从一台服务器传输到另一台服务器。3.POP3POP3(PostOfficeProtocol3,邮局协议第三版)是Internet上传输电子邮件的标准协议。它提供信息存储功能,负责为用户保存收到的电子邮件,并且从邮件服务器上下载取回这些邮件。4.IMAP4IMAP4(InternetMessageAccessProtocol4,网际消息访问协议第四版),当电子邮件客户机软件在笔记本计算机上允许时,IMAP4比POP3更适用。使用IMAP4时,用户可以有选择地下载电子邮件,甚至只是下载部分邮件。因此,IMAP4要比POP3复杂。第8章电子邮件协议编程68.2SMTP协议编程SMTP(SimpleMailTransferProtocol,简单邮件传输协议)通常是发送E-mail的协议,该协议的默认端口是25。SMTP服务器会主动监听TCP端口25,邮件客户端如果需要发送邮件,首先要建立一个TCP连接。当连接建立后,SMTP协议中规定命令并等待响应。8.2.1邮件格式RFC822StandardforARPAInternetTextMessage定义了邮件格式由邮件标题和邮件内容两部分构成。1.邮件标题一般邮件的标题内容如下:Received:bysmtp.mail.163.com;Thu,10July200813:10:25+0800Message-ID:0c6501b1452a$3d4c8ef0$67d025fc@163.comFrom:HuaJinjgjinhua@163.comDate:Thu,10July200813:10:25+0800Reply-To:JinHuanthuajin@163.comTo:nthuajin@163.comSubject:c#NetworkProgrammingX-Mailer:MicrosoftOutlookExpress5.50.4133.2400第8章电子邮件协议编程78.2SMTP协议编程标题定义的内容如下:(1)From:发件人账号。(2)To:收件人账号。(3)Reply-To:回复邮件的收件人账号。(4)Subject:邮件主题。(5)Date:邮件处理日期。(6)Received:邮件服务器处理的日期,该内容由邮件服务器自行加入邮件标题中。(7)Message-ID:邮件服务器所定义的邮件序号。(8)X-Mailer:邮件工具。(9)其他:根据不同类型的邮件服务器而加入的标题内容。2.邮件内容根据RFC822的定义,邮件内容以ASCII为其文字格式。SMTP协议用于发送邮件,其默认端口为25,SMTP协议定义了字段保留字及特殊符号等,以确保邮件能在邮件服务器间成功地被传送。RFC822定义了SMTP字段保留字及符号。如:Reply-To:JinHuanthuajin@163.com其中:(1)Reply-To:字段保留字。(2)(:):保留字与内容间需要用冒号隔开。(3)(”):用户名等置于引号之中。(4)():邮件账号及Message-ID等置于括号内。(5)(,):当含有多个邮件账号时,用逗号隔开。(6)(@):在邮件账号中,用户登录名与邮件服务器的DNS名称以@连接。(7)CRLF:每一行结尾要以CRLF结束,CRLF含义如表8.1所示。第8章电子邮件协议编程88.2SMTP协议编程项目说明ASCIIHex转义字符CR回车130X0D\rLF换行100X0A\n第8章电子邮件协议编程98.2SMTP协议编程8.2.2SMTP信息RFC821SimpleMailTransferProtocol定义了SMTP发送邮件的流程、格式、指令等内容。下面是客户端发送邮件至邮件服务器及服务器响应的内容,为区别起见,每一行的开始位置加上“S:”或“C:”,代表服务器端或客户端响应及发送信息。C:Tryingtoconnecttohostsmtp:mail.163.com,port:25C:Connectedtosmtp.mail.163.comS:220smtp.mail.163.comSimpleMailTransferServiceReadyC:HELOsmtp.mail.163.comS:250Hellosmtp.mail.163.comC:MAILFROM:jgjinhua@163.comS:250OKC:RCPTTO:nthuajin@163.comS:250OKC:DATAS:354Startmailinput;endwithCRLF.CRLFC:Date:Thu,10July200813:10:25+0800C:To:nthuajin@163.comC:Subject:SMTPMailC:TestSMTPmailmessage.C:.S:250OKC:QUITS:221smtp.mail.163.comServiceclosingtransmissionchannel由此可以看出,邮件服务器端返回的信息都会加上三位数字的响应码,来定义各信息处理情况。SMTP响应码如表8.2所示。第8章电子邮件协议编程108.2SMTP协议编程响应码含义211响应系统状态214辅助信息220服务器的邮件服务已准备运作221已结束与邮件服务器的连接250系统指令正确发送(OK)251无此收件人354开始邮件内容发送,并以CRLF.CRLF表示结束421服务器无此邮件服务450邮件信箱不存在451系统指令处理错误452系统容量不足500未定义的系统指令501系统指令的参数错误502系统指令未被执行503系统指令顺序错误504系统指令的参数未被执行550邮件信箱不存在551无此收件人552系统容量不足553邮件信箱收件人名称不存在554邮件发送处理失败第8章电子邮件协议编程118.2SMTP协议编程其中,第一个及第二个数字均有其特别含义,而第三个数字为信息的序号,下面具体说明第一、二个数字的含义,分别如表8.3、表8.4所示。表8.3SMTP响应码第一个数字的含义编号含义1信息已被邮件服务器正确接受,但尚未被处理2信息已被邮件服务器正确处理完毕3信息已被邮件服务器正确接受,并正在处理中4信息处理错误(暂时)5信息处理错误(永久)表8.4SMTP响应码第二个数字的含义编号含义0语法1系统状态与信息2与邮件服务器系统连接状态3未定义4未定义5与邮件服务器有关的信息第8章电子邮件协议编程128.2SMTP协议编程8.2.3SMTP指令SMTP指令也是由RFC821定义的,SMTP指令采用命令行形式,用ASCII码表示,它们之间由空格间隔。命令行以CRLF结束,命令一般是四个字母,每个参数却可长达40个字符。在带参数的情况下,命令本身由SP和参数隔开;如果未带参数可以直接和CRLF连接。邮件服务器接收到命令后会执行命令,并把执行结果返回给客户端。SMTP指令如表8.5所示。命令语法定义描述HELOHELOdomainCRLF该命令用于向服务器标识用户身份。如果操作成功,服务器会返回代码250HELPHELP[string]CRLF该命令用于向命令的发送者发出帮助信息MAILMAILFROM:e-mailaddressCRLF该命令用于初始化邮件传输。如果操作成功,服务器会返回代码250RCPTRCPTTO:e-mailaddressCRLF该命令用于标识单个邮件接收人,如果有多个接收人,将由多个该命令指定。如果操作成功,服务器会返回代码250DATADATACRLF该命令是一个复杂的命令,用于设置邮件的主题、接收人、抄送列表和邮件的正文。DATA命令会初始化数据传输,一般在一个或多个RCPT命令后执行DATA命令RSETRSETCRLF中止邮件发送处理NOOPNOOPCRLF令邮件服务器发送250OK的信息SENDSENDCRLF处理邮件发送SAMLSAMLCRLFSend和Mail命令要求邮件内容直接发送到用户终端上(SAML:SendAndMail)SOMLSOMLCRLFSend或Mail命令要求邮件内容直接发送到用户终端上(SOML:SendOrMail)ARFYARFYCRLF确认收件人E-mail地址是否正确(VRFY:Verify)EXPNEXPNCRLF确认收件组是否正确(EXPN:Expand)QUITQUITCRLF该命令用于结束会话,退出SMTP服务器并中断连接。如果执行成功,会返回221,表示服务器关闭第8章电子邮件协议编程138.2SMTP协议编程8.2.4SMTP流程SMTP流程也是由RFC821定义的,如图8.2所示。第8章电子邮件协议编程148.2SMTP协议编程8.2.4SMTP流程(1)首先,客户端尝试与邮件服务器建立连接,并且等候邮件服务器返回220Ready的信息,当客户端收到此信息时,会发出HELOMailServer信息,以响应邮件服务器,而同时邮件服务器也会返回250OK信息,表示双方已建立起连接,随后就可以开始发送邮件。(2)邮件发送是以MAILFROM:指令开始。首先,客户端发出MAILFROM:发件人E-mail地址的信息,其主要作用在于一旦有任何错误发生或邮件响应产生时,会发往此E-mail地址,若发件人的E-mail地址正确,邮件服务器会返回250OK信息,否则会返回550Nosuchuser信息。(3)随后客户端会发出RCPTTO:发件人E-mailAddress指令,以代表收件人的E-mail地址,若收件人E-mail地址正确,邮件服务器会返回250OK信息,否则会返回550Nosuchuser信息。(4)随后开始处理邮件标