mailkit imap 客户端 Inbox.MoveTo "The folder is not currently open in read-write mode."

mailkit imap client Inbox.MoveTo "The folder is not currently open in read-write mode."

我在使用 MailKit/MimeKit 工具将邮件从收件箱移出到邮件服务器上的子文件夹时遇到问题。目前我可以阅读任一文件夹中的电子邮件,也可以从任一文件夹中删除电子邮件。邮件服务器是 microsoft exchange 365。我目前对使用 Mozilla Thunderbird 客户端的任何 imap 功能没有任何问题。我的代码如下:

public void MoveEmail(string index, string folder)
{
    using (var client = new MailKit.Net.Imap.ImapClient())
    {
        client.Connect(ServerUrl, ServerPort, true);
        client.Authenticate(UserName, Password);
        client.Inbox.Open(MailKit.FolderAccess.ReadWrite);
        if (!client.Inbox.IsOpen == true)
            throw new Exception("Inbox is not open.");

        var dingle = client.Inbox.GetSubfolder(folder);
        dingle.Open(MailKit.FolderAccess.ReadWrite);
        if (!dingle.IsOpen == true)
            throw new Exception("Dingle is not open.");

        client.Inbox.MoveTo(0, dingle);

        var dangle = dingle.Count;
        var wingle = dingle.Fetch(0, -1, MailKit.MessageSummaryItems.Full);

        dingle.Close(false);
        client.Disconnect(true);
    }
}

代码一直执行到遇到 move 语句,然后抛出异常:“文件夹当前未以读写模式打开。”

感谢阅读! 卡尔

问题是一旦您打开 dingle 文件夹,它就会关闭 Inbox 文件夹。这就是 IMAP 的工作原理(一次只能打开 1 个文件夹)。

解决方法是不打开dingle文件夹,只打开Inbox文件夹。

代码应如下所示:

public void MoveEmail(string index, string folder)
{
    using (var client = new MailKit.Net.Imap.ImapClient())
    {
        client.Connect(ServerUrl, ServerPort, true);
        client.Authenticate(UserName, Password);
        client.Inbox.Open(MailKit.FolderAccess.ReadWrite);
        if (!client.Inbox.IsOpen == true)
            throw new Exception("Inbox is not open.");

        var dingle = client.Inbox.GetSubfolder(folder);

        client.Inbox.MoveTo(0, dingle);

        dingle.Open(MailKit.FolderAccess.ReadWrite);
        if (!dingle.IsOpen == true)
            throw new Exception("Dingle is not open.");

        var dangle = dingle.Count;
        var wingle = dingle.Fetch(0, -1, MailKit.MessageSummaryItems.Full);

        dingle.Close(false);
        client.Disconnect(true);
    }
}