使用MailKit在C#中提取排除邮件链的纯文本邮件正文
提取MailKit中排除邮件链的纯文本正文
核心解决步骤
- 优先获取邮件的纯文本正文(替代HTML版本)
- 通过识别邮件链的通用分隔符,截断并保留原始内容部分
实现代码
修改现有逻辑,在获取邮件对象后添加纯文本提取与邮件链过滤:
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
相关产品推荐
相关产品推荐

