2017-04-12 1 views
0

Je suis actuellement en utilisant le code suivant pour télécharger un message, ajoutez un en-tête personnalisé, puis ajouter ce message de nouveau dans le dossier mail:Ajouter en-tête personnalisé par courriel en utilisant 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); 
    } 
} 

Le problème avec ce code est que si je regarde la source de l'email sur le dossier l'en-tête n'est pas là et foundMails a un compte de zéro.

Si je vois le message il contient l'en-tête, donc si je fais aussi message.WriteTo(somePath); l'en-tête est là aussi.

Qu'est-ce que je fais mal?

Ce code fonctionne si j'utilise un client Outlook, mais en cas d'utilisation sur un client Gmail, il échoue.

+0

La méthode 'Append' renvoie-t-elle un UID (ou null)? S'il renvoie un UID, que se passe-t-il si vous faites 'mailFolder.GetMessage (uid.Value)'? Est-ce que * ce * message a l'en-tête? – jstedfast

+0

Essayez également d'obtenir un [ProtocolLog] (https://github.com/jstedfast/MailKit/blob/master/FAQ.md#ProtocolLog) pour voir si l'en-tête est inclus dans le message lorsqu'il est ajouté au dossier. – jstedfast

+0

@jstedfast Renvoie un UID mais le message ne contient pas non plus l'en-tête. – TheLethalCoder

Répondre

0

Le problème était que l'appel d'une suppression sur le serveur gmail ne supprimait pas réellement l'e-mail. Pour contourner ce problème, déplacez l'e-mail dans le dossier Corbeille, puis supprimez-le. La méthode d'assistance suivante vous donne une idée sur la façon d'accomplir ceci:

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(); 
    } 
}