2017-04-12 43 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のカウントは0になっています。

私がmessageを見るとヘッダが入っているので、私もmessage.WriteTo(somePath);ヘッダーもあります。

私は間違っていますか?

このコードは、Outlookクライアントを使用する場合に機能しますが、Gmailのメールクライアントで使用すると失敗します。

+0

'Append'メソッドはuid(またはnull)を返しますか?それが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(); 
    } 
} 
関連する問題