【问题标题】:Can't mark email read with InterIMAP, folder is read-only无法使用 InterIMAP 将电子邮件标记为已读,文件夹为只读
【发布时间】:2016-03-23 09:37:37
【问题描述】:

我正在尝试使用 InterIMAP 将电子邮件标记为已读 (/SEEN),但这不起作用。我用调试器逐步检查了代码,发现来自邮件服务器的响应是“IMAP0078 OK Store 被只读邮箱忽略。”,这几乎告诉了我为什么它不起作用。但看起来没有办法告诉 InterIMAP 以读写方式打开连接。如果我使用 Thunderbird 之类的东西,我可以将消息设置为已读。

有谁知道我应该如何使用 InterIMAP 来实现我正在尝试的内容,或者如何更改源代码以便我能够将消息标记为已读?

【问题讨论】:

    标签: c# email imap interimap


    【解决方案1】:

    我能够通过对 Imap.cs 进行以下更改来解决这种情况

    public void MarkMessageAsRead(IMAPMessage msg)
    {
        string cmd = "UID STORE {0} +FLAGS (\\Seen)\r\n";
        ArrayList result = new ArrayList();
        SendAndReceive(String.Format(cmd, msg.Uid), ref result);
        if (result[0].ToString().ToLower().Contains("ok"))
            msg.Flags.New = false;
    }
    

    改为

     public void MarkMessageAsRead(IMAPMessage msg)
        {
            msg.Folder.Select();
            string cmd = "UID STORE {0} +FLAGS (\\Seen)\r\n";
            ArrayList result = new ArrayList();
            SendAndReceive(String.Format(cmd, msg.Uid), ref result);
            if (result[0].ToString().ToLower().Contains("ok"))
                msg.Flags.New = false;
            msg.Folder.Examine();
        }
    

    不确定这是否是解决我的问题的最干净的方法,但总比没有好。

    【讨论】:

    • 看起来问题的原因是邮箱(=文件夹)是使用“EXAMINE”命令而不是“SELECT”命令打开的。这些 IMAP 命令非常相似 - 主要区别在于“EXAMINE”以只读模式打开文件夹。我不熟悉 InterIMAP,但如果您能够在调用 MarkMessagesAsRead 方法之前使其使用“SELECT”而不是“EXAMINE”,则不再需要此修复。
    【解决方案2】:

    Segue código ajustado que funcionou para remover a mensagem da caixa IMAP GMAIL!

        public void DeleteMail(IMAPMessage msg)
        {
            msg.Folder.Select();
            string cmd = "UID STORE {0} +FLAGS (\\Deleted \\Seen)\r\n";
            ArrayList result = new ArrayList();
            SendAndReceive(String.Format(cmd, msg.Uid), ref result);
    
            int countResult = result.Count - 1;
    
            while (countResult >= 0)
            {
                if (result[countResult].ToString().ToLower().Contains("ok"))
                {
                    msg.Flags.New = false;
                    msg.Flags.Deleted = true;
    
                    string cmd2 = "EXPUNGE\r\n";
                    ArrayList result2 = new ArrayList();
                    SendAndReceive(String.Format(cmd2, msg.Uid), ref result2);
    
                    if (result2[0].ToString().ToLower().Contains("ok"))
                    {
                        //Deu certo!!
                        msg.Folder.Examine();
                    }
    
                }
    
                countResult--;
            }
        }
    

    【讨论】:

    • 欢迎来到 StackOverflow!大多数 SO 用户常用和理解的语言是英语。因此,请尝试用英语解释您的答案,以使其对非西班牙语(?)用户也有用。
    猜你喜欢
    • 2017-12-15
    • 2023-02-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 2018-10-13
    • 2014-10-09
    相关资源
    最近更新 更多