如何在MailKit中回复带引用HTML内容的邮件?
在MailKit中添加自定义HTML内容到带引用的回复邮件
我按照MailKit的示例实现了带原始消息引用的回复邮件,但示例里没说明怎么把自定义HTML内容和引用内容结合——现在邮件只显示引用,自定义的主体内容加不进去。
解决方法
核心是用BodyBuilder把自定义内容和ReplyVisitor生成的引用内容拼接,同时兼顾纯文本格式的兼容性:
public static MimeMessage Reply(MimeMessage message, MailboxAddress from, bool replyToAll) { var visitor = new ReplyVisitor(); var reply = new MimeMessage(); // 原有收件人、主题、回复头逻辑保持不变 reply.From.Add(from); 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) { reply.To.AddRange(message.To.Mailboxes.Where(x => x.Address != from.Address)); reply.Cc.AddRange(message.Cc.Mailboxes.Where(x => x.Address != from.Address)); } if (!message.Subject.StartsWith("Re:", StringComparison.OrdinalIgnoreCase)) reply.Subject = "Re: " + message.Subject; else reply.Subject = message.Subject; if (!string.IsNullOrEmpty(message.MessageId)) { reply.InReplyTo = message.MessageId; foreach (var id in message.References) reply.References.Add(id); reply.References.Add(message.MessageId); } visitor.Visit(message); // 合并自定义内容与引用内容 var builder = new BodyBuilder(); string customHtml = "<div>HELLO WORLD</div>"; string customPlainText = "HELLO WORLD\n"; // 提取引用内容的HTML和纯文本 string quotedHtml = string.Empty; string quotedPlainText = string.Empty; if (visitor.Body is TextPart textPart) { if (textPart.IsHtml) { quotedHtml = textPart.Text; quotedPlainText = textPart.Text; } else { quotedPlainText = textPart.Text; quotedHtml = MimeKit.Text.HtmlEncoder.Encode(textPart.Text); } } else if (visitor.Body is Multipart multipart) { var htmlPart = multipart.OfType<TextPart>().FirstOrDefault(t => t.IsHtml); var plainPart = multipart.OfType<TextPart>().FirstOrDefault(t => !t.IsHtml); quotedHtml = htmlPart?.Text ?? string.Empty; quotedPlainText = plainPart?.Text ?? string.Empty; } // 拼接内容 builder.HtmlBody = $"{customHtml}<br><br>{quotedHtml}"; builder.TextBody = $"{customPlainText}\n{quotedPlainText}"; // 处理引用内容为空的边界情况 if (string.IsNullOrEmpty(quotedHtml) && string.IsNullOrEmpty(quotedPlainText)) { var fallbackText = ReplyVisitor.GetOnDateSenderWrote(message) + Environment.NewLine; builder.TextBody = $"{customPlainText}\n{fallbackText}"; builder.HtmlBody = $"{customHtml}<br><br>{MimeKit.Text.HtmlEncoder.Encode(fallbackText)}"; } reply.Body = builder.ToMessageBody(); return reply; }
关键说明
- 用
BodyBuilder统一管理HTML和纯文本,保证邮件在不同客户端的兼容性 - 从
visitor.Body中提取已格式化的引用内容,区分纯文本和HTML类型处理 - 自定义内容在前,引用内容通过换行/换行标签分隔后拼接
- 保留原示例的fallback逻辑,处理引用内容为空的情况
内容的提问来源于stack exchange,提问作者Stephen
相关产品推荐
相关产品推荐

