Как сохранить результаты поиска электронной почты Outlook в объект IEnumerable (C #) - PullRequest
0 голосов
/ 06 сентября 2018

Как мне сохранить / привести все результаты (Outlook.Items.Find) из следующего в объект IEnumerable? * Outlook 16.0

Outlook.MailItem emailResults = null;
emailResults = mailItems.Find($"[Categories] = 'Important'"); 

Я пытаюсь выполнить следующее безуспешно.

application = Marshal.GetActiveObject("Outlook.Application") as Outlook.Application;
nameSpace = application.GetNamespace("mapi");
inbox = nameSpace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
mailItems = inbox.Items;
IEnumerable<Outlook.MailItem> emailResults = null;

emailResults = (IEnumerable<Outlook.MailItem>)mailItems.Find($"[Categories] = 'Important'");

Я пытаюсь проявить фантазию и НЕ перебирать каждый результат. Спасибо за любой совет заранее.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Спасибо Дмитрию Стребленченко за быстрый ответ! Вот мой код с решением.

using System.Collections.Generic;
using System.Linq;
using Outlook = Microsoft.Office.Interop.Outlook;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace oMailBoard
{
    public static class GetMail
    {
        public static void SearchOutLook()
        {
            Outlook.Application application = null;
            Outlook.NameSpace nameSpace = null;
            Outlook.MAPIFolder inbox = null;
            Outlook.Items mailItems = null;
            IEnumerable<Outlook.MailItem> emails = null;

            string filter = "";
            filter = $"[Categories] = 'Important'"; //Exact match
            filter = $"@SQL=urn:schemas:httpmail:subject like '%database%'"; //Like match

            if (Process.GetProcessesByName("Outlook").Count() > 0) //Is Outlook Open?
            {
                application = Marshal.GetActiveObject("Outlook.Application") as Outlook.Application;
                nameSpace = application.GetNamespace("mapi");
                inbox = nameSpace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);
                mailItems = inbox.Items;

                //Store results into a numerable varible.
                emails = mailItems.Restrict(filter).Cast<Outlook.MailItem>(); 

                //Now I can iterate though the results. 
                foreach (Outlook.MailItem e in emails)
                {
                    Debug.WriteLine("\f");                  
                    Debug.WriteLine(e.Subject);                     
                }

                Debug.WriteLine(emails.Count());

                Marshal.ReleaseComObject(inbox);
                Marshal.ReleaseComObject(nameSpace);
                Marshal.ReleaseComObject(application);
                inbox = null;
                nameSpace = null;
                application = null;
            }
            else
            {
                Debug.WriteLine("Outlook Not Open!");
            }    
        }        
    }
}
0 голосов
/ 06 сентября 2018

Использовать Items.Restrict - возвращает перечисляемую Items коллекцию.

...