基于POP3与SMTP协议的邮件收发程序的开发
SMTP+POP3实验 1108
1.首先进行安装DNS 服务器,设置IP为19
2.168.215.250
设置好DNS之后下面进行安装POP3+IIS (安装POP3会直接选择安装IIS )
安装完成pop3和IIS之后(在打开控制台添加IIS 和pop3服务选项)进行管理(注:在 和 上面都进行安装和添加)
在控制台添加完成之后进行设置:打开IIS 在默认SMTP 虚拟服务里进行新建域(建立的是
远程的意思就是螚接收到的为 )之后在 的属性把允许传入…勾上:
下面同样在 的服务机上面进行建立:两台服务机都如上所示:完成之后在POP3服务里新建进行添加邮箱:
两台服务机都建立和设置完成之后在开始里找到Outlook Express 打开邮件箱再进行建立邮件服务:
之后进行设置邮件电子服务器:(如下图所示)
设置完成之后再进行设置账户名:分别为(tz9206@和xh0721@)
设置完成之后登录进入,点击创建邮件(用xh0721@发邮件给tz9206@):
之后点击邮件进行读取:读取之后再进行回复
答复发送之后在xh0721@ 上面点击发送和接受全部邮件如下所示:(会显示接收的邮件):
点击阅读看看是否是在tz9206@ 上面回复的邮件。
由上图的实验结果显示试验成功。
实验到此结束。
试验总结:需要注意每一个选项及重点选项(属性接收的范围是否打勾)
实验人:邵天增
2011年11月8日。
基于POP3协议的电子邮件接收程序的设计论文
南阳理工学院毕业设计论文题目基于POP3协议的电子邮件接收程序的设计学院软件学院专业软件工程班级08级软件工程7班姓名王志杰指导教师刘凯2012 年 3 月26 日目录摘要 (2)1、引言 (3)1.1 课程设计的内容 (3)1.2 课程设计的要求 (3)2、设计平台简介 (3)2.1 VC++ (3)3、邮件接收协议 (5)3.1 POP3简介 (5)4、设计原理 (8)4.1 POP3交互模型 (8)5、课程设计步骤 (9)5.1 函数构造 (9)5.2 接收邮件的步骤 (15)6、测试 (19)6.1 测试目的 (19)6.2 测试环境 (19)6.3 测试结果 (19)6.4 结果分析 (20)7、出现的问题及解决方法 (20)7.1设计中出现的问题 (20)7.2解决方法 (20)参考文献 (21)摘要电子邮件可以使人们有效地进行电子化的数据异地交换。
Internet以电子邮件服务推动着人类的通信行为不断发展,邮件的接收系统。
本论文以Visual C#为开发平台,利用Socket 套接字编程,实现了基于POP3协议的邮件接收程序,介绍了POP3协议的原理及电子邮件接收程序的设计与实现方法。
随着Internet/Intranet的迅猛发展,电子邮件(E-Mail)已成为因特网上非常流行、非常方便的通信方式。
电子邮件技术不断进步,邮件协议也不断发展。
目前应用最广泛的电子邮件收件协议是POP3。
本文采用微软最新的.NET技术,以Visual C#为开发平台,利用Socket套接字编程开发了基于POP3协议的邮件接收程序,现对相关原理及具体设计进行讨论。
关键词课程设计;电子邮件;接收程序;POP3;Socket;Visual C#1、引言随着Internet/Intranet的迅猛发展,电子邮件(E-Mail)已成为因特网上非常流行、非常方便的通信方式。
电子邮件技术不断进步,邮件协议也不断发展。
运用C_实现POP3邮件接收程序
运用C#实现POP3邮件接收程序微软的开发工具推出已有一段时日了,其中的那门新语言C#也日渐为大家所熟悉并接受。
C#作为一门新兴的语言相信具有传统语言不可比拟的优越性,特别是在网络应用方面,开发者更是感觉到了C#的强大功能。
所以本文就通过运用C#来实现一个基于POP3协议的邮件接收程序来向大家展示C#网络编程的功能强大,同时也向大家介绍一下基于POP3协议的电子邮件接收原理。
首先我向大家介绍邮件接收的基本原理:一开始便是客户端与服务器的连接。
不过,在客户端连接到服务器之前,注意把端口设为POP3协议默认的110号。
客户端连接服务器成功后,服务器会返回以下信息:+OK……字符+OK是POP3协议的返回信息。
它的回应信息不像SMTP协议那样用丰富多变的数字表示,只有两个:+OK或者-ERR。
其中,+OK表示连接成功,而-ERR则表示连接失败。
接下来,客户端输入USER <用户名>该命令告诉服务器你的用户名。
注意,有些服务器会区分大小写字母的。
服务器返回+OK后,客户端输入PASS <口令>服务器返回+OK后,还返回一些邮箱的统计信息,比如:+OK 1 message(s) [1304 byte(s)]不同的服务器返回的信息格式不太一样,所以我们可以用STAT命令来查看邮箱的情况。
STAT命令的回应中有两个数字,分别表示邮件的数量和邮件的大小。
如果信箱里有信,就可以用RETR命令来获取邮件的正文。
RETR命令的格式为:RETR <邮件编号>如果返回结果第一行是+OK信息,则表示成功。
第二行起便是邮件的正文。
最后一行和SMTP协议一样,是一个单独的英文句号,表示邮件的结尾部分。
把邮件存储起来后要用DELE命令删除邮箱中的邮件,否则原有的邮件会继续保留在服务器上,一旦邮件一多,你的邮箱就爆了。
DELE命令的格式为:DELE <邮件编号>如果删错了,可以用RSET命令来恢复所有已被删除的邮件。
基于SMTP、POP3协议的电子邮件自动收发系统的开发
更 高 层 的 协 议 , 规 定 每 一 台 计 算 机 在 发 送 ( 中 转 ) 件 时 经 或 信 怎 样 找 到 下 一 个 目 的地 , 信 件 在 两 台计 算 机 之 间 的 传 送 仍 而
送 给 多 个 收 件 人 。现在 很 多公 司 都 可 惟 利 用 这 种 工 具 进 行 联
机查询 、 网上 调 查 等 等 。 电子 邮 件 是 现在 应 用 最 广 泛 的 系 统 , 文 基 于 S 本 MTP和 P 3 议 开 发 了一 个 实用 的 邮件 收 发 系 统 。 OP 协
2 电子 邮件 工作原 理 及协 议
2 1 电子 邮件 的传 输 .
一ห้องสมุดไป่ตู้
计算 机上有信 箱帐号的用户都被分配一定 的存储 空间作为其 “ 信箱”存 储空间包含和所收信件 、 , 编辑信件 以及信件存档 三
部 分 空 间 , 位 用 户 都 有 属 于 自己 的 一 个 确 定 用 户 名 和 用 户 每 可 以 自己修 改 口令 的信 箱 , 户 使 用 口令 开 发 自 己 的信 箱 , 用 并 进 行 发 信 、 信 、 辑 、 发 、 档 等 各 种 操 作 。 电子 邮件 的传 读 编 转 存 输 则 是 通 过 电子 邮件 简 单 传 输 协 议 S MTP来 实 现 的 。
pooo) _ 电子 邮件 服 务 中分 别 负 责 收信 和 发信 的 两 种 协 议 。 本 文 介 绍 了 电子 邮 件 系统 的 工 作 原 理 及 相 关 协 议 , 基 于 这 些 r tc 1 ̄ 在 并
协 议 设 计 和 开发 了一 个 实 用 的 邮 件 系统 。 关 键 词 : 子 邮 件 ; MT 电 S P协 议 ; OP 3协 议 ; 件 收 发 P 邮
基于POP3的邮件收发系统的设计与实现
题目基于POP3的邮件收发系统的设计与实现学生姓名陈新鹏学号 1213014008 所在学院物理与电信工程学院专业班级电子1201班指导教师李菊叶完成地点物电学院计算机信息处理实验室2016 年 6 月 5 日陕西理工学院毕业设计毕业论文﹙设计﹚任务书院(系) 物电学院专业班级电子信息工程学生姓名陈新鹏一、毕业论文﹙设计﹚题目基于POP3的邮件收发系统的设计与实现二、毕业论文﹙设计﹚工作自__2016 __年_3 _月10 日起至_ 2016__年6 月20 日止三、毕业论文﹙设计﹚进行地点: 物电学院计算机信息处理分室四、毕业论文﹙设计﹚的内容要求:POP3(Post office Protocol 3)是适用于C/S结构的脱机模型电子邮件协议,它规定怎样将个人计算机连接到Internet的邮件服务器下和下载电子邮件的协议。
本设计要求学生,在Visual c++环境下,使用POP3技术开发一个邮件接收系统,接收邮件服务器上的邮件之后,把邮件下载并保存到本地计算机上,要求可以提取邮箱里的邮件数量和标题字段等内容。
五、毕业论文﹙设计﹚应收集资料及参考文献:[1]徐孝凯,张纪勇.C++面向对象程序设计:VC++6.0运行环境[M].天津大学出版社2009.[2]汪晓平,钟军.VC++网络通信协议分析与应用实现[M].北京:人民邮电出版社,2003.[3]王艳平,张越.Windows网络与通信程序设计[M].北京:人民邮电出版社,2006.[4] Andrew S.Tanenbau.计算机网络(第四版)[M].北京:清华大学出版社,2004.[5]谢希仁.计算机网络(第五版)[M].北京:电子工业出版社,2012.[6]朱桂英.张元亮Visual C++网络编程开发与实践[M].清华大学出版社.2013.六、毕业论文﹙设计﹚的进度安排:3月2日——3月29日:查阅资料,完成初步设计方案和开题报告。
4月1日——4月26日:根据POP3邮件收发系统的工作原理,给出设计方案,及软件流程图。
基于POP3与SMTP协议的邮件收发程序的开发
一、设计思想电子邮件指用电子手段传送信件、单据、资料等信息的通信方法。
电子邮件综合了电话通信和邮政信件的特点,它传送信息的速度和电话一样快,又能象信件一样使收信者在接收端收到文字记录。
电子邮件系统又称基于计算机的邮件报文系统。
它承担从邮件进入系统到邮件到达目的地为止的全部处理过程。
电子邮件不仅可利用电话网络,而且可利用任何通信网传送。
在利用电话网络时,还可利用其非高峰期间传送信息,这对于商业邮件具有特殊价值。
由中央计算机和小型计算机控制的面向有限用户的电子系统可以看作是一种计算机会议系统。
电子邮件的工作过程遵循客户-服务器模式。
每份电子邮件的发送都要涉及到发送方与接收方,发送方式构成客户端,而接收方构成服务器,服务器含有众多用户的电子信箱。
发送方通过邮件客户程序,将编辑好的电子邮件向邮局服务器(SMTP服务器)发送。
邮局服务器识别接收者的地址,并向管理该地址的邮件服务器(POP3服务器)发送消息。
一个邮件系统的传输包含用户代理User Agent传输代理TransferAgent及接受代理DeliveryAgent三大部分。
用户代理是一个用户发信和收信的程序,负责将电子邮件按照一定的标准包装,然后送至邮件服务器,或由邮件服务器收回。
传输代理负责信件的交换和传输。
将信件传送至适当的邮件主机,再由接受代理将信件分发至不同的邮件信箱。
传输代理必须要能够接受用户邮件程序送来的信件,解读收信人的地址,根据SMTP协议将它正确无误地传递到目的地。
现在一般的传输代理已采用Sendmail程序完成工作。
电子邮件到达邮件主机后,在经接收代理POP协议被用户读取至自己的主机。
电子邮件在发送与接收过程中都要遵循SMTP、POP3等协议,这些协议确保了电子邮件在各种不同系统之间的传输。
其中,SMTP负责电子邮件的发送,而POP3则用于接收Internet 上的电子邮件。
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
SMTP与POP3应用编程
10
1.1 SMTP和ESMTP (续) 和
3.响应信息 响应信息 接收方收到SMTP命令之后,会给出一个响应码。发送者在 命令之后,会给出一个响应码。 接收方收到 命令之后 响应码 发送下一条命令前必须等待应答, 发送下一条命令前必须等待应答,成功应答才能继续向下 执行。每个命令必须有且只有一个响应码。 执行。每个命令必须有且只有一个响应码。 SMTP响应码由 位数字组成,其后跟一些文本信息。 响应码由3位数字组成 其后跟一些文本信息。 响应码由 位数字组成, 格式: 格式: 3位数字的响应码 位数字的响应码<SP>文本 文本<CRLF> 位数字的响应码 文本 其中, 表示空格 表示空格, 表示回车换行。 其中,SP表示空格,CRLF表示回车换行。 表示回车换行 表9-2
9
1.1 SMTP和ESMTP (续) 和
3) 正文 正文是邮件的内容。首部以一个空行结束, 正文是邮件的内容。首部以一个空行结束,再下面就是正文 部分。 部分。 4) 结束符号 符合协议的邮件均以“.”结束。客户端软件接收到邮件后, 符合协议的邮件均以“ ”结束。客户端软件接收到邮件后, 再将其转换为某种形式展现给用户。 再将其转换为某种形式展现给用户。
13
1.3 邮件的发送过程
第2步:客户端开始发送邮件的信封。 步 客户端开始发送邮件的信封。
客户端发送“ 发信人的地址>”命令, 客户端发送“MAIL FROM:<发信人的地址 ”命令,服务器 发信人的地址 收到后返回“ 收到后返回“250”响应码,表示请求操作就绪。 ”响应码,表示请求操作就绪。 客户端发送“ 收信人的地址>”命令, 客户端发送“RCPT TO:<收信人的地址 ”命令,服务器收 收信人的地址 到后返回“ 到后返回“250”响应码,表示请求操作就绪。 ”响应码,表示请求操作就绪。
第二部分 编写基于POP3协议的EMAIL接收软件
第二部分编写基于POP3协议的EMAIL接收软件1. POP3协议POP3(Post Office Protocol -version 3)是一种常用的网络协议,用于从远程服务器的信箱里收取EMAIL,它的常用命令根据连接时的不同状态,有:l 授权状态(AUTHORIZATION state):User 用户名Pass 用户密码Quit 退出l 执行状态(TRANSACTION state):STAT 信箱状态,信箱内共有几封信,总共大小(8进制表示)等LIST 不用msg参数时,显示每封信的大小列表,用msg参数,显示编号为msg的信件的长度(8进制表示)TOP取编号为msg的信件的信头(head)和部分信体(body), n=0,只取信头,n≠0,取信头和信体的前n行。
该命令为可选命令,有些pop3 服务器软件不支持。
RETR 取编号为msg的信件DELE 删编号为msg的信件,其实只是做个标记,实际删除要到更新状态l 更新状态(UPDATE state)QUIT 退出,顺便把做过DELE标记的邮件删掉还有NOOP,LAST,RSET,RPOP等命令,较少用到。
2.界面布局下面这个小程序只是为了测试一下用winsock控件实现pop3协议收信的情况,因此界面布局比较简单,使用了一些文本框来输入和显示需要的信息。
3.主要程序设计在frame1里加入一个WINSOCK控件,起名为WINSOCK1,属性Protocol 设为sckTCPProtocol ,RemotePort设为110,LocalPort设为1001。
Ⅰ.连接POP3服务器填入正确的用户名,密码,POP3服务器名后,按"进行连接"键,执行以下指令:Private Sub Start_Click()On Error GoTo GetfailWinsock1.RemoteHost = Svrname.Text '设置远程服务器的IP或域名Winsock1.Connect '连接远程服务器Waiting '等待应答Winsock1.SendData "USER " + Acou.Text + Chr(13) + Chr(10) '发送用户名Waiting '等待应答Winsock1.SendData "PASS " + Passwd.Text + Chr(13) + Chr(10)'发送用户密码Waiting '等待应答Winsock1.SendData "STAT " + Chr(13) + Chr(10) '取信箱状态Waiting '等待应答Winsock1.SendData "LIST" + Chr(13) + Chr(10) '信件大小列表Waiting '等待应答End IfExit SubGetfail:Info.Text = Info.Text + Chr(13) + Chr(10) + "网络错误!" + Chr(13) + Chr(10)Winsock1.Close '关闭WINSOCK连接End SubⅡ.接收POP3服务器的应答l 延时程序waitingPublic Sub Waiting()Dim PauseTime, StartPauseTime = 60 ' 设置等待响应时间的最长时间60s。
基于SMTP、POP3协议的电子邮件自动收发系统的开发
基于SMTP、POP3协议的电子邮件自动收发系统的开发张健;林丽丽
【期刊名称】《微型电脑应用》
【年(卷),期】2007(23)4
【摘要】电子邮件是Internet上应用最多和最广的服务项目,SMTP(Simple Mail Transport protocol)和POP3(Post office protocol)是在电子邮件服务中分别负责收信和发信的两种协议.本文介绍了电子邮件系统的工作原理及相关协议,并基于这些协议设计和开发了一个实用的邮件系统.
【总页数】3页(P20-22)
【作者】张健;林丽丽
【作者单位】北京机械工业学院信息管理与信息系统教研室,北京,100085;北京机械工业学院信息管理与信息系统教研室,北京,100085
【正文语种】中文
【中图分类】TP393.098
【相关文献】
1.基于SMTP-POP3协议的嵌入式远程控制设计与实现 [J], 成凯丽;叶玮琼;许林
2.基于SMTP和POP3协议的远程存储系统研究 [J], 毕卫红;吴淼;张巧玲
3.基于SMTP和POP3协议的远程存储系统研究 [J], 毕卫红;吴淼;张巧玲
4.电子邮件SMTP/POP3收发协议的研究与实现 [J], 付祝财;杨莘元;王阳
5.基于SMTP和POP3的电子邮件客户端 [J], 刘娅;张鹏博
因版权原因,仅展示原文概要,查看原文内容请购买。
第13章 SMTP与POP3协议开发
2
13.2 简单邮件传输协议(SMTP)
电子邮件的组成
1.信封 信封包括发信人的邮件地址和接收人的邮件地址,用两 条SMTP命令指明。 2. 首部(首部中常用字段格式 见教材) 3.正文 正文是邮件的内容。首部以一个空行结束,再下面就 是正文部分。 邮件以“.”结束。
7
密码验证
• byte[] by=System.Text.Encoding.Default.GetBytes(pass word.ToCharArray ()); • strCmd=Convert.ToBase64String(by); • strCmd+="\r\n"; byte[] bw=System.Text.Encoding.Default.GetBytes(strC md.ToCharArray ()); netStrm.Write (bw,0,bw.Length ); StreamReader.ReadLine()
6
用户名
• byte[] by=System.Text.Encoding.Default.GetBytes(user name.ToCharArray ()); • strCmd=Convert.ToBase64String(by); • strCmd+="\r\n"; byte[] bw=System.Text.Encoding.Default.GetBytes(strC md.ToCharArray ()); netStrm.Write (bw,0,bw.Length ); StreamReader.ReadLine()
8
3. 断开与服务器的连接 命令格式:QUIT 使用QUIT命令退出系统,断开与服务器的连接。 strCmd="QUIT\r\n"; byte[] bw=System.Text.Encoding.Default.GetBytes(strC md.ToCharArray ()); netStrm.Write (bw,0,bw.Length ); StreamReader.ReadLine()
用Telnet命令收发邮件(SMTP和POP3协议)实验报告
用Telnet命令收发邮件(SMTP和POP3协议)【实验前准备】申请两个新浪邮箱:wulianwang01@密码:**********(作为发件邮箱)wulianwang02@密码:**********(作为收件邮箱)将发件邮箱进行Base64编码(百度搜索在线编码器):wulianwang01(d3VsaWFud2FuZzAx);wulianwang(d3VsaWFud2FuZw==)。
【实验一】用SMTP协议发送邮件SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)定义了邮件客户端软件与SMTP服务器之间,以及两台SMTP服务器间的通信规则。
要给某个SMTP服务器发送邮件,首先要获知该SMTP服务器的主机名,新浪的SMTP服务器主机名为 25,SMTP服务器的端口号为25。
实现步骤:1、打开windows命令行窗口,使用telnet命令连接到sina的SMTP服务器的25号端口,即在命令行窗口中输入如下内容:telnet 25220,表示登陆SMTP服务器成功。
2、SMTP发送者程序与SMTP接收者程序建立连接后,接着应该使用helo命令向SMTP接收程序发送问候信息:helolocalhost(localhost代表本地主机)。
250,代表与SMTP服务器成功建立链接。
3、输入命令:auth login。
表示登陆发件邮箱。
SMTP服务器返回的响应状态码为334,它表示SMTP服务器正在等待客户端输入认证信息。
这时,输入经过BASE64编码的发件邮箱用户名和密码。
4、输入mail from命令,填写上刚刚注册的发送邮箱地址:mailfrom:<wulianwang02@>。
这个邮箱可以随便填写,因为SMTP协议不要求SMTP服务器对mail from命令后的邮箱地址进行验证,效果图如下:5、输入rcpt to命令。
填写收件者邮箱:rcpt to:wulianwang01@。
SMTP、POP3协议及实现
服务器邮件结构
#define MAX_MAIL typedef struct{ unsigned char sender[80]; 发送者 unsigned char recipient[80];接受者 unsigned char subject[80]; 主题字 unsigned char filename[80]; 附件文件名 unsigned char rawMail[MAX_MAIL];原始邮件 unsigned char attachment[MAX_ATTACHMENT]; int attachlen; )Mail; (1024 * 1024)
7、RCPT TO:<>....................................接收者,多个接收者多次调用该命令
8、DATA..........................................即将输入邮件正文 依次输入TO: ; FROM: ;SUBJECT: ;空一行 正文; 隔行以.结束
SMTP项目概要设计
简单邮件传输协议SMTP
简单邮件传输协议 (Simple Mail Transfer Protocol, SMTP) 是事实上的在Internet传输
email的标准。SMTP是一个相对简单的基于文本的协议。在其之上指定了一条消息的 一个或多个接收者(在大多数情况下被确认是存在的),然后消息文本会被传输。
1.SMTP的最大特点:简单、直观 只规定发送程序和接收程序之间的命令和应答 命令和响应都是可读的ASCII字符串 2.SMTP邮件传输采用客户—服务器模式 3.SMTP服务器在TCP的25端口守候 4.SMTP协议是一个严格的锁步协议
常用的SMTP命令
常用的SMTP响应
使用SMTP和POP3协议实现收发邮件(CC++)(转)
使⽤SMTP和POP3协议实现收发邮件(CC++)(转)SMTP协议和POP3协议就不详细阐述了,⽹上⼀搜索会有⼀⼤把给你解释的。
下⾯直接贴代码:⾸先写⼀个class Sock类,这个类的功能主要是创建套接字(即int sock),⽤套接字來连接邮箱服务器。
类⾥⾯还带有send_socket和recv_socket两个函数,其功能分别是向邮箱服务器发送协议指令和接收服务器反馈回来的信息。
sock.h⽂件[cpp]1. 1 #ifndef __SOCK_H__2. 2 #define __SOCK_H__3. 34. 4 #include <iostream>5. 5 #include <sys/socket.h>6. 6 #include <sys/epoll.h>7. 7 #include <stdio.h>8. 8 #include <netinet/in.h>9. 910. 10 class Sock11. 11 {12. 12 public:13. 13 Sock();14. 14 bool Connect(const char *host_id, const int &port);15. 15 void send_socket(const char *s);16. 16 int recv_socket();17. 17 const char * get_recvbuf();18. 18 ~Sock();19. 19 private:20. 20 char recvbuf[BUFSIZ];21. 21 int sock;22. 22 int num;23. 23 struct sockaddr_in server;24. 24 struct hostent *hp;25. 25 };26. 2627. 27 #endifsock.cpp⽂件[cpp]1. 1 #include "sock.h"2. 2 #include <stdexcept>3. 3 #include <netdb.h>4. 4 #include <string.h>5. 5 #include <sys/types.h>6. 67. 7 Sock::Sock()8. 8 {9. 9 sock = socket(AF_INET, SOCK_STREAM, 0);10. 10 if(sock == -1)11. 11 {12. 12 throw std::runtime_error("socket init error\n");13. 13 }14. 14 }15. 15 Sock::~Sock()16. 16 {17. 17 close(sock);18. 18 }19. 19 bool Sock::Connect(const char *host_id, const int &port)20. 20 {21. 21 server.sin_family = AF_INET;22. 22 hp = gethostbyname(host_id);23. 23 if(hp == (struct hostent *) 0)24. 24 {25. 25 std::cerr << "服务器地址获取失败!" << std::endl;26. 26 return false;27. 27 }28. 28 memcpy((char *)&server.sin_addr,29. 29 (char *)hp->h_addr, hp->h_length);30. 30 server.sin_port = htons(port);31. 31 if(connect(sock, (sockaddr *) &server, sizeof server) == -1)32. 32 {33. 33 std::cerr << "连接服务器失败!" << std::endl;34. 34 return false;35. 35 }36. 36 else37. 37 return true;38. 38 }39.40. void Sock::send_socket(const char *s)41. 40 {42. 41 send(sock, s, strlen(s), 0);43. 42 }44. 43 int Sock::recv_socket()45. 44 {46. 45 memset(recvbuf, 0,BUFSIZ);47. 46 return recv(sock, recvbuf, BUFSIZ, 0);48. 47 }49. 48 const char * Sock::get_recvbuf()50. 49 {51. 50 return recvbuf;52. 51 }下⾯是⽤SMTP协议发送邮件,格式就如代码所⽰。
SMTP与POP3应用编程
12
1. POP3工作原理
客户端软件读取邮件之前,需要事先与 服务器建立TCP连接。连接成功后,POP3 服务器会向该客户端发送确认消息,客户端 等待服务器响应,并处理接收的信息,然后 再接着发送下一个命令,如此往复多次,一 直持续到连接终止。
这个过程经历了三个状态:授权状态 (AUTHORIZATION)、操作状态 (TRANSACTION)和更新状态(UPDATE)。
25
5.2 利用同步TCP接收电子邮件(续)
①建立连接
int index = textBoxUser.Text.IndexOf('@'); //大部分pop3服务器都加前缀pop3.,这里仅获 取这种服务器 //对不以pop3.为前缀的这个例子未进行处理 string pop3Server = "pop3." + textBoxUser.Text.Substring(index + 1);
5.2 利用同步TCP接收电子邮件(续) ②LIST命令
语法形式:LIST 功能:从服务中获得邮件列表和大小。 服务器返回:列出邮件列表和大小。 示例:C:LIST S:+OK 2 messages (320 octets) S:1 120 S:2 200 S: .
19
20
③RETR命令
语法形式:RETR <邮件的序号> 功能:从服务器中获得一个邮件。 服务器返回:+OK成功;-ERR错误。 示例:C: RETR 1 S:+OK 120 octets S:<服务器发送信件1内容> S: . 注意,这里的“.”是单独发送的。
1
第5章 SMTP与POP3应用编程
5.1 通过应用程序发送电子邮件 5.2 利用同步TCP接收电子邮件
【实验参考】:SMTP及POP3协议分析
SMTP及POP3协议分析
熊建辉
简介:基于Windows Server2003虚拟机配置服务及抓包实现,物理机(Windows PC操作系统)测试产生相应流量
基础:
Win2003虚拟机所使用的网卡为Microsoft Loopback Adapter,IP为172.16.1.200,物理机Microsoft Loopback Adapter的IP为172.16.1.100,两者需要能ping通,如下图所示:
虚拟机ping物理机
物理机ping虚拟机
安装SMTP及POP3服务:
在虚拟机中开始运行输入“sysocmgr/i:sysoc.inf”,在弹出的下图中选中“电子邮件服务”单击“下一步”安装向导安装即可,注意载入系统IOS文件。
配置SMTP及POP3服务:
通过开始-管理工具-POP3服务,打开POP3管理界面,新建域名(自定,此处写为
),然后新建用户aa、bb,密码为123,如下图所示:
产生SMTP及POP3流量:
在物理机上,可以通过Outlook Express或者命令行方式,此处通过命令行方式发送接收邮件,通过Outlook Express验证,具体通过aa@发邮件给bb@,然后bb@接收邮件,详情如下:
连接SMTP服务器(准备发邮件)
aa@发邮件给bb@
连接POP3服务器(准备收邮件)
bb@接收aa@发送的邮件
通过Outlook查看刚看的通信结果:
向office outlook2007中添加用户aa@、bb@
单击发送/接收邮件,在提示中单击邮件,即可看到如下内容邮件。
协议分析:。
VisualC_开发环境下用SMTP_POP3实现邮件收...
V isual C ++开发环境下用S M T P 、PO P 3实现邮件收发广州城市职业学院 洪 洲[摘 要]电子邮件可以使人们有效地进行电子化的数据异地交换。
Internet 以电子邮件服务推动着人类的通信行为不断发展。
电子邮件在发送和接收过程中遵循:S M T P 、PO P 3和M I M E 等协议标准。
S M PT 协议用来进行邮件的发送,PO P 3协议用来进行邮件的接收,M I M E 协议用来进行邮件中附件的处理。
本文基于套接字以V C 为开发工具实现了电子邮件的收发。
[关键词]电子邮件 S M T P PO P 3 套接字 1引言随着Internet 的飞速发展,电子邮件开始走进千家万户。
电子邮件是当前应用最为广泛的一种计算机通信手段。
它改变了人们传统的通讯方式,从某种意义上它也改变了人们对于距离的概念。
可以说,Internet 以电子邮件服务推动着人类的通信行为向着更高阶段不断发展。
电子邮件在发送和接收的过程中要遵循一些基本协议,其中S M T P 和PO P 3是两个关键的协议。
2电子邮件体系结构和服务功能一个电子邮件系统主要分为两个子系统:服务器系统(Server System )和客户端系统(C lient System )。
服务器系统的主要功能是实现电子邮件在Internet Intranet 中的传输,客户端系统的主要功能有两项:发送电子邮件和接收电子邮件。
电子邮件的工作原理遵循客户 服务器模式,一封电子邮件的发送要涉及到发送方和接受方,发送方构成客户端,而接收方则为服务器。
在服务器中包含有众多用户的电子信箱。
当发送方编辑好一份电子邮件后,依照收件人的地址将其发送出去;接收方服务器收到电子邮件后,先将其存放在电子信箱中,并告知收件人有新邮件到来。
收件人在每次连接到服务器上后,就会看到服务器的通知,进而打开自己的电子信箱来查收邮件。
发送方的主机与接收方的邮件服务器直接相连,从而建立了从发送方主机到接收方的邮件服务器之间的直接通道,这就保证了邮件传送的可靠。
SMTP+POP3+PGP邮件收发实验
SMTP+POP3+PGP邮件收发实验
实验拓扑:
在虚拟机中安装两台2003Server,计算机名分别改为mail和client,在本实验中mail电脑即充当邮件服务器和DNS服务器,同时也是收发邮件的客户端。
要求在mail电脑上安装配置SMTP、POP3、DNS服务,并且要求实现邮件加密。
准备工作:
首先修改计算机名字:(注意DNS后缀也要修改)
安装POP3和SMTP以及DNS组件
SMTP服务器的配置:
右键“默认SMTP虚拟服务器”,点击“属性”,跳出如下对话框,输入IP 地址:1.1.1.1
下面配置POP3服务。
在下新建两个用户111和222,密码也分别是111和222。
这里注意邮箱名111后面不需要加上。
下面设置OUTLOOK:
这里的显示名无所谓,只是让对方看到的名字。
这里填写自己的电子邮箱地址
这里填写POP3和SMTP服务器的地址,可以填IP地址也可以填计算机名字。
(在大型网络中POP3和SMTP服务器往往不是同一台)
这里填写邮件登录的用户名和密码。
下面在另一台客户机上查收邮件:。
第7章 SMTP与POP3网络程序开发技术-C#网络程序开发(第二版)-何波-清华大学出版社
1.1 SMTP
3.响应信息 接收方收到SMTP命令之后,会给出一个响应码。
发送者在发送下一条命令前必须等待应答,成功 应答才能继续向下执行。每个命令必须有且只有 一个响应码。 SMTP响应码由3位数字组成,其后跟一些文本信 息。 格式:
3位数字的响应码<SP>文本<CRLF> 其中,SP表示空格,CRLF表示回车换行。
SMTP服务器 (1)SMTP服务器是遵循SMTP协议的发送邮件服务器,用来发 送或中转电子邮件。 (2)SMTP服务器在TCP的25端口监听连接请求。
客户端发送电子邮件过程是:先通过客户端软件将邮件 发送到SMTP邮件服务器,然后再由SMTP邮件服 务器发送到目标SMTP邮件服务器。
1.1 SMTP
客户端发送电子邮件过程 首先通过25端口与SMTP邮件服务器建立连接,然后 向服务器发送命令,将邮件发送到SMTP邮件服务器, 然后再由SMTP邮件服务器发送到目标SMTP邮件服 务器。
1.1 SMTP
3) 正文
4) 结束符号 符合协议的邮件均以“.”结束。客户端软件接收 到邮件后,再将其转换为某种形式展现给用户。
第7章 SMTP与POP3网络程序开发技术
本章内容
1 SMTP简介 2 POP3简介 3 邮件收发相关类
1 SMTP简介
1.1 SMTP和ESMTP 1.2 与邮件服务器连接 1.3 邮件的发送过程
1.1 SMTP
1. SMTP
SMTP 是Simple Mail Transfer Protocol的简称,即简单邮件传输协议, 命令和响应都是基于 ASCII 文本,命令和响应并均以回车(CR) 和换行(LF)符结束。
第3步:客户端开始发送邮件数据。 客户端发送“DATA”命令,表示开始向服务器发
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、设计思想电子邮件指用电子手段传送信件、单据、资料等信息的通信方法。
电子邮件综合了电话通信和邮政信件的特点,它传送信息的速度和电话一样快,又能象信件一样使收信者在接收端收到文字记录。
电子邮件系统又称基于计算机的邮件报文系统。
它承担从邮件进入系统到邮件到达目的地为止的全部处理过程。
电子邮件不仅可利用电话网络, 而且可利用任何通信网传送。
在利用电话网络时, 还可利用其非高峰期间传送信息,这对于商业邮件具有特殊价值。
由中央计算机和小型计算机控制的面向有限用户的电子系统可以看作是一种计算机会议系统。
电子邮件的工作过程遵循客户- 服务器模式。
每份电子邮件的发送都要涉及到发送方与接收方,发送方式构成客户端,而接收方构成服务器,服务器含有众多用户的电子信箱。
发送方通过邮件客户程序,将编辑好的电子邮件向邮局服务器(SMTP服务器)发送。
邮局服务器识别接收者的地址,并向管理该地址的邮件服务器(POP3服务器)发送消息。
一个邮件系统的传输包含用户代理User Agent 传输代理TransferAgent 及接受代理DeliveryAgent 三大部分。
用户代理是一个用户发信和收信的程序, 负责将电子邮件按照一定的标准包装,然后送至邮件服务器, 或由邮件服务器收回。
传输代理负责信件的交换和传输。
将信件传送至适当的邮件主机, 再由接受代理将信件分发至不同的邮件信箱。
传输代理必须要能够接受用户邮件程序送来的信件,解读收信人的地址,根据SMTP协议将它正确无误地传递到目的地。
现在一般的传输代理已采用Sendmail 程序完成工作。
电子邮件到达邮件主机后, 在经接收代理POP协议被用户读取至自己的主机。
电子邮件在发送与接收过程中都要遵循SMTP POP3等协议,这些协议确保了电子邮件在各种不同系统之间的传输。
其中,SMTP负责电子邮件的发送,而POP3则用于接收In ternet 上的电子邮件。
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
SMTP协议属于TCP/ IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。
通过SMTP协议所指定的服务器,我们就可以把E—mail寄到收信人的服务器上了,整个过程只要几分钟。
SMTP!务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转你发出的电子邮件。
POP3(Post Office Protocol 3)即邮局协议,目前已发展到第三版,称POP3它规定怎样将个人计算机连接到Internet 的邮件服务器和下载电子邮件的电子协议。
它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。
总的来说POP3协议是让用户把服务器上的信收到本地来所需要的一种协议。
本程序为一个基于SMTP和POP3协议的小型EMAIL收发程序,简单的实现了邮件的收发功能。
三、源代码下面给出的是用登录程序的源代码:using System;using System.Collections.Generic; using ponentModel; using System.Data; using System.Drawing; using Syste m. Linq; using System.Text;using System.Windows.Forms; using ; using .Sockets; using Syste m 」O;算法流程图图1算法流程图//导入名字空间//包含定义各种对象集合的接口和类〃包含表示 ASCII 等字符编码的类namespace MailSendOfRecive{public partial class Form3 : Form{public string Conn,Uname,Pwd,Inf; public TcpClient Server;public NetworkStream NetStrm; public StreamReader RdStrm; public Boolean BPass;public string Data;public byte[] szData;public string CRLF = "\r\n";public Form2 Sender;public Form3(){InitializeComponent();}private void Login_Click(object sender, EventArgs e)Conn = "pop."+textBox1.Text.Trim();Uname = textBox2.Text.Trim();Pwd = textBox3.Text;Server = new TcpClient(Conn, 110); try{NetStrm = Server.GetStream();RdStrm = new StreamReader(Server.GetStream(), System.Text.Encoding.Default);RdStrm.ReadLine();Data = "USER "+ Uname + CRLF;szData =System.Text.Encoding.ASCII.GetBytes(Data);// 获取ASCII 值NetStrm.Write(szData,0,szData.Length);RdStrm.ReadLine();Data = "PASS "+ Pwd + CRLF;szData =System.Text.Encoding.ASCII.GetBytes(Data); NetStrm.Write(szData,0,szData.Length);Inf = RdStrm.ReadLine();if (Inf.IndexOf("+OK")>-1){BPass = true;/ / 布尔值设为真Sender = new Form2(Uname, Pwd, textBox1.Text); this.Hide();Sender.Show();}else if (Inf.IndexOf("-OK")>-1)/ / 判断索引//命名空间//定义类//定义用户名、密码//定义服务器// 定义BPass//定义快捷键//定义框架//初始化//用户名//密码//服务器//读取字符并返回{MessageBox.Show(”密码或者用户名错误",”用户验证");//文本框显示信息}Data = "QUIT";szData = System.Text.Encoding.ASCII.GetBytes(Data);NetStrm.Write(szData, 0, szData.Length); //写入数据}catch (System.Exception ex){MessageBox.Show(ex.Message); //文本框显示信息}private void Form3_Load(object sender, EventArgs e)// 定义Form3_Load下面是发送邮件程序源代码using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using ;using .Sockets;using System.IO;using System.Collections;using System.Data.OleDb;namespace MailSendOfRecive{public partial class Form1 : Form{TcpClient smtpSrv;NetworkStream netStm;string CRLF = "\r\n";public List<MailInfo> SMail = new List<MailInfo>(); public Form2 fa;public string Ua, Pw, Sv; //导入名字空间//包含定义各种对象集合的接口和类// 包含表示ASCII 等字符编码的类//命名空间//定义类//提供数据流public Form1(Form2 f,string UN,string Pd,string SR) // 创建Form1{fa = f;Ua = UN;Pw = Pd;Sv = SR;InitializeComponent(); // 初始化}public void WriteStream(string strCmd){strCmd += CRLF; //crlf 表示结束byte[] bw = System.Text.Encoding.Default.GetBytes(strCmd); // 将字符串转为字节数组netStm.Write(bw,0,bw.Length); // 写入网络}private string AuthStream(string strCmd) // 连接服务器输出字符串{try{byte[] by = System.Text.Encoding.Default.GetBytes(strCmd);strCmd = Convert.ToBase64String(by);}catch (System.Exception ex){return ex.ToString();}return strCmd;}public bool tryTran( ref string a){string b = "";b = a;try{byte[] outputb = Convert.FromBase64String(a);a = Encoding.Default.GetString(outputb); return true;}catch (System.Exception ex){a= b;return false;}}public void WritInf(string s)//转换成base64 编码//定义布尔变量//转换数据类型//显示错误// 定义WritInf{ tryTran(ref s); listBoxMsg.Items.Add(s);}private void ButtonSend_Click(object sender, EventArgs e){ listBoxMsg.Items.Clear();try { string data;progressBar1.Visible = true; progressBar1.Value = 1;smtpSrv = new TcpClient("smtp."+Sv,25);//TextBoxSer.Text,25);netStm = smtpSrv.GetStream();StreamReader rdStrm = new StreamReader(smtpSrv.GetStream());WriteStream("EHLO Local");progressBar1.Value++;listBoxMsg.Items.Add(" 输入用户名开始"); WriteStream("AUTH LOGIN");listBoxMsg.Items.Add(rdStrm.ReadLine()); progressBar1.Value++;data = AuthStream(Ua);//data);WriteStream(data);listBoxMsg.Items.Add(rdStrm.ReadLine()); data = AuthStream(Pw);//data);WriteStream(data);listBoxMsg.Items.Add(rdStrm.ReadLine()); progressBar1.Value++;data = "MAIL FROM:<" + TextBoxSend.Text + ">"; WriteStream(data);listBoxMsg.Items.Add(rdStrm.ReadLine()); progressBar1.Value++;data = "RCPT TO:<"+TextBoxRev.Text+">"; WriteStream(data);listBoxMsg.Items.Add(rdStrm.ReadLine()); progressBar1.Value++;WriteStream("DATA");listBoxMsg.Items.Add(rdStrm.ReadLine()); progressBar1.Value++;data = "Date:"+System.DateTime.Now; WriteStream(data);progressBar1.Value++; 〃产生StreamReader来读取数据流//发送命令建立连接//发送命令请求验证//转换编码格式//发送用户名//转换编码格式//发送//发件人地址//收件人地址//数据//日期// 定义ButtonSend_Click//存放smtp 服务器返回的信息//连接smtp 服务器// 取得Networkstream 对象,来发送接收数据data = "From:" + TextBoxSend.Text; WriteStream(data);progressBar1.Value++;data = "To:" + TextBoxRev.Text;WriteStream(data);progressBar1.Value++;data = "SUBJECT:" + textBoxSubject.Text; WriteStream(data);progressBar1.Value++;data = "Reply-To:" + TextBoxSend.Text; WriteStream(data);progressBar1.Value++;WriteStream("");progressBar1.Value++;WriteStream(textBoxMailText.Text); progressBar1.Value++;WriteStream(".");progressBar1.Value++;listBoxMsg.Items.Add(rdStrm.ReadLine()); WriteStream("QUIT");progressBar1.Value++;listBoxMsg.Items.Add(rdStrm.ReadLine()); netStm.Close();rdStrm.Close();MailInfo i = new MailInfo();i.sender = TextBoxSend.Text;i.geter = TextBoxRev.Text;i.Ttile = textBoxSubject.Text;i.NeiRong = textBoxMailText.Text;i.Datatime = DateTime.Now.ToString();SMail.Add(i);MessageBox.Show(”邮件发送成功",”成功");}catch (System.Exception ex){MessageBox.Show(ex.ToString(), " 操作错误"); }}private void Form1_FormClosed(object sender,{Application.Exit();}//发送者//接收者//主题//发送回复地址//表示首部结束,开始正文//点表示邮件内容结束//断开//添加项//释放资源//将发送的消息送到SMail 便于传个收件箱界面//显示信息//显示信息sedEventArgs e)//终止所有程序private void button1_Click(object sender, EventArgs e){ this.Hide();fa.Show(); //隐藏控件fa.GetSenMail(SMail);}private void Form1_Load(object sender, EventArgs e){}}}下面是接收邮件程序源代码using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using ;using .Mail;using .Sockets;using System.IO;using System.Collections;namespace MailSendOfRecive{public partial class Form2 : Form{public TcpClient Server;public NetworkStream NetStrm;public StreamReader RdStrm;public string Data,UsName,Pawd,InEmai;public byte[] szData,other;public List<MailInfo> EMail = new List<MailInfo>(); // public List<MailInfo> DMail = new List<MailInfo>(); public List<MailInfo> SndMail = new List<MailInfo>(); public string CRLF = "\r\n";public FileStream fs;public int InfoID,BackId;public int DeleTxt = -1;DataTable dt = new DataTable();public Form2(string Uname,string Pwd,string IEM) //导入名字空间//包含定义各种对象集合的接口和类// 包含表示ASCII 等字符编码的类//命名空间//定义类//定义服务器链表类//声明写入流//数据表了,类似于数据库,可以存放数据{InfoID = -1;InEmai = IEM;//"pop."+IEM; UsName = Uname; Pawd = Pwd;}private void Inint(){TreeNode Node = treeView1.Nodes.Add("Name", " 邮件归档系统 "); Node.Nodes.Add("Send", " 发件箱 "); Node.Nodes.Add("Recove", " 收件箱 ");Node.Nodes.Add("GuiDang", " 邮件归档 "); // 获取对象的集合 Node.Nodes.Add("HuiShou", " 回收站 ");}private void ShowInfo(){ }private void buttonCon_Click(object sender, EventArgs e)//定义点击事件 {Server = new TcpClient("pop."+InEmai, 110); // 初始化服务器try{NetStrm = Server.GetStream();RdStrm = new StreamReader(NetStrm,System.Text.Encoding.Default); listBoxStatus.Items.Add(RdStrm.ReadLine());// 向列表添加项Data = "USER " + UsName + CRLF;//textBoxUser.Text+CRLF; szData =System.Text.Encoding.Default.GetBytes(Data); // 获取编码 NetStrm.Write(szData,0,szData.Length); listBoxStatus.Items.Add(RdStrm.ReadLine());Data = "PASS " + Pawd + CRLF;//textBoxPwd.Text+CRLF; szData =System.Text.Encoding.Default.GetBytes(Data); // 获取编码 NetStrm.Write(szData,0,szData.Length); listBoxStatus.Items.Add(RdStrm.ReadLine());// 获取所有的邮件的大小Data = "STAT " + CRLF;szData = System.Text.Encoding.Default.GetBytes(Data); // 获取编码InitializeComponent(); Inint();dt.Columns.Add("ID",typeof(int));dt.Columns.Add(" 主题 ", typeof(string)); dt.Columns.Add(" 发件人 ", typeof(string)); dt.Columns.Add("时间",typeof(string));dt.Columns.Add(" 含有附件 ", typeof(Boolean));//初始化//为网格添加标题//创建对象//初始化节点szData = System.Text.Encoding.Default.GetBytes(Data);NetStrm.Write(szData,0,szData.Length); string st = RdStrm.ReadLine(); MessageBox.Show(st); listBoxStatus.Items.Add(st); st = st.Substring(4, 2); MessageBox.Show(st); int Cout = Int32.Parse(st); if (Cout>0){buttonDel.Enabled = true; for (int i = 0; i < Cout;i++ ){MailInfo ou = new MailInfo(); GetInfo(i+1,ref ou); EMail.Add(ou);}ShowInfo();}else{buttonDel.Enabled = false;}buttonCon.Enabled = false; buttonDison.Enabled = true; GuiButton.Enabled = true; buttonDel.Enabled = true; treeView1.Enabled = true;}catch (System.Exception ex){MessageBox.Show(ex.ToString());} }//写入数据private void GetInfo(int ID,ref MailInfo NewInfo){richTexOfInfo.AppendText("\r\n- NewInfo.id =ID; string szTemp; try{string st = Convert.ToString(ID); Data = "UIDL " + st + CRLF;//显示消息框//检索字符串//设置控件属性//对象添加到结尾//控件设为不可用//控件设为不可用//控件设为不可用//显示消息框//按 ID 读取邮件并进行解析\r\n");// 追加文本//获取每个邮件的唯一标示NetStrm.Write(szData, 0, szData.Length); // 写入数据szTemp = RdStrm.ReadLine();richTexOfInfo.AppendText(szTemp + CRLF); // 追加文本Data = "RETR " + st + CRLF;szData = System.Text.Encoding.Default.GetBytes(Data); // 获取编码NetStrm.Write(szData, 0, szData.Length);szTemp = RdStrm.ReadLine(); // 读取字符串并返回richTexOfInfo.AppendText(szTemp + CRLF);} szTemp = RdStrm.ReadLine();}}else}catch (System.Exception ex){listBoxStatus.Items.Add("Error:" + ex.ToString());}}private void buttonDison_Click(object sender, EventArgs e)//退出连接Data = "QUIT "+CRLF;szData = System.Text.Encoding.ASCII.GetBytes(Data); // 获取编码NetStrm.Write(szData, 0, szData.Length);NetStrm.Close();RdStrm.Close();buttonDel.Enabled = false; buttonCon.Enabled = true; buttonDison.Enabled = false;}public bool tryTran(ref string a){try{byte[] outputb = Convert.FromBase64String(a); a = Encoding.Default.GetString(outputb); return true;}catch (System.Exception ex){ return false;}//释放资源//设置控件属性//安照Base64 进行解析流文件//错误信息}private void GetString(ref string a,int s,int e) // 字符串处理{string u1 = "", u2 ="",u3=""; // 初始化int sum;sum = a.IndexOf("B?");u1 = a.Substring(0, s);u2 = a.Substring(sum+2, e-sum-2);byte[] outputb = Convert.FromBase64String(u2);u2 = Encoding.Default.GetString(outputb);u3 = a.Substring(e + 2, a.Length - e - 2);a = u1 + u2 + u3;}private void buttonRead_Click(object sender, EventArgs e) //定义事件{}private void buttonDel_Click(object sender, EventArgs e) // 删除邮件{try{if (InfoID>-1){string st = InfoID.ToString();dt.Rows.Remove(dt.Rows[DeleTxt]);dataGridView1.DataSource = dt;richTexOfInfo.Text = "";MessageBox.Show(”删除操作成功",”操作成功"); 〃显示信息}}catch (System.Exception ex) //显示错误{MessageBox.Show(ex.Message); //显示信息}}private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) //选择点击树节点时触发的事件{dt.Clear();{richTexOfInfo.Text = SndMail[Convert.ToInt32()].NeiRong;}if (dt.Rows.Count>0){this.dataGridView1.DataSource = dt; //获取数据源}} else}private void GuiButton_Click(object sender, EventArgs e) // 进行归档{ treeView1.Nodes["Name"].Nodes["GuiDang"].Nodes.Add("ShiYang", " 实验报告");//获取树节点集合treeView1.Nodes["Name"].Nodes["GuiDang"].Nodes.Add("Other"," 其他邮件"); foreach (MailInfo a in EMail){if (a.Ttile.IndexOf(" 实验报告")> 0) {treeView1.Nodes["Name"].Nodes["GuiDang"].Nodes["ShiYang"].Nodes.Add(a.sender, a.sender); //获取树节点集合}else treeView1.Nodes["Name"].Nodes["GuiDang"].Nodes["Other"].Nodes.Add(a.sender, a.sender);}GuiButton.Enabled = false; //控件设为不可用}private void dataGridView1_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)//点击表格时触发的事件{DeleTxt = e.RowIndex; //获取索引InfoID = (int)this.dataGridView1[0, e.RowIndex].Value; // 获取值foreach (MailInfo a in EMail){if (a.id == InfoID){richTexOfInfo.Text = a.NeiRong; // 获取文本break;}}}public void GetSenMail(List<MailInfo> e) //获取发件模块送的数据{if (e.Count>0){foreach (MailInfo a in e){int i = treeView1.Nodes["Name"].Nodes["Send"].Nodes.Count;treeView1.Nodes["Name"].Nodes["Send"].Nodes.Add(i.ToString(),a.geter);SndMail.Add(a); // 添加对象到结尾处}}}private void button1_Click(object sender, EventArgs e) // 跳到发件界面{Form1 Se = new Form1(this, UsName, Pawd, InEmai);this.Hide();Se.Show();}private void Form2_FormClosed(object sender, FormClosedEventArgs e)//程序退出处理{Application.Exit(); // 停止程序}private void button2_Click(object sender, EventArgs e) // 还原回收站中的数据{treeView1.Nodes["Name"].Nodes["HuiShou"].Nodes.Remove(treeView1.Nodes["Name"].Nodes["HuiShou" ].N odes[BackId.ToString()]); // 获取集合foreach (MailInfo a in DMail){if (a.id == BackId){dt.Rows.Add(new Object[] { a.id, a.Ttile, a.sender, a.Datatime, a.Fujian });//获取集合dataGridView1.DataSource = dt; //获取数据源}}}private void Form2_Load(object sender, EventArgs e){}}public class MailInfo {public int id;public string sender; //寄件人public string geter; //收件人public Boolean Fujian; //是否有附件public string FJname; //附件名称public string Ttile;public string NeiRong; //内容public string Datatime; //日期public MailInfo()//构建MailInfo{Fujian = false;id = -1;sender ="";geter ="";FJname ="";Ttile ="";NeiRong ="";Datatime ="";}}}四、运行结果运行结果有3个界面图3发送邮件界面图4接收邮件界面五、遇到的问题及解决这部分我主要遇到了如下两个问题,其内容与解决方法如下所列:不清楚SMTP和POP3的区别。