已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C 网络编程技术教程 第八章电子邮件协议编程 学习目标 了解电子邮件协议的相关基础知识 掌握SMTP ESMTP协议格式及其编程方法 掌握POP3协议格式及其编程方法 掌握System Web Mail邮件编程 本章内容 8 1电子邮件协议概述8 2SMTP协议编程8 3ESMTP协议编程8 4POP3协议编程8 5System Web Mail 8 1电子邮件协议概述 电子邮件是Internet上最常见的服务 电子邮件可以允许两个或多个用户间建立通信联系 实现电子化的邮政通信方式 电子邮件的收取 发送等服务必须由基于电子邮件协议的电子邮件系统来实现 电子邮件系统主要由邮件服务器和邮件客户端组成 邮件服务器又包括邮件发送处理服务器 遵循SMTP 和邮件接收处理服务器 遵循POP3协议 一般的邮件服务器 126 Yahoo Hotmail Sohu等 都包括这两个功能 常见电子邮件系统组成如图8 1所示 图8 1电子邮件系统组成 8 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 2SMTP协议编程 SMTP SimpleMailTransferProtocol 简单邮件传输协议 通常是发送E mail的协议 该协议的默认端口是25 SMTP服务器会主动监听TCP端口25 邮件客户端如果需要发送邮件 首先要建立一个TCP连接 当连接建立后 SMTP协议中规定命令并等待响应 8 2 1邮件格式RFC822StandardforARPAInternetTextMessage定义了邮件格式由邮件标题和邮件内容两部分构成 1 邮件标题一般邮件的标题内容如下 Received Thu 10July200813 10 25 0800Message ID 0c6501b1452a 3d4c8ef0 67d025fc From HuaJin jgjinhua Date Thu 10July200813 10 25 0800Reply To JinHua nthuajin To nthuajin Subject c NetworkProgrammingX Mailer MicrosoftOutlookExpress5 50 4133 2400 8 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 JinHua nthuajin 其中 1 Reply To 字段保留字 2 保留字与内容间需要用冒号隔开 3 用户名等置于引号之中 4 邮件账号及Message ID等置于括号内 5 当含有多个邮件账号时 用逗号隔开 6 在邮件账号中 用户登录名与邮件服务器的DNS名称以 连接 7 CRLF 每一行结尾要以CRLF结束 CRLF含义如表8 1所示 8 2SMTP协议编程 8 2SMTP协议编程 8 2 2SMTP信息RFC821SimpleMailTransferProtocol定义了SMTP发送邮件的流程 格式 指令等内容 下面是客户端发送邮件至邮件服务器及服务器响应的内容 为区别起见 每一行的开始位置加上 S 或 C 代表服务器端或客户端响应及发送信息 C Tryingtoconnecttohostsmtp port 25C CS SimpleMailTransferServiceReadyC HELOS 250HC MAILFROM jgjinhua S 250OKC RCPTTO nthuajin S 250OKC DATAS 354Startmailinput endwith C Date Thu 10July200813 10 25 0800C To nthuajin C Subject SMTPMailC TestSMTPmailmessage C S 250OKC QUITS Serviceclosingtransmissionchannel由此可以看出 邮件服务器端返回的信息都会加上三位数字的响应码 来定义各信息处理情况 SMTP响应码如表8 2所示 8 2SMTP协议编程 8 2SMTP协议编程 其中 第一个及第二个数字均有其特别含义 而第三个数字为信息的序号 下面具体说明第一 二个数字的含义 分别如表8 3 表8 4所示 表8 3SMTP响应码第一个数字的含义 表8 4SMTP响应码第二个数字的含义 8 2SMTP协议编程 8 2 3SMTP指令SMTP指令也是由RFC821定义的 SMTP指令采用命令行形式 用ASCII码表示 它们之间由空格间隔 命令行以结束 命令一般是四个字母 每个参数却可长达40个字符 在带参数的情况下 命令本身由和参数隔开 如果未带参数可以直接和连接 邮件服务器接收到命令后会执行命令 并把执行结果返回给客户端 SMTP指令如表8 5所示 8 2SMTP协议编程 8 2 4SMTP流程SMTP流程也是由RFC821定义的 如图8 2所示 8 2SMTP协议编程 8 2 4SMTP流程 1 首先 客户端尝试与邮件服务器建立连接 并且等候邮件服务器返回220Ready的信息 当客户端收到此信息时 会发出HELO信息 以响应邮件服务器 而同时邮件服务器也会返回250OK信息 表示双方已建立起连接 随后就可以开始发送邮件 2 邮件发送是以MAILFROM 指令开始 首先 客户端发出MAILFROM 的信息 其主要作用在于一旦有任何错误发生或邮件响应产生时 会发往此E mail地址 若发件人的E mail地址正确 邮件服务器会返回250OK信息 否则会返回550Nosuchuser信息 3 随后客户端会发出RCPTTO 指令 以代表收件人的E mail地址 若收件人E mail地址正确 邮件服务器会返回250OK信息 否则会返回550Nosuchuser信息 4 随后开始处理邮件标题及内容 客户端会先发送出DATA指令 以告知邮件服务器将要开始发送邮件标题及内容 若正确 则邮件服务器会响应354Startmailinput的信息 随后就可以开始发送邮件标题及内容 每行必须以结尾 5 依次发送邮件标题及内容后 必须发送一个特殊的字符串 以代表邮件内容发送结束 此字符由回车 换行 句点 回车 换行组成 即 同样 邮件服务器会返回250OK信息 代表成功发送 8 2SMTP协议编程 8 2 4SMTP流程 6 最后 客户端发出QUIT指令 要求结束连接 同时邮件服务器端会响应221信息 表示同意结束 则完成邮件的正常发送 邮件客户端最重要的两个功能就是发送邮件和接收邮件 其中发送邮件的流程如图8 3所示 发送邮件时 首先检查 发件箱 目录中的待发邮件 如果没有待发邮件就退出执行 反之 则逐个发送邮件 发送邮件时 先创建一个TCP连接到POP3服务器 如果连接不成功也退出执行 反之 判断SMTP服务器是否需要进行身份验证 如果不需要身份验证 或身份验证失败后都退出执行 一旦身份验证成功 则直接发送邮件 然后检查邮件发送是否成功 如果发送不成功就退出执行 否则关闭连接 更新数据库和界面 获取下一个要发送的邮件 循环执行上面的步骤 直到所有邮件都发送完后退出 接收邮件时首先要创建一个TCP连接到POP3服务器 如果连接不成功就退出执行 连接成功后再发送USER和PASS命令进行身份验证 身份验证通过后再通过STAT命令获得要接收的邮件数 当邮件数大于0时 通过RETR命令逐个接收邮件 接收邮件完毕后 检查账号中是否保留服务器上邮件的设置 如果是 就不作任何操作 否则从服务器上删除已经接收的邮件 最后关闭连接 更新UI界面和数据库 完成邮件接收 如图8 4所示 8 2SMTP协议编程 8 2 4SMTP流程 图8 3发送邮件流程图图8 4接收邮件流程图 8 2SMTP协议编程 8 2 5SMTP协议编程方法SMTP协议编程方法有两种 分别是由客户端Socket类和客户端TcpClient类实现SMTP协议编程 下面分别作简要说明 具体实例详见ESMTP协议编程实例 1 客户端Socket类实现SMTP协议编程以Socket类通过SMTP协议发送邮件 需要根据图8 2所示的SMTP流程 建立与邮件服务器的连接 并按顺序发送下列格式的内容至服务器 就可完成SMTP邮件发送 HELO r nMALLFROM r nRCPTTO r nDATA r n r n r n r nQUIT r n注意 每一行需要以CRLF r n 结尾 SMTP发送邮件服务器的默认端口是25 8 2SMTP协议编程 8 2 5SMTP协议编程方法2 客户端TcpClient类实现SMTP协议编程图8 5客户端实现SMTP协议编程流程图使用TcpClient类编写SMTP客户端应用程序的流程如图8 5所示 图8 5客户端实现SMTP协议编程流程图 8 2SMTP协议编程 8 2 5SMTP协议编程方法 1 首先客户端以TcpClient类与SMTP邮件服务器建立Socket连接 可使用TcpClient类的Connect方法建立客户端与服务器端的连接 其方法如下 publicvoidConnect IPEndPointremoteEP publicvoidConnect IPAddressaddress intport publicvoidConnect stringhostname intport 2 建立客户端与服务器端数据发送接收的输入 输出数据流 所建立的TcpClient对象代表客户端与服务器端的连接 可通过TcpClient类的GetStream方法取得客户端的输入 输出数据流 此函数原型如下 PublicNetWorkStreamGetStream 3 然后以NetworkStream类的Write方法依序从客户端发送下列信息到邮件服务器端 同时以NetworkStream类的Read方法处理服务器端所返回的信息 以判断是否正确 HELO r nMALLFROM r nRCPTTO r nDATA r n r n r n r nQUIT r n 4 当邮件发送完毕 需要用TcpClient类的Close方法关闭客户端与SMTP邮件服务器端的Socket连接 8 3ESMTP协议编程 8 3 1ESMTP介绍ESMTP ExtendedSMTP 扩展SMTP 是对标准SMTP的扩展 它们的区别仅仅是 使用SMTP发信不需要验证用户账户 而用ESMTP发信时 服务器会要求用户提供用户名和密码以便验证身份 验证之后的邮件发送过程与SMTP一样 为了更有效地抑制垃圾邮件的泛滥 许多E Mail服务商和ISP 包括本站 升级了他们的SMTP系统 即使用ESMTP的方式来提供E mail发送服务 与从POP3服务器上收信一样 在ESMTP服务器上发送邮件时 必须出示用户的账号和密码 如果账号和密码不正确 ESMTP服务器会拒绝发送该邮件 这样 在该E Mail系统中没有账号的用户就无法利用该ESMTP服务器乱发邮件了 8 3 2ESMTP协议编程实例本小节介绍基于ESMTP协议编写一个有用户认证 可以发送附件 功能比较全面的邮件发送程序 ESMTP是增强的SMTP协议 协议的工作流程与SMTP协议大致相同 只需要在SMTP的基础上增加用户认证功能即可 8 4POP3协议编程 8 4 1POP3概述POP3是用来接收邮件的协议 该协议的默认端口是110 POP3是根据RFC1081PostOfficeProtocol version3所制定 其中定义了POP3接收邮件的流程 指令等相关内容 POP3的流程处理与SMTP协议的不同在于 SMTP发送邮件时 不需要用户认证过程 即 SMTP协议发送邮件 不需要用户提供账号或密码 通过具有SMTP服务的服务器即可发送邮件 但POP3不同 客户端通过POP3到邮件服务器读取邮件时 必须通过认证才能读取邮件 POP3流程分为如下3个阶段 1 认证 2 邮件接收 3 根据Transaction流程的定义 更新邮件信箱 POP3接收邮件的流程图如图8 7所示 与SMTP相比 POP3的指令内容较为简单 因为在每个阶段 RFC均定义了客户端所发送指令的格式以及服务器端响应的内容 1 客户端所发送的指令必须以CRLF结尾 含义如表8 1所示 2 服务器端响应的信息 只有两种情况 OK 表示指令执行正确 ERR 表示指令执行错误 此外 在POP3的每个阶段 均有相应的指令应用 1 认证阶段 在认证阶段中 所有客户端指令如表8 7所示 8 4POP3协议编程 8 4 1POP3概述 图8 7POP3接收邮件流程图 8 4POP3协议编程 8 4 1POP3概述 表8 7认证阶段指令 2 邮件发送 在邮件发送阶段中 所有客户端指令如下表所示 3 更新邮件邮箱当客户端执行QUIT指令与服务器端结束连接时 则进入POP3的最后阶段 更新 主要是将邮件发送阶段中被DELE指令删除的邮件从邮件信箱中永久删除 此阶段没有任何指令 8 4POP3协议编程 8 4 2POP3客户端程序Socket类实现本小节主要介绍POP3客户端程序的Socket实现 接收邮件流程如图8 7所示 下面分别说明客户端接收邮件和处理服务器端返回信息的方法 如代码实例8 2所示 代码实例8 2POP3客户端程序的Socket实现说明IPAddressIPAdd IPEndPointIPEndAdd IPHostEntryIPHost 与邮件服务器建立连接try IPHost Dns Resolve strHost IPAdd IpHost AddressList 0 IPEndAdd newIPEndPoint IPAdd Address Int32 Parse strPort POP3Socket Connect IPEndAdd if pop3Socket Connected 用户认证strMsg USER strUser if POP3Request strMsg return false if POP3Response return false PASSstrMsg PASS strPass if POP3Request strMsg return false if POP3Response return false 8 4POP3协议编程 8 4 2POP3客户端程序Socket类实现 STATstrMsg STAT if POP3Request strMsg return false bytes pop3Socket Receive ReceBytes RecvBytes Length 0 strResponse Encoding ASCII GetString RecvBytes 0 bytes if strResponse StartsWith OK return false OKString strTemp strResponse Split ToCharArray totalMail Int31 Parse strTemp 1 Trim ToString mailSize Int32 Parse strTemp 2 Trim ToString 认证成功后 便可发送邮件 由客户端发送RETR指令至服务器端 待服务器端返回信息 便读取邮件标题及内容 其中 通过 判断邮件内容结束 try strMsg RETR mailNo if POP3Request strMsg return false do bytes pop3Socket Receive RecvBytes RecvBytes Length 0 if bytes 0 strResponse Encoding ASCII GetString RecvBytes 0 bytes if blnFlag if strResponse StartsWith OK 8 4POP3协议编程 8 4 2POP3客户端程序Socket类实现 return false blnFlag false strContent strContent strResponse if strContent Trim EndWith break elsebreak While true texMessage Text strContent return true Catch Exceptionex return false 定义POP3Request函数privateboolPOP3Request StringstrMsg byte byteMsg strMsg strMsg r n try byteMsg Encoding ASCII GetBytes strMsg ToCharArray pop3Socket Send byteMsg byteMsg Length SocketFlag None return true 8 4POP3协议编程 8 4 2POP3客户端程序Socket类实现 定义POP3Response函数PrivateboolPOP3Response Byte RecvBytes newbyte 256 stringstrResponse intbytes try bytes pop3Socket Receive RecvBytes RecvBytes Length 0 strResponse Encoding ASCII GetString RecvBytes 0 bytes if strResponse StartsWith OK pop3Socket Shutdowm SocketShutdown Both pop3Socket Close return false elsereturn true catch Exceptionex pop3Socket Shutdown SocketShutdown Both pop3Socket Close return false 8 4POP3协议编程 8 4 3POP3客户端程序TCP客户端类实现编写POP3客户端应用程序 除了使用System Net Sockets的Socket类之外 也可使用TCP客户端类实现 其流程图如图8 8所示 1 首先客户端用Tcp客户端类与POP3邮件服务器建立Socket连接 可使用Tcp客户端类的Connect方法建立客户端与服务器端的连接 图8 8利用Tcp客户端类编写应用程序流程图程序示例如下 指定服务器DNS主机名称与端口号try Tcp客户端pop3Socket newTcp客户端 pop3Socket Connect strHost Int32 Parse strPort Catch Exceptionex 图8 8利用Tcp客户端类编写应用程序流程图 8 4POP3协议编程 8 4 3POP3客户端程序TCP客户端类实现 2 建立客户端与服务器端数据发送接收的输入输出数据流 所建立的Tcp客户端对象代表客户端与服务器端的连接 可通过Tcp客户端类的GetStream方法取得客户端的输入 输出数据流 GetStream方法的原型为 publicNetworkStreamGetStream 程序示例如 NetworkStreamnetworkStream pop3Socket GetStream 3 然后用NetworkStream类的Write方法由客户端发送下列信息至邮件服务器 同时以NetworkStream类的Read方法处理服务器端返回的信息 以判断是否正确 客户端发送信息至服务器端 程序示例如下 Byte byteMsg try byteMsg Encoding ASCII GetBytes networkStream Write byteMsg 0 byteMsg Length Catch Exc
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 职业性格分析报告
- 足疗创业指南
- 人生导师职业规划指南
- 煤炭销售保密合同协议2026年
- 放射卫生试题题库及答案
- 普通心理学试卷及分析
- 冰箱维修制冷系统试卷及详解
- 直播运营话术设计题目及详解
- 建筑质检员基础知识试题及答案
- 银行从业资格题库及分析
- 国家义务教育质量监测模拟试题心理健康(八年级)
- Unit 5 Nature's Temper 单元测试卷-2025-2026学年人教版八年级英语下册
- UV光固化树脂项目可行性研究报告
- 建筑工地高处坠落事故应急救援演练脚本
- 2026年北京市平谷区初三下学期一模英语试卷和答案
- 2026版劳动合同法实施细则及范本
- 深度解析(2026)《DLT 2667-2023电力资产全寿命周期管理体系实施指南》
- 2026届云南省普通高中学业水平选择性考试调研测试生物试题(解析版)
- 2026年贵阳市乌当区事业单位招聘笔试参考题库及答案解析
- (二模)南通市2026届高三第一次调研测试历史试卷(含答案)
- 第19课《决胜全面建成小康社会》课件2025-2026学年统编版八年级下册历史
评论
0/150
提交评论