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:
- 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: "
).
- 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.
- 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.
- 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
).
Ne pas remercier, il suffit d'accepter la réponse :) – Gene