You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 09:02:57