今天对电脑进行整理,发现电脑上有一个帮同学做的毕设代码,挺简单的,但是当成做的时候吃了不少苦头,现在都毕业了,就放上来给新手分享一下。好了话不多说。

首先了解一下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 TcpClient Server;//TCP通信类
        public NetworkStream NetStrm;//网络流
        public StreamReader RdStrm;//通信流读取
        public string Data,UsName,Pawd,InEmai;
        public byte[] szData,other;
        public string CRLF = "\r\n";
下面是POP3的命令使用的代码():
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协议的邮件归档系统相关推荐

  1. exchange无法收发邮件_Python使用POP3和SMTP协议收发邮件!

    先来了解一下收/发邮件有哪些协议: SMTP协议 SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议.相当于中转站,将邮件发送到客户端. POP3协议 POP3 ...

  2. python pop3_Python使用POP3和SMTP协议收发邮件的示例代码

    先来了解一下收/发邮件有哪些协议: SMTP协议 SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议.相当于中转站,将邮件发送到客户端. POP3协议 POP3 ...

  3. linux网卡握手速率模式,一种基于Linux平台下的网卡速率和双工模式测试的方法与流程...

    本发明涉及计算机技术领域,更具体的说是涉及一种基于Linux平台下的网卡速率和双工模式测试的方法. 背景技术: 随着社会经济的发展和互联网技术的进步,如今把计算机网络使得我们的生活变得更加方便,快捷. ...

  4. smtp在线发送邮件_基于树莓派3B,利用爬虫、SMTP和发送邮件amp;amp;(爬取墨迹天气预报信息)...

    转载请注明: 利用爬虫.SMTP和树莓派3B发送邮件&续集&(爬取墨迹天气预报信息) - 永怀一颗学徒的心 - 博客园​www.cnblogs.com ZXPXBB:基于树莓派3B,利 ...

  5. 基于MacOSX平台下的二维码扫码功能

    基于MacOSX平台下的二维码扫码功能 最近项目接受了一个需求,要在macOS的系统上实现一个二维码扫码的功能.通过多方面的学习,最终实现了要求,具体的实现步骤将会在下面展示. 核心功能模块 实现途径 ...

  6. STM32F103C8T6基于Arduino框架下利用定时器跑RBG灯闪烁

    STM32F103C8T6基于Arduino框架下利用定时器跑RGB灯闪烁

  7. 基于.net平台下大型分布式HIS系统之药房药库系统-石曼迪-专题视频课程

    基于.net平台下大型分布式HIS系统之药房药库系统-159人已学习 课程介绍         本次课程重点讲解药房药库系统中典型的几个环节,如:入库.入库审核.盘点.盘点审核.药房划价.门诊发药.住 ...

  8. 深入理解SMTP协议之邮件客户端

    本文将使用Python从零实现一个简易的邮件客户端,通过本文你将对SMTP协议有更深入的了解,同时掌握使用Python实现标准协议的经验. 我们将开发一个简单的邮件客户端,将邮件发送给任意收件人.我们 ...

  9. .NET 简单的smtp协议发邮件

    .NET 简单的smtp协议发邮件 好久没写东西了 闲的疼 突然想到没写过发邮件 查了下资料 写了个简单的 MailMessage mymm = new MailMessage();          ...

最新文章

  1. 睡不着的时候,我会......
  2. html求和按钮,使用模板标记在html模板中求和
  3. 创建可调试,热加载的TypeScript+Koa工程
  4. 如何创建一个自记录的Makefile
  5. canvas画布会黑屏吗_Android SurfaceView 黑屏问题
  6. 你是外包,麻烦不要偷吃零食,注意素质...
  7. mysql innodb 间隙锁_Mysql innodb 间隙锁
  8. [算法] 循环有序数组查找递归实现
  9. mysql ip比较大小_解决mysql进行ip字符串比较问题
  10. c语言心算抢答系统,心算抢答系统2.doc
  11. logcat日志分析
  12. java批量pdf压缩代码_怎么批量压缩PDF文档?迅捷PDF转换器帮你解决难题!
  13. GlobalMapper导出S57水深数据
  14. 从一元函数极值问题理解遗传算法
  15. 九大PPT制作伴侣【神器】
  16. adams matlab 联仿 5DOF机械臂 建模以及联合仿真
  17. GNSS/INS组合导航学习-GINAV(一)
  18. 三分钟了解常用的音频接口
  19. 部门年度工作与汇报总结ppt模板免费下载
  20. cityscapes场景图_图像语意分割训练Cityscapes数据集SegNet-ConvNet神经网络详解

热门文章

  1. 服务引用定义配置(服务的注册与发现)
  2. 电视图像信号的发送和接收
  3. uniapp之引入字体图标
  4. Nginx+SpringBoot 部署前后端分离项目(http配置、https配置)
  5. 用通俗易懂的方式讲解:CatBoost 算法原理及案例
  6. 鸿蒙系统微波炉,华为新系统来了!鸿蒙OS+EMUI 11,设备协同无缝连接
  7. 挖矿病毒常见处置方法
  8. 基于FreeRTOS与MQTT的物联网技术应用系列——步进电机控制(七)基于CrossApp跨平台框架的MQTT客户端控制应用android版
  9. 金蝶云单据下推,转换规则
  10. 运维学shell还是python_运维DBA要不要学python