我正在使用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);
答案 0 :(得分:2)
使用OOM时不要使用LINQ,如果没有限制,请使用显式的“for”循环。更好的是,使用MAPIFolder.GetTable。
您使用的限制是什么?有限制吗?你为什么叫ReolyAll?