C#实现QQ邮箱IMAP之邮件处理

复制代码
public void DealEmail(string fjType = ".db")
{
    IMAP_Client IMAPServer = new IMAP_Client();
    try
    {
        //连接qq邮箱
        IMAPServer.Connect(popServer, popPort);
        IMAPServer.Login(accout, pass);
        //获取邮件
        IMAPServer.SelectFolder("INBOX");
        //获取未读邮件id
        int[] unseen_ids = IMAPServer.Search(false, Encoding.UTF8, new IMAP_Search_Key_Unseen());
        //没有未读邮件则返回
        if (unseen_ids.Length == 0) continue;
        //未读邮件集合
        IMAP_t_SeqSet sequence = IMAP_t_SeqSet.Parse(string.Join(",", unseen_ids));
        //所需未读邮件集合参数
        var items = new IMAP_t_Fetch_i[]
        {
        new IMAP_t_Fetch_i_Envelope(),
        new IMAP_t_Fetch_i_Uid(),
        new IMAP_t_Fetch_i_Flags(),
        new IMAP_t_Fetch_i_Flags(),
        new IMAP_t_Fetch_i_InternalDate(),
        new IMAP_t_Fetch_i_Rfc822()
        };

        //遍历邮件
        IMAPServer.Fetch(false, sequence, items, (s, e) =>
        {
            try
            {
                var email = e.Value as IMAP_r_u_Fetch;
                if (email.Rfc822 != null)
                {
                    //处理邮件附件
                    email.Rfc822.Stream.Position = 0;
                    var mine = Mail_Message.ParseFromStream(email.Rfc822.Stream);
                    email.Rfc822.Stream.Close();
                    if (mine.Attachments.Length > 0)
                    {
                        List<MIME_Entity> list = new List<MIME_Entity>(mine.Attachments);
                        foreach (var att in list)
                        {
                            if (att.ContentType.Param_Name.Contains(fjType))
                            {
                                var part = att.Body as MIME_b_SinglepartBase;

                                //路径被URL编码了,格式为:UTF-8''附件名
                                string filename = att.ContentType.Param_Name;
                                if(filename.Contains("UTF-8"))
                                    filename= HttpUtility.UrlDecode(filename.Substring(7));

                                //下载到指定地址
                                string filePath = Path.Combine(rootPath, Path.GetFileNameWithoutExtension(filename));
                                File.WriteAllBytes(filePath, part.Data);
                            }
                        }
                    }

                    //邮件信息
                    //var Title = email.Envelope.Subject;
                    //var CreateTime = email.InternalDate.Date;
                    //var BodyText = mine.BodyText;
                    //var BodyHtmlText = mine.BodyHtmlText;

                    //处理完的邮件标记为已读
                    IMAP_t_SeqSet sequenceSet = IMAP_t_SeqSet.Parse(string.Join(",", email.SeqNo));
                    IMAPServer.StoreMessageFlags(false, sequenceSet, IMAP_Flags_SetType.Add, new IMAP_t_MsgFlags(new string[] { IMAP_t_MsgFlags.Seen }));
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        });
    }
    catch (Exception ex)
    {
        throw ex;
    }
    finally
    {
        IMAPServer.Disconnect();
    }
}
复制代码

 

posted @   TenFly  阅读(605)  评论(2编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示