Mimekit:将过滤后的Mbox结果解析为新的Mbox

时间:2015-07-22 15:41:39

标签: c# mimekit

解析Mbox后,按条件过滤消息​​,并将这些消息写入新流=>文件,生成的Mbox缺少FROM行。如果我犯了代码错误或者MimeParser函数中有错误,你能告诉我吗?

示例代码:

    using System.IO;
    using MimeKit;

    namespace mboxScan
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Grab local .mbox file
                var stream = MboxStream(@"C:\temp\user.mbox");

                // Filter logic
                string fromFilter = "it@abc.com";

                // Load every message from a Unix mbox
                var parser = new MimeParser(stream, MimeFormat.Mbox);

                // Create new stream for results
                var exportStream = new MemoryStream();

                while (!parser.IsEndOfStream)
                {
                    var message = parser.ParseMessage();
                    if (message.From.ToString().Contains(fromFilter))
                    {
                        // Write this message to exportStream 
                        message.WriteTo(exportStream);      
                    }                                                
                }

                // ** Save exportStream to new MBOX
                exportStream.Position = 0;
                using (var fileStream = File.Create(@"C:\temp\results.mbox"))
                {
                    exportStream.Seek(0, SeekOrigin.Begin);
                    exportStream.CopyTo(fileStream);
                }
            }

            static Stream MboxStream(string s)
            {
                Stream fs = File.OpenRead(s);
                return fs;
            }
        }
    }

结果以:

开头

Delivered-To:

1 个答案:

答案 0 :(得分:2)

对不起朋友 - 你在看着我实时学习;-) parser.MboxMarker是第一个" From" line并且它不是消息对象属性的一部分,因为它是Mbox格式的一个方面,而不是消息。所以考虑到这一点 - 您可以捕获该行并在message.WriteTo()函数之前将其插入到内存中:

var topLine = parser.MboxMarker;
MemoryStream mStream =
   new MemoryStream(ASCIIEncoding.Default.GetBytes(topLine));
            mStream.WriteTo(exportStream);
            mStream.Dispose();