限制从收件箱中提取的电子邮件数量

时间:2016-05-05 20:27:22

标签: c# outlook

我正在使用Microsoft.Office.Interop.Outlook并填充一个集合。我目前正在处理的收件箱中有超过10k的电子邮件。我有办法限制提取的电子邮件数量或缩小搜索范围吗?

public void InitializeInbox()
{
    Outlook.Application app = new Outlook.Application();
    Outlook.NameSpace outlookNs = app.GetNamespace("MAPI");
    inboxFolder = outlookNs.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
    outlookNs.SendAndReceive(true);
    foreach (object _obj in inboxFolder.Items)
    {
        if (_obj is Outlook.MailItem)
        {
            receivedEmail.Add((Outlook.MailItem) _obj);
        }
   }

    ConcurrentBag<EmailDTO> concurrentEmails = new ConcurrentBag<EmailDTO>();

    Parallel.ForEach(
        receivedEmail, mail =>
        {
            mail.ReplyAll();
            concurrentEmails.Add(
            new EmailDTO
            {
                Subject = mail.Subject,
                Sender  = mail.SenderName,
                Body    = mail.HTMLBody,
                Date    = mail.SentOn.Date
            });
        });

    Inbox = new BindableCollection<EmailDTO>(concurrentEmails.OrderByDescending(x => x.Date));
}

因此,我希望能够设置限制,而不是搜索inboxFolder.Items。例如inboxFolder.Items.Where(x => x.Date >= DateTime.Now.AddYear(-1)

我可以使用限制来限制,但我只是遇到限制未读电子邮件。

inbox.Items.Restrict("[Unread]=true");

我已经想出如何按日期限制,现在我如何限制条目数量?

按日期限制

inboxFolder.Items.Restrict("[ReceivedTime] > '" + DateTime.Now.AddYears(-1).ToString("MM/dd/yyyy HH:mm") + "'")

排序的显式限制。

List<Outlook.MailItem> receivedEmail = new List<Outlook.MailItem>();
const int limit = 200;

Outlook._Items items = inboxFolder.Items.Restrict("[ReceivedTime] >= '" + DateTime.Now.AddYears(-1).ToString("MM/dd/yyyy HH:mm") + "'");
items.Sort("[ReceivedTime]");
object item = items.GetNext();
int i = 1;
do
{
    // not every item is a mail item
    if (item is Outlook.MailItem)
    {
        receivedEmail.Add((Outlook.MailItem)item);
    }


    item = items.GetNext();
    i++;
} while (null != item && i < limit);

1 个答案:

答案 0 :(得分:2)

使用OOM时不要使用LINQ,如果没有限制,请使用显式的“for”循环。更好的是,使用MAPIFolder.GetTable

您使用的限制是什么?有限制吗?你为什么叫ReolyAll?