使用 mimekit.mimemessage 从硬盘加载 eml 文件 我怎样才能只加载文本?

Using mimekit.mimemessage to load eml files from hard disk how can I load only text?

这就是我今天使用它的方式

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    int counter = 0;
    MimekitallLoadedMessages = new List<MimeKit.MimeMessage>();
    MimeKit.MimeMessage loadedMessage = null;
    DirectoryInfo di = new DirectoryInfo(emailsDirectory);
    FileInfo[] files = di.GetFiles();
    for (int i = 0; i < files.Length; i++)
    {
        string uid = seenUids[0];
        loadedMessage = MimeKit.MimeMessage.Load(files[i].FullName);
        MimekitallLoadedMessages.Add(loadedMessage);
        downloaded.Add(seenUids[i]);
        counter += 1;
        int nProgress = counter * 100 / files.Length;
        backgroundWorker2.ReportProgress(nProgress);
    }
}

Load 方法只加载整条消息。 但是我想知道我是否可以加载每条消息的主题,例如将其添加到 listView 中,这样用户以后就可以 select 一个特定的电子邮件来加载它的所有内容,例如 [=31] =] 或全文内容。

因此仅加载主题并在 listView 中列出所有电子邮件将更快地加载邮件。我的硬盘上有 6000 个 eml 文件。

加载所有文件并将所有消息添加到 listView 可能需要一些时间。相反,也许 loading/parsing 只有文本可能更快?

可能吗?和逻辑?也许当我第一次下载邮件时,我应该创建一个包含每封电子邮件所有主题的文本文件,然后当 运行 我的程序只是从文本文件中读取行时,每一行都是一个主题?

更新

现在是 dowork 活动:

private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
        {
            MimeKit.HeaderList loaded = new MimeKit.HeaderList();
            int counter = 0;
            MimekitallLoadedMessages = new List<MimeKit.MimeMessage>();
            MimeKit.MimeMessage loadedMessage = null;
            DirectoryInfo di = new DirectoryInfo(emailsDirectory);
            FileInfo[] files = di.GetFiles();
            for (int i = 0; i < files.Length; i++)
            {
                string uid = seenUids[0];
                loaded = MimeKit.HeaderList.Load(files[i].FullName);
                var subject = loaded[MimeKit.HeaderId.Subject];
                downloaded.Add(seenUids[i]);
                counter += 1;
                int nProgress = counter * 100 / files.Length;
                backgroundWorker2.ReportProgress(nProgress, subject);
            }
         }

以及我如何更新 listView 控件的 progresschanged 事件:

private void backgroundWorker2_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            pbt1.Value = e.ProgressPercentage;
            pbt1.Text = e.ProgressPercentage.ToString() + "%";
            pbt1.Invalidate();
            if (e.UserState != null)
            {

                ListViewCostumControl.lvnf.Items.Add(new ListViewItem(new string[]
            {
                e.UserState.ToString()
            }));
            }
         }

您可以通过 HeaderList.Load 解析 headers。这将比解析整个消息更快。这是一个例子:

string filename = ...

var headerList = HeaderList.Load(filename);

var subject = headerList[HeaderId.Subject];