2016-05-05 4 views
1

私はMicrosoft.Office.Interop.Outlookを利用してコレクションを設定しています。私が現在扱っている受信箱には1万件を超えるメールがあります。私が検索した電子メールの数を制限する方法はありますか?受信トレイからプルされたメールの数を制限します。

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)

私はRestrictを使用して制限できますが、私は未読メールを制限するだけでした。

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); 

答えて

2

OOMで作業するときはLINQを使用しないでください。制限がない場合は明示的な "for"ループを使用してください。さらに良い方法はMAPIFolder.GetTableです。

使用している制限は何ですか?制限はありますか?なぜあなたはReolyAllに電話しますか?

+0

こんにちは@ドミトリー、私は正常に昨年以内にトップ200の電子メールを照会することができましたが、私はそれが欲しいものではありませんかなりオーダーではなく、どのようにそれを行う上の任意のアイデアですか? – Master

+0

まずItems.Sortを呼び出す必要があります。 Itemsオブジェクトを複数のドット表記を使用する代わりに、明示的な変数に格納するようにしてください(毎回まったく新しいCOMオブジェクトを提供します)。 –

+0

こんにちは@Dmitry、私はコードを更新しました。私はどこが間違っているのか完全にはわからない。私はその並べ替えを設定した。最新のトップ200に問い合わせることができれば、受信時間の制限を取り除くことができます。 – Master

関連する問題