2016-03-04 86 views
0

我正在使用来自limilabs的mail.dll的c#应用程序。使用以下代码我从服务器检索邮件。ImapResponseException重复文件夹INBOX

 try 
      { 
       imap.ServerCertificateValidate += new ServerCertificateValidateEventHandler(Validate); 
       imap.Connect(server); 
       Console.WriteLine("Imap Connected"); 
       imap.UseBestLogin(username, password); 
       Console.WriteLine("Imap Logged in"); 
       string[] folders = new string[] { "Verwijderde items", "INBOX"}; 
       foreach (string folder in folders) 
       { 
        if (folder.Equals(string.Empty)) 
         break; 

        foreach (FolderInfo folderInfo in imap.GetFolders()) 
        { 
         if (folderInfo.Name.Equals(folder)) 
         { 
          imap.Select(folder); //ImapResponseException 

          //Process found mail 

          break; 
         } 
        }       
       } 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("Imap not Connected"); 
       Console.WriteLine(ex.Message); 
       Console.WriteLine(ex.StackTrace); 
      } 

"verwijderde items"是荷兰已移除项目或回收站。

ImapResponseException: Duplicate folder INBOX were detected in the mailbox. Therefore the user's connection was disconnected.

此异常抛出,因为我使用的登录用户名和密码即可访问收件箱了所有员工。也许我需要使用imap.Select("[email protected]/inbox/ + folder")来指定我想访问的用途。但我不知道imap使用的文件结构。也许这不是这个特定的DLL的解决方案。所有想法都欢迎。

我连接到该服务器的Windows Server 2008 R2与Microsoft Exchange 2007

更新1: Mail.dll文档:http://www.limilabs.com/static/mail/documentation/

回答

0

的问题可能是你在呼唤imap.Select(folder);当你应该可能是在folderInfofolderInfo.Path字符串上调用Select()方法(我不确定folderInfo具有哪些属性)。

如果您愿意切换到免费/开源IMAP库,建议使用我的MailKit库。

做你正在尝试在MailKit做,代码将是这个样子:

try { 
    using (var client = new ImapClient()) { 
     client.Connect (server, 993, true); // I assume you are connecting via SSL 
     client.Authenticate (username, password); 

     string[] names = new string[] { "Verwijderde items", "INBOX" }; 

     // client.PersonalNamespaces are the mailboxes that belong to you 
     foreach (var personalNamespace in client.PersonalNamespaces) { 
      // get the root folder in your personal namespace 
      // (there's always at least 1 personal namespace) 
      var root = client.GetFolder (personalNamespace); 

      // get the top-level folders in your personal namespace 
      foreach (var folder in root.GetSubfolders()) { 
       foreach (var name in names) { 
        if (folder.Name == name) { 
         // Select the folder (if you want to change flags, 
         // use FolderAccess.ReadWrite) 
         folder.Open (FolderAccess.ReadOnly); 

         // process mail 
        } 
       } 
      } 
     } 

     // client.SharedNamespaces are the shared mailboxes 
     foreach (var sharedNamespace in client.SharedNamespaces) { 
      var root = client.GetFolder (sharedNamespace); 

      // get the top-level folders in your shared namespace 
      foreach (var folder in root.GetSubfolders()) { 
       foreach (var name in names) { 
        if (folder.Name == name) { 
         // Select the folder (if you want to change flags, 
         // use FolderAccess.ReadWrite) 
         folder.Open (FolderAccess.ReadOnly); 

         // process mail 
        } 
       } 
      } 
     } 
    } 
} catch (Exception ex) { 
    Console.WriteLine ("Imap not Connected"); 
    Console.WriteLine (ex.Message); 
    Console.WriteLine (ex.StackTrace); 
} 

显然你能够简化上面的代码,因为你可以编写需要的方法FolderNamespaceCollection说法,只是通过它的个人或共享命名空间,就像这样:

void ProcessMail (ImapClient client, FolderNamespaceCollection namespaces) 
{ 
    string[] names = new string[] { "Verwijderde items", "INBOX" }; 

    // client.PersonalNamespaces are the mailboxes that belong to you 
    foreach (var @namespace in namespaces) { 
     // get the root folder in the namespace 
     var root = client.GetFolder (@namespace); 

     // get the top-level folders in the namespace 
     foreach (var folder in root.GetSubfolders()) { 
      foreach (var name in names) { 
       if (folder.Name == name) { 
        // Select the folder (if you want to change flags, 
        // use FolderAccess.ReadWrite) 
        folder.Open (FolderAccess.ReadOnly); 

        // process mail 
       } 
      } 
     } 
    } 
} 

一个更简单的方法,但是,这是这样的,因为你已经知道你想要的文件夹名称:

void ProcessMail (ImapClient client, FolderNamespaceCollection namespaces) 
{ 
    string[] names = new string[] { "Verwijderde items", "INBOX" }; 

    foreach (var @namespace in namespaces) { 
     // get the root folder in the namespace 
     var root = client.GetFolder (@namespace); 

     // get specific folders: 
     foreach (var name in names) { 
      try { 
       var folder = root.GetSubfolder (name); 

       // Select the folder (if you want to change flags, 
       // use FolderAccess.ReadWrite) 
       folder.Open (FolderAccess.ReadOnly); 

       // process mail 
      } catch (FolderNotFoundException) { 
      } 
     } 
    } 
} 
+0

Imap.select(folderinfo)确实存在但提供相同的异常。文档可以在这里找到:http://www.limilabs.com/static/mail/documentation/ –

+0

看起来像我关于什么folderInfo.Name代表错误的假设。我猜这是基于这些文档的完整路径,但我认为它是邮箱名称而不是文件夹路径。我已经更新了我的答案,以展示如果您有兴趣,如何使用我自己的IMAP库做你想做的事情。 – jstedfast

相关问题