2016-03-04 29 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

相關問題