是否可以使用MimeKit.MimeParser从mbox文件读取Mth消息的Nth附件?在我的例子中,我会将很少的消息(每个msg的几个字段,包括一个附件列表)存储到内存中的数据结构中,然后,我希望能够返回到特定的消息附件并读取它的内容。
到目前为止我尝试过的事情:
以上内容不起作用。
这里有一些代码来说明我的努力:
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);
}
}发布于 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。
https://stackoverflow.com/questions/68560597
复制相似问题