基于C#平台下利用POP3和SMTP协议的邮件归档系统
今天对电脑进行整理,发现电脑上有一个帮同学做的毕设代码,挺简单的,但是当成做的时候吃了不少苦头,现在都毕业了,就放上来给新手分享一下。好了话不多说。
首先了解一下POP3和SMTP协议,他们是两个网络传输协议,一个负责发邮件的,一个负责收邮件。如果你是软件专业科班出生的,应该有一门课负责讲计算机网络的,你可以看以下,如果没有可以网上搜一下POP3和SMTP。总的来说,我们可以把他们每一个看做实现Windoes的某些功能的cmd命令组合,你输入的正确的命令格式就可以获得对应的结果,然后你根据上一步进行想要的操作。我通过POP3收邮件的过程来举一个更简单的例子:POP3就像是抗战的时候地下党碰头暗号的集合,你就把邮箱的服务器当成接头的A,然后你编写的程序就是某个抗日英雄B,你现在要获得一些武器打鬼子。首先是身份的验证,先找到某条街道的某个茶馆,你的程序对应的就是找到邮箱服务器和端口。下一步,用暗号对你的身份进行验证:B:你这碗怎么卖?A:5块钱一斤,B:我要半打。(好像电视剧的接头暗号都有病,他卖碗轮斤卖,你买碗轮打买),相对应的:你的程序发送几个字符串过去:"USER +你的邮箱号码+结束符“,然后服务器收到,发一个指令过来:+OK,然后你就要发送你的账号的密码发过去:”PASS +你的账号的密码+结束符“,他在发个+OK过来,这是你们的连接就建立起来了。也就是例子中A和B双方都知道是自己人,这时候如果B说:我现在手里缺根扫帚(扫帚表示手枪的意思),然后A说:好的,一会我送到你家里去。我们来对应的比如你要知道你的邮箱中的邮件的数量你就可以发:”STAT +结束符“,然后服务器就发送:”+OK 6 87921“,你就要注意,这个数据分为3段第一段是没有什么实际用途的,第2段表示邮箱中的邮件的数量,第3段表示邮件的总大小。跟着就是相似的,你要干嘛就发对应的指令就够了。于是B就这样从A那里获得了许多的军火,最后当你用完要拜拜的,A和B不能不离开吧。所以当你的邮箱用完了要跟服务器说”QUIT +结束符“的。这样我们就获得了我们要的数据:下面附上POP3指令:
命令 | 参数 | 状态 | 描述 |
---|---|---|---|
user | username | 认可 | 此命令与下面的pass命令若成功,将导致状态转换 |
pass | password | 认可 | |
apop | name,digest | 认可 | 一种安全传输口令的办法,digest是md5消息摘要,执行成功导致状态转换,请参见RFC 1321 |
stat | 不用加参数 | 处理 | 请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数 |
uidl | 邮件的编号 | 处理 | 返回邮件的唯一标识符,pop3会话的每个标识符都将是唯一的 |
list | 同上 | 处理 | 返回邮件数量和每个邮件的大小 |
retr | 同上 | 处理 | 返回由参数标识的邮件的全部文本 |
dele | 同上 | 处理 | 服务器将由参数标识的邮件标记为删除,由quit命令执行 |
rset | 不需要参数 | 处理 | 服务器将重置所有标记为删除的邮件,用于撤消dele命令 |
top | 邮件的编号,n | 处理 | 服务器将返回由参数标识的邮件前n行内容,n必须是正整数 |
noop | 不需要参数 | 处理 | 服务器返回一个肯定的响应,不做任何操作。 |
quit | 不需要参数 | 更新 | 退出 |
当然我们这个发送的命令是经过网络的,所以要用到网络编程的类,因此双方在通讯前要勇敢网络流建立起通信的连接。下面是网络流通讯的类的定义:
public NetworkStream NetStrm;//网络流
public StreamReader RdStrm;//通信流读取
public string Data,UsName,Pawd,InEmai;
public byte[] szData,other;
public string CRLF = "\r\n";
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;//发送用户名szData = System.Text.Encoding.Default.GetBytes(Data);NetStrm.Write(szData,0,szData.Length);listBoxStatus.Items.Add(RdStrm.ReadLine());Data = "PASS " + Pawd + CRLF;//密码szData = System.Text.Encoding.Default.GetBytes(Data);NetStrm.Write(szData,0,szData.Length);listBoxStatus.Items.Add(RdStrm.ReadLine());//获取所有的邮件的大小/*Data = "LIST" + CRLF;szData = System.Text.Encoding.Default.GetBytes(Data);NetStrm.Write(szData, 0, szData.Length);bool Out = false;while (!Out){try{listBoxStatus.Items.Add("LIST " + RdStrm.ReadLine()); }catch (System.Exception ex){break;}Out = RdStrm.EndOfStream;}*/Data = "STAT " + CRLF;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;//listBoxStatus.Items.Clear();//listBoxOpe.Items.Clear();for (int i = 0; i < Cout;i++ ){//listBoxOpe.Items.Add("第" + (i + 1) + "封邮件");MailInfo ou = new MailInfo();GetInfo(i+1,ref ou);EMail.Add(ou);}ShowInfo();}else {// listBoxOpe.Enabled = false;buttonDel.Enabled = false;}buttonCon.Enabled = false;buttonDison.Enabled = true;GuiButton.Enabled = true;buttonDel.Enabled = true;treeView1.Enabled = true;}catch (System.Exception ex){//listBoxStatus.Items.Add("错误" + ex.ToString());MessageBox.Show(ex.ToString());}
这里声明,代码是可以用的,这个是我花了8个小时给我同学写的毕业设计,8个小时内要对毕设做需求分析,找资料,写代码,修改代码,时间很紧的,因此程序的功能不可能完善和强大。有纰漏和不足的地方还请包涵,毕竟本文只是用于交流。还有smtp也是类似的,我们可以举一反三,要代码的可以到我的CSDN空间下,另外POP3是不提供查询邮件是否阅读了的,你要是想实现这个功能可以用UIDL指令获得每个邮件的唯一编码,然后存在本地数据库里面,一但你在程序里面打开了就要将打开的信息和邮件关系起来——写进数据库,这样就能实现判断邮件是否已经阅读了。最后,说明当你使用RETR指令进行获取邮件的信息时,获得的是Base64编码的文件,如何想看未解码的,可以用RETE命令下载,在程序解码的文本框中显示出来,自己琢磨,这样很有趣。我只在程序里面进行了简单的解码,附件里面我的程序只能解析文本格式的附件,Word文档不能解码,其他的尚未测试。本文只是讲解POP3和SMTP协议的编程,欢迎留言探讨。
基于C#平台下利用POP3和SMTP协议的邮件归档系统相关推荐
- exchange无法收发邮件_Python使用POP3和SMTP协议收发邮件!
先来了解一下收/发邮件有哪些协议: SMTP协议 SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议.相当于中转站,将邮件发送到客户端. POP3协议 POP3 ...
- python pop3_Python使用POP3和SMTP协议收发邮件的示例代码
先来了解一下收/发邮件有哪些协议: SMTP协议 SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议.相当于中转站,将邮件发送到客户端. POP3协议 POP3 ...
- linux网卡握手速率模式,一种基于Linux平台下的网卡速率和双工模式测试的方法与流程...
本发明涉及计算机技术领域,更具体的说是涉及一种基于Linux平台下的网卡速率和双工模式测试的方法. 背景技术: 随着社会经济的发展和互联网技术的进步,如今把计算机网络使得我们的生活变得更加方便,快捷. ...
- smtp在线发送邮件_基于树莓派3B,利用爬虫、SMTP和发送邮件amp;amp;(爬取墨迹天气预报信息)...
转载请注明: 利用爬虫.SMTP和树莓派3B发送邮件&续集&(爬取墨迹天气预报信息) - 永怀一颗学徒的心 - 博客园www.cnblogs.com ZXPXBB:基于树莓派3B,利 ...
- 基于MacOSX平台下的二维码扫码功能
基于MacOSX平台下的二维码扫码功能 最近项目接受了一个需求,要在macOS的系统上实现一个二维码扫码的功能.通过多方面的学习,最终实现了要求,具体的实现步骤将会在下面展示. 核心功能模块 实现途径 ...
- STM32F103C8T6基于Arduino框架下利用定时器跑RBG灯闪烁
STM32F103C8T6基于Arduino框架下利用定时器跑RGB灯闪烁
- 基于.net平台下大型分布式HIS系统之药房药库系统-石曼迪-专题视频课程
基于.net平台下大型分布式HIS系统之药房药库系统-159人已学习 课程介绍 本次课程重点讲解药房药库系统中典型的几个环节,如:入库.入库审核.盘点.盘点审核.药房划价.门诊发药.住 ...
- 深入理解SMTP协议之邮件客户端
本文将使用Python从零实现一个简易的邮件客户端,通过本文你将对SMTP协议有更深入的了解,同时掌握使用Python实现标准协议的经验. 我们将开发一个简单的邮件客户端,将邮件发送给任意收件人.我们 ...
- .NET 简单的smtp协议发邮件
.NET 简单的smtp协议发邮件 好久没写东西了 闲的疼 突然想到没写过发邮件 查了下资料 写了个简单的 MailMessage mymm = new MailMessage(); ...
最新文章
- 睡不着的时候,我会......
- html求和按钮,使用模板标记在html模板中求和
- 创建可调试,热加载的TypeScript+Koa工程
- 如何创建一个自记录的Makefile
- canvas画布会黑屏吗_Android SurfaceView 黑屏问题
- 你是外包,麻烦不要偷吃零食,注意素质...
- mysql innodb 间隙锁_Mysql innodb 间隙锁
- [算法] 循环有序数组查找递归实现
- mysql ip比较大小_解决mysql进行ip字符串比较问题
- c语言心算抢答系统,心算抢答系统2.doc
- logcat日志分析
- java批量pdf压缩代码_怎么批量压缩PDF文档?迅捷PDF转换器帮你解决难题!
- GlobalMapper导出S57水深数据
- 从一元函数极值问题理解遗传算法
- 九大PPT制作伴侣【神器】
- adams matlab 联仿 5DOF机械臂 建模以及联合仿真
- GNSS/INS组合导航学习-GINAV(一)
- 三分钟了解常用的音频接口
- 部门年度工作与汇报总结ppt模板免费下载
- cityscapes场景图_图像语意分割训练Cityscapes数据集SegNet-ConvNet神经网络详解
热门文章
- 服务引用定义配置(服务的注册与发现)
- 电视图像信号的发送和接收
- uniapp之引入字体图标
- Nginx+SpringBoot 部署前后端分离项目(http配置、https配置)
- 用通俗易懂的方式讲解:CatBoost 算法原理及案例
- 鸿蒙系统微波炉,华为新系统来了!鸿蒙OS+EMUI 11,设备协同无缝连接
- 挖矿病毒常见处置方法
- 基于FreeRTOS与MQTT的物联网技术应用系列——步进电机控制(七)基于CrossApp跨平台框架的MQTT客户端控制应用android版
- 金蝶云单据下推,转换规则
- 运维学shell还是python_运维DBA要不要学python