Lumisoft.NET组件是一个非常强大的邮件发送、邮件接收等功能的开源组件,一般用它来处理邮件的相关操作,是非常合适的。之前也写过一些该组件的随笔文章,不过主要是利用来发送邮件居多,最近由于项目需要,需要利用该组件来接收邮件,邮件通过POP3协议进行接收到本地,故对该组件进行了全面的了解和使用。本文主要是在此背景上,介绍该组件的POP3协议处理类的使用。Lumisoft.NET组件2013年作者有做了一定的更新,修复了一些问题,本文是基于该组件的最新版本进行开发使用。

1、POP3登录及头部信息获取

首先使用POP3,必须创建一个POP3_Client的对象,然后通过Connect和Login进行连接和登录处理,相关的代码如下所示。

            using (POP3_Client popClient = new POP3_Client()){popClient.Logger = new Logger();popClient.Logger.WriteLog += new EventHandler<WriteLogEventArgs>(WriteLog);popClient.Connect(pop3Server, pop3Port, pop3UseSsl);popClient.Login(username, password);

POP3的的邮件下载通过POP3_Client 对象的属性Messages对象进行,每个POP3_ClientMessage代表一份完整的邮件信息,一开始应该是只是获取一些简单的邮件信息(其中包括邮件的唯一标识UID),这样才能提高POP3协议的处理速度,如下代码所示。

foreach (POP3_ClientMessage message in popClient.Messages)

为了进一步获取邮件头部信息,那么需要进行下面的转换

Mail_Message mime_header = Mail_Message.ParseFromByte(message.HeaderToByte());

转换后Mail_Message承载了邮件头部文件的很多必备信息,如发送人,发送人名称,接收地址,抄送人地址,邮件标题,邮件日期等等信息。

这些邮件地址的信息,都是通过Mail_t_Mailbox对象来记录,一般包含邮件地址的Address和显示名称DisplayName,这样非常方便用来显示,如我们可以进行转义,记录到数据库里面。

                        if (mime_header.From != null){//伍华聪(wuhuacong@163.com)string displayname = mime_header.From[0].DisplayName;string from = mime_header.From[0].Address;// DecodeString(mime_header.From[0].Address);if (!string.IsNullOrEmpty(displayname)){info.From = string.Format("{0}({1})", displayname, from);}else{info.From = string.Format("{0}", from);}}

                        if (mime_header.To != null){StringBuilder sb = new StringBuilder();foreach (Mail_t_Mailbox recipient in mime_header.To.Mailboxes){string displayname = recipient.DisplayName;string address = recipient.Address;if (!string.IsNullOrEmpty(displayname)){sb.AppendFormat("{0}({1});", displayname, address);}else{sb.AppendFormat("{0};", address);}}info.Senders = sb.ToString().Trim(';');}if (mime_header.Cc != null){StringBuilder sb = new StringBuilder();foreach (Mail_t_Mailbox recipient in mime_header.Cc.Mailboxes){string displayname = recipient.DisplayName;string address = recipient.Address;if (!string.IsNullOrEmpty(displayname)){sb.AppendFormat("{0}({1});", displayname, address);}else{sb.AppendFormat("{0};", address);}}info.Carboncopy = sb.ToString().Trim(';');}

每封Email会有一个在Pop3服务器范围内唯一的Id,检查这个Id是否存在就可以知道以前有没有接收过这封邮件

info.MailUid = message.UID;

每份邮件的头部信息,都会包含一个日期的,如下可以获取到该日期

info.Date = mime_header.Date;

标题信息可以通过下面代码获取

info.Title = mime_header.Subject;/

2、邮件正文信息和附件信息的获取

如果需要进一步获取邮件的正文内容,则需要对信息进行进一步的转换,把message对象进行MessageToByte操作,然后利用函数Mail_Message.ParseFromByte进行转换。

byte[] messageBytes = message.MessageToByte();Mail_Message mime_message = Mail_Message.ParseFromByte(messageBytes);
if (mime_message == null) continue;info.Body = mime_message.BodyText;
try
{if (!string.IsNullOrEmpty(mime_message.BodyHtmlText)){info.Body = mime_message.BodyHtmlText;}}
catch
{//屏蔽编码出现错误的问题,错误在BodyText存在而BodyHtmlText不存在的时候,访问BodyHtmlText会出现
}

邮件的附件是通过MIME_Entity来承载信息的,所以我们需要把对象通过mime_message.GetAttachments(true, true)进行获取,转换为附件信息。

                        #region 邮件附件内容foreach (MIME_Entity entity in mime_message.GetAttachments(true, true)){if (entity.ContentDisposition != null &&entity.ContentDisposition.Param_FileName != null){//Console.WriteLine("Attachment: " + entity.ContentDisposition.Param_FileName);string fileName = entity.ContentDisposition.Param_FileName;

如果需要进一步获取附件里面的文件字节流,那么还需要进行进一步的转换为MIME_b_SinglepartBase对象。

 MIME_b_SinglepartBase byteObj = (MIME_b_SinglepartBase)entity.Body;if (byteObj != null){FileUtil.CreateFile(filePath, byteObj.Data);fileSize = byteObj.Data.Length;

如果要区分邮件里面的附件是内嵌图片附件还是真正的附件,那么可以通过下面代码进行判断,如果是MIME_DispositionTypes.Attachment的就是普通附件,MIME_DispositionTypes.Inline的就是内嵌正文的附件。

entity.ContentDisposition.DispositionType == MIME_DispositionTypes.Attachment

3、邮件的删除操作

服务器上的邮件,可以通过POP3的协议方式进行删除,删除操作很简单,主要是通过mail.MarkForDeletion进行标识即可,实例操作代码如下所示

            using (POP3_Client c = new POP3_Client()){c.Connect(pop3Server, pop3Port, pop3UseSsl);c.Login(username, password);if (c.Messages.Count > 0){foreach (POP3_ClientMessage mail in c.Messages){try{if (toDeleteMailUidList.Contains(mail.UID)){mail.MarkForDeletion();deletedList.Add(mail.UID);}}catch (Exception ex){LogTextHelper.Error(ex);}}}}

基于Lumisoft.NET组件的POP3邮件接收和删除操作相关推荐

  1. 基于Lumisoft.NET组件开发碰到乱码等一些问题的解决

    在Lumisoft.NET组件获取POP3邮件的时候,发现大多数邮件都能正常获取,不过对于一些特殊的邮件,好像总是会出现转换错误,或者出现乱码及部分乱码现象,有些在标题里面或者邮件接收人地址,而有些则 ...

  2. 有关POP3邮件接收服务的介绍

    Win 2003配置邮件服务器 http://www.sina.com.cn   2008年09月26日 14:31   IT168.com 大家知道,邮件服务器系统由POP3服务.简单邮件传输协议( ...

  3. 改造layui-树(tree)组件的添加、编辑、删除操作(补充上一篇)

    这篇是用来补充上一篇:改造layui-树(tree)组件支持添加.编辑.删除的自定义(弹框)操作(https://blog.csdn.net/liona_koukou/article/details/ ...

  4. java pop3 接收邮件_JavaMail使用POP3协议接收并解析电子邮件

    JavaMail使用POP3协议接收并解析电子邮件 代码片段:public static void main(String[] args) throws Exception { receive(); ...

  5. 基于C#平台下利用POP3和SMTP协议的邮件归档系统

    今天对电脑进行整理,发现电脑上有一个帮同学做的毕设代码,挺简单的,但是当成做的时候吃了不少苦头,现在都毕业了,就放上来给新手分享一下.好了话不多说. 首先了解一下POP3和SMTP协议,他们是两个网络 ...

  6. 用PHP实现POP3邮件的收取(一)

    POP协议简介 本文简要说明了通过POP3协议收取邮件.MIME邮件的解码的原理:针对收取和MIME解码,提供了两个实用的PHP类,并提供了运用的样例.分为邮件收取.MIME解码两个部分.这里我们先向 ...

  7. 如何构建基于 Web Excel 组件的指标补录平台

    本期 Chat,由华融融通科技有限公司开发经理--郭晓冬先生,分享"纯前端表格控件 SpreadJS 在金融行业的应用"以及如何构建基于 Web Excel 组件的指标补录平台. ...

  8. 利用JMail组件快速构建邮件程序

    当你需要在VC程序中提供邮件支持功能的时候,你有许多种选择: 1)根据SMTP,POP3,MIME等协议从零开始实现.这要求熟悉RFC 821,RFC 822,RFC 1123, RFC 1652, ...

  9. C#邮件接收与发送程序

    本章节重点介绍邮件接收与发送方法,在文章中存在//注销部分没有拿掉,便于熟悉功能性. 控件说明 控件:LumiSoft.Net 版本号:4.5.6352.37929,System.Net.Mail 程 ...

最新文章

  1. Java的新项目学成在线笔记-day10(二)
  2. Boost:can_require的使用测试程序
  3. python opencv直方图_【python opencv】直方图均衡
  4. leetcode 406. 根据身高重建队列(贪心算法)
  5. 不知道工作组名称怎样加入_剩米饭不知道怎样做?试试泡菜炒饭,再也不用担心米饭做多了...
  6. leetcode —— 938. 二叉搜索树的范围和
  7. charles测试学习 手机端连接电脑进行抓包分析
  8. 面对疫情,AI 能做什么?
  9. jQuery补充及Django基本使用_Day18
  10. .NET数据访问是否采用ORM(自译)
  11. DB9引脚在UART,CAN,RS485中的定义
  12. 外卖点餐列表滑动 微信小程序_点餐小程序购物车效果实现,点餐小程序购物车列表的实现...
  13. 基于重心法哈特曼波前传感器光斑图像的质心计算
  14. 联想台式主机拆机教程_联想主机外壳怎么拆开_联想主机怎么拆图解
  15. LittleVGL-键盘控件
  16. 手把手教你开发红外遥控器
  17. 【Lua 入门基础篇(七)】表模块与包
  18. 骨骼动画——2D Animation
  19. iOS 开发: 仿QQ
  20. uniapp 微信小程序登录方法封装

热门文章

  1. 在线CSS代码压缩美化工具
  2. ajax跨域请求 html5,HTML5中使用postMessage实现Ajax跨域请求的方法
  3. 输出素数和排序后的数组和杨辉三角
  4. 什么是IEC 61508?
  5. sqlServer对内存的管理
  6. C#通用类库--数字转为人民币汉字大写表示
  7. python2.7个3.7之间传输文件_关于将python2.7转换为python3.7的说明,python27,python37,散记...
  8. 【写作技巧】毕业论文写作资料--刊物搜索
  9. linux设备驱动 注册 命令6,Linux设备驱动调试
  10. redis java驱动_java中通过配置文件的方式(Jedis驱动)使用Redis