博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于Lumisoft.NET组件的POP3邮件接收和删除操作
阅读量:4520 次
发布时间:2019-06-08

本文共 6347 字,大约阅读时间需要 21 分钟。

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
(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);                        }                    }                }            }

 

 

转载于:https://www.cnblogs.com/amylis_chen/p/6657793.html

你可能感兴趣的文章
BZOJ 1607 [Usaco2008 Dec]Patting Heads 轻拍牛头:统计 + 筛法【调和级数】
查看>>
如果一个人请优雅的活着。
查看>>
验证码
查看>>
Django缓存配置
查看>>
Ubuntu下安装 Mysql
查看>>
LeetCode--Reverse Integer
查看>>
PHP_APC+Ajax实现的监视进度条的文件上传
查看>>
计算机网络课堂笔记3.29
查看>>
word2vec----CBOW
查看>>
衰减学习率真的有用吗?
查看>>
ORACLE 建库过程总结
查看>>
Ogre1.8.1 Basic Tutorial 6 - The Ogre Startup Sequence
查看>>
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(36)-文章发布系统③-kindeditor使用...
查看>>
c# Winform 开发分屏显示应用程序
查看>>
canvas刮奖
查看>>
javascript 模拟滚动 隐藏滚动条
查看>>
手把手教你使用 Clion 开发 Linux C++ 项目
查看>>
阿里巴巴卖空阿里巴巴入股新浪微博抑制投资者卖空行为
查看>>
分析打开hdu 3335 (最小路径覆盖)
查看>>
添加源ubuntu_x64 安装 Adobe Reader
查看>>