当前位置: 移动技术网 > IT编程>开发语言>.net > 深入Lumisoft.NET组件POP3邮件接收与删除操作的使用详解

深入Lumisoft.NET组件POP3邮件接收与删除操作的使用详解

2017年12月12日  | 移动技术网IT编程  | 我要评论

山东凯远集团,陈元方年十一时,sm小游戏

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网