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

如何将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等属性处理附件
    }
}

关键说明

  1. 类型匹配原理:MimeEntity是所有MIME实体的基类,message/rfc822类型的实体对应MimeKit中的MessagePart子类,基类不会暴露子类特有的Message属性,因此调试时能看到实例的实际属性,但代码中直接用MimeEntity无法访问。
  2. 安全转换方式:
    • 优先用OfType<MessagePart>()直接筛选目标类型,避免手动判断ContentType可能出现的错误。
    • 如果需要保留原有的ContentType判断逻辑,可结合类型检查转换:
      if (envelopeMessage is MessagePart messagePart)
      {
          MimeMessage embeddedMsg = messagePart.Message;
          // 后续处理
      }
      

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:01:26