2016-01-30 1 views
3

J'utilise la bibliothèque Mailkit (Imap) pour mon projet.Répondre à un mail dans Mailkit

Je peux facilement envoyer un nouveau message par SmtpClient.

actuellement je creuse sur la façon de répondre à un courrier particulier. et est-il possible d'ajouter plus de destinataires à ce courrier de réponse?

@jstedfast merci pour le merveilleux :) un

+0

Ne pas remercier, il suffit d'accepter la réponse :) – Gene

Répondre

4

Répondre à un message est assez simple. Pour l'essentiel, vous créez simplement le message de réponse de la même manière que vous créez un autre message. Il y a quelques légères différences:

  1. Dans le message de réponse, vous voulez préfixe l'en-tête Subject avec "Re: " si le préfixe n'existe pas déjà dans le message auquel vous répondez (en d'autres termes, Si vous répondez à un message avec un Subject de "Re: party tomorrow night!", vous devez pas le préfixer avec un autre "Re: ").
  2. Vous devez définir l'en-tête In-Reply-To du message de réponse sur la valeur de l'en-tête Message-Id dans le message d'origine.
  3. Vous devez copier l'en-tête References du message d'origine dans l'en-tête References du message de réponse, puis ajouter l'en-tête Message-Id du message d'origine.
  4. Vous voudrez probablement "citer" le texte du message original dans la réponse.

Si cette logique devait être exprimée dans le code, il pourrait ressembler à ceci:

public static MimeMessage Reply (MimeMessage message, bool replyToAll) 
{ 
    var reply = new MimeMessage(); 

    // reply to the sender of the message 
    if (message.ReplyTo.Count > 0) { 
     reply.To.AddRange (message.ReplyTo); 
    } else if (message.From.Count > 0) { 
     reply.To.AddRange (message.From); 
    } else if (message.Sender != null) { 
     reply.To.Add (message.Sender); 
    } 

    if (replyToAll) { 
     // include all of the other original recipients - TODO: remove ourselves from these lists 
     reply.To.AddRange (message.To); 
     reply.Cc.AddRange (message.Cc); 
    } 

    // set the reply subject 
    if (!message.Subject.StartsWith ("Re:", StringComparison.OrdinalIgnoreCase)) 
     reply.Subject = "Re:" + message.Subject; 
    else 
     reply.Subject = message.Subject; 

    // construct the In-Reply-To and References headers 
    if (!string.IsNullOrEmpty (message.MessageId)) { 
     reply.InReplyTo = message.MessageId; 
     foreach (var id in message.References) 
      reply.References.Add (id); 
     reply.References.Add (message.MessageId); 
    } 

    // quote the original message text 
    using (var quoted = new StringWriter()) { 
     var sender = message.Sender ?? message.From.Mailboxes.FirstOrDefault(); 

     quoted.WriteLine ("On {0}, {1} wrote:", message.Date.ToString ("f"), !string.IsNullOrEmpty (sender.Name) ? sender.Name : sender.Address); 
     using (var reader = new StringReader (message.TextBody)) { 
      string line; 

      while ((line = reader.ReadLine()) != null) { 
       quoted.Write ("> "); 
       quoted.WriteLine (line); 
      } 
     } 

     reply.Body = new TextPart ("plain") { 
      Text = quoted.ToString() 
     }; 
    } 

    return reply; 
} 

Note: Ce code suppose que message.TextBody est non nul. Il est possible, quoique assez improbable, que cela puisse arriver (ce qui signifie que le message ne contient pas de corps text/plain).