用POP3获取邮箱邮件内容(完整C#源码)
准备工作:下载一个OpenPop的插件,OpenPop.dll
这里测试了163邮箱和QQ邮箱,163邮箱直接用账号和授权码就能登录,QQ邮箱需要用SSL验证。
163的服务器是:pop3.163.com , 端口是110
QQ邮箱服务器是:pop.qq.com ,端口是995,需要SSL验证,这段代码没有实现QQ邮箱SSL的验证登陆,非SSL的应该都是没有问题的,后续抽空我会再把SSL的方法贴出来,大家交流学习。
有个问题要提醒大家注意:
1.登录时候只能用第三方授权码登录,而不能用原始密码登录。
2.项目用的是OpenPop.dll 2.0.3版本,从Nuget上下载的OpenPop.dll版本是2.0.6。新版本中已经没有SaveToFile这个方法了,所以程序中SaveToFile方法会报错,需要的可以找我要。目前有两个解决方案:
(1)这个报错的方法是保存邮件附件的方法,不要用的话可以删掉。
(2)在新版本的OpenPop中SaveToFile()方法变成了Save(),直接把程序中的SaveToFile方法替换成Save就好了。
代码里我已经替换掉了(2019/04/25)
由于想要源码的比较多,源码上传QQ群了,群号:需要可私信博主,有需要的可以来下载(2020/09/07)
先上个效果图
代码很简单,你需要和我一样建立4个class,直接上代码:
首先定义接口,说明一下要实现的方法
using OpenPop.Mime;
using OpenPop.Mime.Header;
using OpenPop.Pop3;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;namespace Sample.SimpleFactory
{public abstract class Pop3{#region 窗体变量/// <summary>/// 是否存在错误/// </summary>public abstract Boolean ExitsError { get; set; }/// <summary>/// 错误信息/// </summary>public abstract String ErrorMessage { get; set; }/// <summary>/// POP3端口号/// </summary>public abstract Int32 Pop3Port { set; get; }/// <summary>/// POP3地址/// </summary>public abstract String Pop3Address { set; get; }/// <summary>/// 邮箱地址/// </summary>public abstract String EmailAddress { set; get; }/// <summary>/// 邮箱密码/// </summary>public abstract String EmailPassword { set; get; }#endregion#region 链接至服务器并读取邮件集合/// <summary>/// 链接至服务器并读取邮件集合/// </summary>public abstract Boolean Authenticate();#endregion#region 获取邮件数量/// <summary>/// 获取邮件数量/// </summary>/// <returns></returns>public abstract Int32 GetMailCount();#endregion#region 获取发件人/// <summary>/// 获取发件人/// </summary>/// <param name="mailIndex"></param>/// <returns></returns>public abstract String GetSendMialAddress(Int32 mailIndex);#endregion#region 获取邮件的主题/// <summary>/// 获取邮件的主题/// </summary>/// <param name="mailIndex"></param>/// <returns></returns>public abstract String GetMailUID(Int32 mailIndex);#endregion#region 取邮件的UID/// <summary>/// 获取邮件的UID/// </summary>/// <param name="mailIndex"></param>/// <returns></returns>public abstract String GetMailSubject(Int32 mailIndex);#endregion#region 获取邮件正文/// <summary>/// 获取邮件正文/// </summary>/// <param name="mailIndex">邮件顺序</param>/// <returns></returns>public abstract String GetMailBodyAsText(Int32 mailIndex);#endregion#region 获取邮件的附件public abstract Boolean GetMailAttachment(Int32 mailIndex, String receiveBackpath);#endregion#region 删除邮件/// <summary>/// 删除邮件/// </summary>/// <param name="mailIndex"></param>public abstract void DeleteMail(Int32 mailIndex);#endregion#region 关闭邮件服务器public abstract void Pop3Close();#endregion}
}
程序原本包括两种获取邮件的方法,POP3和Lumisoft,
这里就只保留POP3的方法了
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace Sample.SimpleFactory
{public class FactoryPop3{public String Pop3Type = "OpenPop";public Pop3 CreatePop3(){Pop3 pop = null;if (Pop3Type == "OpenPop"){return pop = new OpenPopPop3();}//else if (Pop3Type == "LumiSoft")//{// return pop = new LumiSoftPop3();//}else{return null;}} }
}
实现接口中虚方法的类
using OpenPop.Mime;
using OpenPop.Mime.Header;
using OpenPop.Pop3;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;namespace Sample.SimpleFactory
{public class OpenPopPop3 : Pop3{#region 窗体变量/// <summary>/// 是否存在错误/// </summary>public override Boolean ExitsError { get; set; }/// <summary>/// 错误信息/// </summary>public override String ErrorMessage { get; set; }/// <summary>/// POP3端口号/// </summary>public override Int32 Pop3Port { set; get; }/// <summary>/// POP3地址/// </summary>public override String Pop3Address { set; get; }/// <summary>/// 邮箱地址/// </summary>public override String EmailAddress { set; get; }/// <summary>/// 邮箱密码/// </summary>public override String EmailPassword { set; get; }#endregion#region 私有变量private Pop3Client pop3Client;// private List<POP3_ClientMessage> pop3MessageList = new List<POP3_ClientMessage>();private Int32 mailTotalCount;#endregion#region 构造函数public OpenPopPop3() { }#endregion#region 链接至服务器并读取邮件集合/// <summary>/// 链接至服务器并读取邮件集合/// </summary>public override Boolean Authenticate(){try{pop3Client = new Pop3Client();if (pop3Client.Connected)pop3Client.Disconnect();pop3Client.Connect(Pop3Address, Pop3Port, false);pop3Client.Authenticate(EmailAddress, EmailPassword, AuthenticationMethod.UsernameAndPassword);mailTotalCount = pop3Client.GetMessageCount();return ExitsError = true;}catch (Exception ex) { ErrorMessage = ex.Message; return ExitsError = false; }}#endregion#region 获取邮件数量/// <summary>/// 获取邮件数量/// </summary>/// <returns></returns>public override Int32 GetMailCount(){return mailTotalCount;}#endregion#region 获取发件人/// <summary>/// 获取发件人/// </summary>/// <param name="mailIndex"></param>/// <returns></returns>public override String GetSendMialAddress(Int32 mailIndex){RfcMailAddress address = pop3Client.GetMessageHeaders(mailIndex).From;return address.Address;}#endregion#region 获取邮件的主题/// <summary>/// 获取邮件的主题/// </summary>/// <param name="mailIndex"></param>/// <returns></returns>public override String GetMailUID(Int32 mailIndex){return pop3Client.GetMessageUid(mailIndex);}#endregion#region 获取邮件的UID/// <summary>/// 获取邮件的UID/// </summary>/// <param name="mailIndex"></param>/// <returns></returns>public override String GetMailSubject(Int32 mailIndex){return pop3Client.GetMessageHeaders(mailIndex).Subject;}#endregion#region 获取邮件正文/// <summary>/// 获取邮件正文/// </summary>/// <param name="mailIndex">邮件顺序</param>/// <returns></returns>public override String GetMailBodyAsText(Int32 mailIndex){Message message = pop3Client.GetMessage(mailIndex);MessagePart selectedMessagePart = message.MessagePart;return selectedMessagePart.GetBodyAsText();}#endregion#region 获取邮件的附件public override Boolean GetMailAttachment(Int32 mailIndex, String receiveBackpath){if (mailIndex == 0)return false;else if (mailIndex > mailTotalCount)return false;else{try{Message message = pop3Client.GetMessage(mailIndex);//邮件的全部附件.List<MessagePart> attachments = message.FindAllAttachments();foreach (MessagePart attachment in attachments){string fileName = attachment.FileName;string fileFullName = receiveBackpath + "\\" + fileName;FileInfo fileInfo = new FileInfo(fileFullName);if (fileInfo.Exists) fileInfo.Delete();attachment.Save(fileInfo);}pop3Client.DeleteMessage(mailIndex);return true;}catch (Exception ex){ErrorMessage = ex.Message;return false;}}return true;}#endregion#region 删除邮件/// <summary>/// 删除邮件/// </summary>/// <param name="mailIndex"></param>public override void DeleteMail(Int32 mailIndex){pop3Client.DeleteMessage(mailIndex);}#endregion#region 关闭邮件服务器public override void Pop3Close(){pop3Client.Disconnect();pop3Client.Dispose();}#endregion}
}
这里是Main函数,代码里可以用循环将所有邮件都取出来,
这里只取第一封邮件演示一下,取出的邮件我放在了DataTable里了,方便查看。
这里测试了163邮箱和QQ邮箱,
163邮箱直接用账号和授权码就能登录,QQ邮箱需要用SSL验证,
163的服务器是:pop3.163.com , 端口是110
QQ邮箱服务器是:pop.qq.com ,端口是995,需要SSL验证,这段代码没有实现QQ邮箱的登陆,后续抽空我会再把SSL的方法贴出来,大家交流学习。
main()
{FactoryPop3 factory = new FactoryPop3();Pop3 pop = factory.CreatePop3();pop.Pop3Port = 110;pop.Pop3Address = "pop3.163.com";pop.EmailAddress = "*******@163.com";pop.EmailPassword = "*******";pop.Authenticate();if (pop.ExitsError){DataTable aa = new DataTable();aa.Columns.Add("MailCount");aa.Columns.Add("SendMialAddress");aa.Columns.Add("MailUID");aa.Columns.Add("MailSubject");aa.Columns.Add("MailBodyAsText");DataRow dr = aa.NewRow();dr["MailCount"] = pop.GetMailCount().ToString();dr["SendMialAddress"] = pop.GetSendMialAddress(1).ToString();dr["MailUID"] = pop.GetSendMialAddress(1).ToString();dr["MailSubject"] = pop.GetSendMialAddress(1).ToString();dr["MailBodyAsText"] = pop.GetSendMialAddress(1).ToString();aa.Rows.Add(dr);//MessageBox.Show(pop.GetMailCount().ToString());//MessageBox.Show(pop.GetSendMialAddress(1).ToString());//MessageBox.Show(pop.GetMailUID(1).ToString());//MessageBox.Show(pop.GetMailSubject(2).ToString());//MessageBox.Show(pop.GetMailBodyAsText(1).ToString());}else{//MessageBox.Show(pop.ErrorMessage);}}
用POP3获取邮箱邮件内容(完整C#源码)相关推荐
- 用POP3获取邮箱邮件内容,支持SSL验证登陆(完整C#源码)
延续上一篇用POP3获取邮箱邮件内容(C#源码) 上一篇中提到一个问题,网上一般流传的是非SSL验证登陆的,适用163之类的邮箱,但是QQ邮箱一般都是登陆不上的.这次我来提供一个支持SSL验证登陆的方 ...
- webbrowser抓取php网页源码,获取webbrowser控件 网页的源码(收藏)
获取webbrowser控件 网页的源码(收藏) 翻译|其它|编辑:郝浩|2005-04-28 09:45:00.000|阅读 3152 次 概述: 我在网上找到使用rft控件保存webbrowse文 ...
- 梦幻诛仙linux纯端架设教程,梦幻诛仙 一键端搭建iOS安卓双端+完整后台源码+各种工具附带视频架设教程...
游戏说明: 梦幻诛仙一键端搭建iOS安卓双端+完整后台源码+各种工具,视频架设教程 在游戏内当前聊天窗口输入 dmmhzxnb ,开启后台. 提示GM后台已开启. 在左上角Press Enter ...
- (完整项目源码)GPS定位源码整套管理系统,轨迹播放,车辆管理,电子围栏,报警记录,数据库/人员定位/宠物定位/物流跟踪/资产定位
(完整项目源码)GPS定位源码整套管理系统,轨迹播放,车辆管理,电子围栏,报警记录,Mysql数据库- 框架:spring+jpa+struts2 ,MVC架构设计,可扩展性强. 数据库:mysql5 ...
- unity3d游戏2d横版射击游戏完整项目源码分享
unity3d游戏2d横版射击游戏完整项目源码分享 免费下载地址: 链接:https://pan.baidu.com/s/1YwhEy7DeKIHFU8pBLdJFPg 提取码:3wnx 复制这段内容 ...
- unity3d游戏3d局域网联机吃球游戏完整项目源码分享
unity3d游戏3d局域网联机吃球游戏完整项目源码分享 免费下载地址: 链接:https://pan.baidu.com/s/1APlOCmoK9aUfiVJD48dBQA 提取码:p5nl 复制这 ...
- 基于SpringBoot+Vue的科研课题项目管理系统【完整项目源码】
介绍 基于SpringBoot+Vue的科研课题项目管理系统 : 实现 登录 /注销. 用户管理.项目管理.申报管理.变更管理.结题管理.角色管理.权限管理.数据字典等功能 : 可作为 SpringB ...
- mysql src.rpm_从.src.rpm包中提取出完整的源码的方法
1 什么是完整的源码 就是说,最初始的源码加上打了所有的patch后的源码,即最新的源码. 2 过程 2.1 从.src.rpm中提取完整的rpm工程文件 2.1.1 rpm to cpio rpm2 ...
- 域名正版验证系统,PHP域名查询验证完整无误源码下载,域名验证系统完整源码
域名正版验证系统,PHP域名查询验证完整无误源码下载,域名验证, 由于优雅草系列产品盗版横行需要建立开源制度和正版授权查询,曾经寻找过没有可用的原计划自行写一个,不料到突然发现一个宝贝,完整可用并且优 ...
- python提取发票信息发票识别_(附完整python源码)基于tensorflow、opencv的入门案例_发票识别二:字符分割...
(附完整python源码)基于tensorflow.opencv的入门案例_发票识别二:字符分割 发布时间:2018-05-14 20:16, 浏览次数:1201 , 标签: python tenso ...
最新文章
- 自然语言处理起源:马尔科夫和香农的语言建模实验
- 深入理解javascript函数参数
- 商汤科技2020数据分析师0820笔试题目整理
- 【Servlet】Session会话跟踪技术
- axios在派遣方法时候的异步
- 在Simulink中调整增益映射 Tune Gain Schedules in Simulink
- spring cloud分布式整合zipkin的链路跟踪
- 微信们正在成为“被模仿者”!中国互联网现状及趋势报告
- 让.net 2.0支持并行计算
- 水电图纸——安装配电箱,插座——3.8
- 深入解析Scheduler
- 服务器操作系统有哪些?
- 05、Flutter FFI 结构体
- python访问陌生人qq空间_用Python登录好友QQ空间点赞的示例代码
- AUTOSAR DCM Configuration
- 再聊虚拟资源知识付费赚钱
- temp.....................
- 基于 Webpack4 的可插拔式微前端架构 - Puzzle
- div背景图片等比例缩小如何居中
- python3攻击服务器_Python服务器用套接字互相攻击