首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导航MimeKit.MimeParser

导航MimeKit.MimeParser
EN

Stack Overflow用户
提问于 2021-07-28 12:41:31
回答 1查看 222关注 0票数 1

是否可以使用MimeKit.MimeParser从mbox文件读取Mth消息的Nth附件?在我的例子中,我会将很少的消息(每个msg的几个字段,包括一个附件列表)存储到内存中的数据结构中,然后,我希望能够返回到特定的消息附件并读取它的内容。

到目前为止我尝试过的事情:

  • 记住每个读取消息的底层流位置,然后在调用_parser.ParseMessage()之前将流定位到该位置,以获取消息及其附件。
  • I还尝试使用LINQ方法获取MessageID的消息,并将流位置设置为0,然后再次调用SetStream。

以上内容不起作用。

这里有一些代码来说明我的努力:

代码语言:javascript
复制
public void SaveAttachment(Attachment att, Stream outStream)
{
     _inputStream.Seek(0, SeekOrigin.Begin);
     _parser.SetStream(_inputStream, false);
     //MimeMessage mimeMsg = _parser.Skip((int)(att.Parent as Message).Position).First();
     MimeMessage mimeMsg =_parser.SingleOrDefault(x => x.MessageId == (att.Parent as Message).EntryID);
     MimeEntity mimeAtt = mimeMsg.Attachments.ToList()[att.AttachmentIndex];
     if (mimeAtt is MessagePart)
     {
          (mimeAtt as MessagePart).Message.WriteTo(outStream);
     }
     else
     {
          (mimeAtt as MimePart).Content.DecodeTo(outStream);
     }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-28 15:16:26

是否可以使用MimeKit.MimeParser从mbox文件读取Mth消息的Nth附件?

如果您想要这样做,那么您将需要您想要的MimeEntity的精确流开始/结束偏移。

然后,您要做的是将流封装到一个MimeKit.IO.BoundStream中,并使用这些流偏移量来防止解析器偏离这些边界,并在MimeParser上设置BoundStream。

设置流时,请确保使用MimeFormat.Entity (而不是MimeFormat.Mbox),因为您只对解析单个MimeEntity (可以是包含其他MimeEntities的多部分)感兴趣。

要获得这些偏移,您需要在第一次解析mbox:http://www.mimekit.net/docs/html/Events_T_MimeKit_MimeParser.htm时订阅MimeParser的MimeEntityBegin/End事件

我希望能够返回到特定的消息附件并读取其内容。

您研究过persistent对MimeParser.SetStream()的参数吗?

这可能仍然比您想要使用的内存更多(因为它将为每个MimeEntity的内容加载所有头+跟踪流偏移),但是您可能会发现它更方便,内存使用率也足够低,可以满足您的实际需要。

当这个属性被设置为true时,它不是将每个MimePart的内容加载到RAM中,而是创建一个BoundStream来包装提供给MimeParser的流,这样当您请求这些MimeParts的内容时,它就会延迟地从磁盘加载它。

默认情况下(或在persistent = false时),MimeParser将将该内容加载到MemoryBlockStream (实际上是一个试图降低字节数组大小以提高性能的MemoryStream ),您可能知道,如果消息有较大的附件(或很多附件),该MemoryStream可以使用相当多的内存。

在使用persistent = true时,需要注意的是,如果希望能够获得解析器解析的任何MimeParts的内容,则需要保持mbox文件流打开。一旦关闭流,尝试获取任何MimeParts的内容可能会导致ObjectDisposedException。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68560597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档