在 Mailkit 中回复邮件
Reply to a Mail in Mailkit
我正在为我的项目使用 Mailkit 库 (Imap)。
我可以轻松地通过 SmtpClient 发送新消息。
目前我正在研究如何回复特定邮件。是否可以向该回复邮件添加更多收件人?
@jstedfast 谢谢你的精彩 :)
回复消息非常简单。大多数情况下,您只需像创建任何其他消息一样创建回复消息。只有一些细微的差别:
- 在回复邮件中,如果您要回复的邮件中不存在前缀,则您需要在
Subject
header 前加上 "Re: "
前缀(在换句话说,如果您回复的消息的 Subject
为 "Re: party tomorrow night!"
,您将 而不是 加上另一个 "Re: "
) 的前缀。
- 您需要将回复邮件的
In-Reply-To
header 设置为原始邮件中 Message-Id
header 的值。
- 您需要将原始消息的
References
header 复制到回复消息的 References
header 中,然后附加原始消息的 Message-Id
header.
- 您可能希望在回复中 "quote" 原始消息的文本。
如果用代码来表达这个逻辑,它可能看起来像这样:
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;
}
注意:此代码假定 message.TextBody 不为空。有可能,尽管不太可能发生这种情况(这意味着消息不包含 text/plain
body)。
我正在为我的项目使用 Mailkit 库 (Imap)。
我可以轻松地通过 SmtpClient 发送新消息。
目前我正在研究如何回复特定邮件。是否可以向该回复邮件添加更多收件人?
@jstedfast 谢谢你的精彩 :)
回复消息非常简单。大多数情况下,您只需像创建任何其他消息一样创建回复消息。只有一些细微的差别:
- 在回复邮件中,如果您要回复的邮件中不存在前缀,则您需要在
Subject
header 前加上"Re: "
前缀(在换句话说,如果您回复的消息的Subject
为"Re: party tomorrow night!"
,您将 而不是 加上另一个"Re: "
) 的前缀。 - 您需要将回复邮件的
In-Reply-To
header 设置为原始邮件中Message-Id
header 的值。 - 您需要将原始消息的
References
header 复制到回复消息的References
header 中,然后附加原始消息的Message-Id
header. - 您可能希望在回复中 "quote" 原始消息的文本。
如果用代码来表达这个逻辑,它可能看起来像这样:
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;
}
注意:此代码假定 message.TextBody 不为空。有可能,尽管不太可能发生这种情况(这意味着消息不包含 text/plain
body)。