2017-04-12 94 views
0

我目前使用下面的代碼來下載消息電子郵件,自定義標題添加到它,然後添加郵件回郵件文件夾:添加自定義頁眉使用MailKit

using (ImapClient imap = new ImapClient()) 
{ 
    imap.ServerCertificateValidationCallback = (s, c, h, e) => true; 
    imap.Connect(host, port, useSSL); 

    imap.Authenticate(user, password); 

    IMailFolder mailFolder = imap.GetFolder(folder); 
    mailFolder.Open(FolderAccess.ReadWrite); 

    if (mailFolder.Count > 0) 
    { 
     MimeMessage message = mailFolder.GetMessage(0); 

     var header = message.Headers.FirstOrDefault(h => h.Field == "X-SomeCustomHeader"); 
     if (header == null) 
     { 
      message.Headers.Add("X-SomeCustomHeader", "SomeValue"); 
     } 

     mailFolder.SetFlags(0, MessageFlags.Deleted, true); 
     mailFolder.Expunge(); 

     UniqueId? newUid = mailFolder.Append(message); 
     mailFolder.Expunge(); 

     var foundMails = mailFolder.Search(SearchQuery.HeaderContains("X-SomeCustomHeader", "SomeValue")); 
     if (foundMails.Count > 0) 
     { 
      var foundMail = mailFolder.GetMessage(new UniqueId(foundMails.First().Id)); 

      Console.WriteLine(foundMail.Subject); 
     } 

     mailFolder.Close(true); 
    } 
} 

的問題此代碼是,如果我查看文件夾中郵件的來源不在那裏,foundMails計數爲零。

如果我查看message它包含標題,所以如果我也做message.WriteTo(somePath);標題也在那裏。

我在做什麼錯?

如果我使用Outlook客戶端,但是在gmail上使用它時失敗,此代碼有效。

+0

是否'Append'方法返回一個UID(或空)?如果它返回一個uid,如果你執行'mailFolder.GetMessage(uid.Value)'會發生什麼? *那*消息是否有頭部? – jstedfast

+0

另外嘗試獲取[ProtocolLog](https://github.com/jstedfast/MailKit/blob/master/FAQ.md#ProtocolLog)以查看附加到文件夾時郵件中是否包含郵件頭。 – jstedfast

+0

@jstedfast它返回一個uid,但該消息也不包含標題。 – TheLethalCoder

回答

0

問題是,在gmail服務器上調用刪除並沒有真正刪除電子郵件。要解決此問題,請將電子郵件移至垃圾箱文件夾,然後將其刪除。下面的輔助方法,提供了關於如何做到這一點的想法:

protected void DeleteMessage(ImapClient imap, IMailFolder mailFolder, UniqueId uniqueId) 
{ 
    if (_account.HostName.Equals("imap.gmail.com")) 
    { 
     IList<IMessageSummary> summaries = mailFolder.Fetch(new List<UniqueId>() { uniqueId }, MessageSummaryItems.GMailMessageId); 
     if (summaries.Count != 1) 
     { 
      throw new Exception("Failed to find the message in the mail folder."); 
     } 

     mailFolder.MoveTo(uniqueId, imap.GetFolder(SpecialFolder.Trash)); 
     mailFolder.Close(true); 

     IMailFolder trashMailFolder = imap.GetFolder(SpecialFolder.Trash); 
     trashMailFolder.Open(FolderAccess.ReadWrite); 

     SearchQuery query = SearchQuery.GMailMessageId(summaries[0].GMailMessageId.Value); 

     IList<UniqueId> matches = trashMailFolder.Search(query); 

     trashMailFolder.AddFlags(matches, MessageFlags.Deleted, true); 
     trashMailFolder.Expunge(matches); 

     trashMailFolder.Close(true); 

     mailFolder.Open(FolderAccess.ReadWrite); 
    } 
    else 
    { 
     mailFolder.SetFlags(uniqueId, MessageFlags.Deleted, true); 
     mailFolder.Expunge(); 
    } 
}