首页 > 解决方案 > " mailkit imap 客户端 Inbox.MoveTo "该文件夹当前未以读写模式打开。"

问题描述

我在使用 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 语句,然后抛出异常:“文件夹当前未以读写模式打开。”

谢谢阅读!卡尔

标签: c#imapmailkit

解决方案


问题是,一旦您打开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);
    }
}

推荐阅读