jmail收取未读邮件(带附件)

本文介绍了一种利用jmail收取未读邮件的策略,通过记录邮件的唯一标识(UID)来判断是否已下载,避免重复下载。在收取过程中,首先获取服务器上所有邮件的UID,然后与本地数据库比较,只下载本地未存储过的邮件。邮件的读取从最新的开始,以减少循环次数。下载邮件时,同时处理附件并保存到本地。邮件收取完成后,将UID存入本地数据库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/** jmail 收取"未读邮件" **/

//测试邮箱地址为 recieveceshi@163.com

 

/* pop.DownloadUnreadMessages()是用来“收取未读邮件”(未被客户端下载过的邮件),

    * 但这个方法现在被支持的不好。以下是这次实现读取"未读邮件"的思路:第一次收取邮

    * 件,将邮件在服务器端的唯一标识(以下简称UID,保存为字符串)记录到本地数据库

    * 中当再收取邮件,判断本地UID中是否已经存在要下载邮件的UID(判断邮件是否下载过),

    * 已经下载过(本地UID已存),跳过;否则下载邮件,并保存此邮件的UID到本地数据库,

    * 以此模拟读取"未读邮件"。

    * 因为获取服务器端UID可以通过pop.GetMessageUID(i)《不用下载整封邮件》实现,相较

    * 用时间来判断邮件是否未读要更好些的样子。*/

 

//创建jmail接收邮件类的实例

POP3 pop = new POP3();

try

{

    //创建连接

    //参数依次为:邮件名,密码,服务器地址

    pop.Connect("recieveceshi""qwerty""pop.163.com");

    //服务器端邮件总数量

    int emailCount = pop.Count;

    //真实要下载到本地的邮件数量(除去"已读邮件")

    int readRecieveNum = 0;

 

    //停止读取邮件的索引,初始值为从服务器端读到的信件数量

    int breakNum = pop.Count;

    //检测邮件哪些是"未读"的,并记录breakNum索引

    for (int i = emailCount; i >= 1; i--)

    {

        /* 从服务器端信息最后一条开始检测,因为jmail收取的邮件信息是按时间由小到

            * 大排序的(索引越小,收信的时间越早),所以倒序循环处理更合理,更有助于

            * 减少循环次数。下面的for循环采用倒序循环的理由也是一样。*/

 

        //获取指定邮件服务器端邮件UID。要注意的是,最小索引应该是1而不是0

        string theUid = pop.GetMessageUID(i);

        /* getLocalUID(string UID)为自己要定义的方法,用于检测指定邮件的唯一标

            * 识(UID)在本地数据库中是否存在。

            * 若存在,则返回false;反之(本地没有记录过)则返回 true*/

        bool isUnread = getLocalUID(theUid);

        if (isUnread)

        {

            /*指定邮件为"未读邮件",将停止读取邮件的索引减小,

                以便在下面的for循环中使用。*/

            breakNum--;

        }

    }

 

    for (int i = emailCount; i >= 1; i--)

    {

        /* 

            * 倒序循环在上面已经说过,不再说了

            */

 

        if (i == breakNum)

        {

            //到此,"未读邮件"已经读取完毕了。

            break;

        }

        //下载pop3获取的信息中索引为i的邮件。

        /*pop.Messages[i]和pop.DownloadSingleMessage(i)基本是等效的,都是下载

            包括附件在内的整封邮件*/

        jmail.Message emailMessage = pop.DownloadSingleMessage(i);

        //服务器端收信时间,下载整封邮件后获得,所以不用它来判断邮件是否已读

        DateTime recieveTime = emailMessage.Date;

        //收件人

        string recieveMan = emailMessage.RecipientsString.Trim();

        //发件人email地址

        string fromMan = emailMessage.From;

        //发件人昵称

        string fromManName = emailMessage.FromName;

        //邮件主题

        string subject = emailMessage.Subject;

        // 邮件主体内容, HTML格式:emailMessage.HTMLBody

        string body = emailMessage.Body;

 

        //邮件的附件处理

        //每封邮件的所有附件

        jmail.Attachments attachments = emailMessage.Attachments;

        /* jmail.Attachments 索引正常,从0开始就好 */

        for (int j = 0; j < attachments.Count; j++)

        {

            //根据索引取附件

            jmail.Attachment attachment = attachments[j];

            //附件名

            string fileName = attachment.Name;

            //附件保存在指定路径,不要有同名文件,否则出异常

            attachment.SaveToFile(@"C:\" + fileName);

        }

        /* *****************************************************

            * 读取完成就根据索引删除邮件:pop.DeleteSingleMessage(i)

            * *****************************************************/

        /* 如果要能读完这个邮件就马上用这个方法删除,那就省事多了,也就是不用

            * 第一个for循环了,也不用把邮件的UID存在本地了并进行"检测"了。*/

 

       /**** 先下载邮件,之后有必要时再删除服务器端邮件****/

       /* 

        *jmail 删除邮件的解决方案

        */

 

        /* insertUIDIntoLocal(string UID)为自己定义的方法,把邮件唯一标识(UID)

            * 保存到本地数据库中,应与getLocalUID(string UID)操作同一数据表(源)。

            * 注意保证数据保存成功*/

        insertUIDIntoLocal(pop.GetMessageUID(i));

 

        //记录真实下载了的邮件

        readRecieveNum++;

 

        /* 写一个方法,把获取邮件的相关信息保存到数据库就就完成了 */

    }

    //断开连接

    pop.Disconnect();

 

    MessageBox.Show("海上升明月,天涯共此时。");

}

catch

{

    MessageBox.Show("片云天共远,永夜月同孤。");

}

 

/**完成时间 2014-8-27**/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值