如何将MimeEntity(message/rfc822)转换为MimeKit的MimeMessage?
解决MimeEntity转MimeMessage访问内嵌邮件内容的问题
当你找到的MimeEntity是message/rfc822类型时,它的实际类型是MessagePart(MimeEntity的子类),只有转换为这个具体类型,才能访问Message属性获取内嵌的MimeMessage。
修改后的代码示例
var message = await MimeMessage.Load(@"C:\temp\MimeKitTesting\sample.eml"); // 直接筛选并转换为MessagePart类型,比判断ContentType更精准 MessagePart? envelopeMessage = message.BodyParts.OfType<MessagePart>().FirstOrDefault(); if (envelopeMessage != null) { // 获取内嵌的完整MimeMessage MimeMessage embeddedMessage = envelopeMessage.Message; // 读取发件人、收件人、主题等核心信息 var sender = embeddedMessage.From; var recipients = embeddedMessage.To; var subject = embeddedMessage.Subject; // 处理正文 if (embeddedMessage.Body is TextPart textBody) { string content = textBody.Text; // 正文逻辑处理 } // 遍历处理附件 foreach (var attachment in embeddedMessage.Attachments) { // 可通过attachment.ContentType、attachment.FileName等属性处理附件 } }
关键说明
- 类型匹配原理:MimeEntity是所有MIME实体的基类,
message/rfc822类型的实体对应MimeKit中的MessagePart子类,基类不会暴露子类特有的Message属性,因此调试时能看到实例的实际属性,但代码中直接用MimeEntity无法访问。 - 安全转换方式:
- 优先用
OfType<MessagePart>()直接筛选目标类型,避免手动判断ContentType可能出现的错误。 - 如果需要保留原有的ContentType判断逻辑,可结合类型检查转换:
if (envelopeMessage is MessagePart messagePart) { MimeMessage embeddedMsg = messagePart.Message; // 后续处理 }
- 优先用
内容的提问来源于stack exchange,提问作者TheLegendaryCopyCoder
相关产品推荐
相关产品推荐

