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

使用MailKit在C#中提取排除邮件链的纯文本邮件正文

提取MailKit中排除邮件链的纯文本正文

核心解决步骤

  1. 优先获取邮件的纯文本正文(替代HTML版本)
  2. 通过识别邮件链的通用分隔符,截断并保留原始内容部分

实现代码

修改现有逻辑,在获取邮件对象后添加纯文本提取与邮件链过滤:

List<MimeMessage> mimeMessages = new();
List<string> cleanPlainTextBodies = new(); // 存储处理后的纯文本,用于存入数据库

ImapClient imapClient = new();
imapClient.Connect(mailSettings.ImapServer, mailSettings.ImapPort, MailKit.Security.SecureSocketOptions.SslOnConnect);
var password = _encryptHelpers.DecryptString(mailSettings.Password);
imapClient.Authenticate(mailSettings.Email, password);
imapClient.Inbox.Open(FolderAccess.ReadOnly);

var uids = imapClient.Inbox.Search(SearchQuery.DeliveredAfter(lastChecked));
var messages = imapClient.Inbox.Fetch(uids, MessageSummaryItems.UniqueId | MessageSummaryItems.Body | MessageSummaryItems.BodyStructure);

foreach (var message in messages)
{
    var mailMessage = imapClient.Inbox.GetMessage(message.UniqueId);
    mimeMessages.Add(mailMessage);

    string plainText = string.Empty;
    // 优先提取原生纯文本正文
    if (mailMessage.Body is TextPart textPart && textPart.TextFormat == TextFormat.Plain)
    {
        plainText = textPart.Text;
    }
    // 无纯文本时,将HTML转换为纯文本
    else if (!string.IsNullOrEmpty(mailMessage.HtmlBody))
    {
        var converter = new HtmlToTextConverter();
        plainText = converter.Convert(mailMessage.HtmlBody);
    }

    if (!string.IsNullOrEmpty(plainText))
    {
        // 过滤邮件链,常见分隔符可根据实际场景扩展
        string[] chainSeparators = {
            "-----Original Message-----",
            "---原始邮件---",
            "---------------------- Forwarded by ----------------------"
        };

        foreach (var separator in chainSeparators)
        {
            int splitIndex = plainText.IndexOf(separator, StringComparison.OrdinalIgnoreCase);
            if (splitIndex != -1)
            {
                plainText = plainText.Substring(0, splitIndex).Trim();
                break;
            }
        }

        // 此时plainText即为排除邮件链的纯文本内容,可直接存入数据库
        cleanPlainTextBodies.Add(plainText);
    }
}

imapClient.Disconnect(true);

return mimeMessages;

补充说明

  • 邮件链分隔符可能因邮件客户端、语言差异有所不同,可根据业务场景补充分隔符数组
  • 若需处理编码异常,可在提取文本时指定编码格式(如textPart.GetText(Encoding.UTF8))

内容的提问来源于stack exchange,提问作者Liam Kenny

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:27:22