高效的FETCH查询和解析结果

时间:2014-03-06 19:40:25

标签: c# imap mailsystem.net

我想要使用MailSystem.NET来读取所有邮件(我想是草稿中的内容除外)并提取UUID,日期,发件人,所有收件人电子邮件。

我想让它从最近开始并继续向后扫描,一次加载可能100个标题的批次。

如果在此操作期间有新电子邮件进入,我不希望消息索引更改影响进度。

我想就此提出一些建议。在我看来,Fetch()包装器处理单个消息,并且收件箱搜索功能提供消息索引序数而不是UID。我相信UID对并发活动会更强大。

我可以调用imap.Command(“fetch 1:100(uid rfc822.header)”),但后来我不知道如何使用MailSystem.NET来解析结果。

另外,有没有办法说“获取UID小于上次看到的UID的下100条消息”?如果可以安全地假设UID总是随着后来的消息而增加。我的意思是这是一个基于消息索引序号的替代方法。

谢谢!

1 个答案:

答案 0 :(得分:0)

我无法使用MailSystem.NET回答您的问题,但我可以使用更好的C#IMAP库来回答这个问题:MailKit

using System;

using MailKit.Net.Imap;
using MailKit;
using MimeKit;

namespace TestClient {
    class Program
    {
        public static void Main (string[] args)
        {
            using (var client = new ImapClient ()) {
                client.Connect ("imap.friends.com", 993, true);

                // Note: since we don't have an OAuth2 token, disable
                // the XOAUTH2 authentication mechanism.
                client.AuthenticationMechanisms.Remove ("XOAUTH");

                client.Authenticate ("joey", "password");

                // The Inbox folder is always available on all IMAP servers...
                client.Inbox.Open (FolderAccess.ReadOnly);

                // Note: The envelope contains the date and all of the email addresses
                var items = MessageSummaryItems.UniqueId | MessageSummaryItems.Envelope;
                int upper = client.Inbox.Count - 1;
                int lower = Math.Max (upper - 100, 0);

                while (lower <= upper) {
                    foreach (var message in client.Inbox.Fetch (lower, upper, items)) {
                        Console.WriteLine ("Sender: {0}", message.Envelope.Sender);
                        Console.WriteLine ("From: {0}", message.Envelope.From);
                        Console.WriteLine ("To: {0}", message.Envelope.To);
                        Console.WriteLine ("Cc: {0}", message.Envelope.Cc);
                        if (message.Envelope.Date.HasValue)
                            Console.WriteLine ("Date: {0}", message.Envelope.Date.Value);
                    }

                    upper = lower - 1;
                    lower = Math.Max (upper - 100, 0);
                }

                client.Disconnect (true);
            }
        }
    }
}