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

 

上一篇:游标


下一篇:Typora配置PicGo时,提示Failed to fetch