Быстрый поиск в списке адресов Outlook - PullRequest
0 голосов
/ 27 августа 2018

Я хочу найти огромный список адресов в Outlook для AddressEntry по адресу электронной почты. Поиск по имени не проблема, так как вы можете написать:

Microsoft.Office.Interop.Outlook.AddressEntry = AddressEntries[Name];

Но я хочу найти запись по ее электронной почте. Этот код работает, но очень медленно:

    public static string GetUserDataByEmailAddress(string EmailAddress)
    {
        Microsoft.Office.Interop.Outlook.Application OLApp = null;
        bool OutlookWasRunning = false;
        string UserName = string.Empty;

        if (System.Diagnostics.Process.GetProcessesByName("OUTLOOK").Count() > 0)
        {
            OLApp = System.Runtime.InteropServices.Marshal.GetActiveObject("Outlook.Application") as Microsoft.Office.Interop.Outlook.Application;
            OutlookWasRunning = true;
        }
        else
        {
            OLApp = new Microsoft.Office.Interop.Outlook.Application();
            Microsoft.Office.Interop.Outlook.NameSpace nameSpace = OLApp.GetNamespace("MAPI");
            nameSpace.Logon("", "", System.Reflection.Missing.Value, System.Reflection.Missing.Value);
            nameSpace = null;
            OutlookWasRunning = false;
        }

        Microsoft.Office.Interop.Outlook.AddressLists GALs = null;
        GALs = OLApp.Session.AddressLists;
        if (GALs == null) { throw new System.Exception("ERROR: Unable to get address book collection from MS Outlook!"); }

        Microsoft.Office.Interop.Outlook.AddressList gal = null;
        gal = GALs["Globale Adressliste"];
        if (gal == null) { throw new System.Exception("ERROR: Unable to get address book 'Global Address List' from MS Outlook!"); }

        foreach (Microsoft.Office.Interop.Outlook.AddressEntry ent in gal.AddressEntries)
        {
            if(ent.Address == EmailAddress) { UserName = ent.Name; }
        }

        if (!OutlookWasRunning) { OLApp.Quit(); }

        return UserName;
    }

Хорошо, но этот способ работает очень медленно. Теперь я попытался использовать AddressEntries как IEnumeratable для этого:

var output = from a in gal.AddressEntries.AsQueryable() where (a as Microsoft.Office.Interop.Outlook.AddressEntry).Address == EmailAddress select a;

При этом я получаю сообщение об ошибке:

Severity Code Description Project File Line Suppression State Error CS1936 Could not find an implementation of the query pattern for source type 'IQueryable'. 'Where' not found.

Кто-нибудь знает быстрый способ поиска правильного AddressEntry?

С уважением, Jan

1 Ответ

0 голосов
/ 27 августа 2018

Не просматривайте все элементы в контейнере - некоторые контейнеры могут содержать десятки тысяч записей или более.

Вы можете использовать Namespace.CreateRecipient / Recipient.Resolve в OOM - это разрешит имя (или адрес) для всех контейнеров. Это эквивалентно вводу имени в поле «Редактировать» в Outlook и нажатию Ctrl + K.

Если вы хотите разрешить конкретный контейнер (например, контейнер GAL «Все пользователи»), вам необходимо использовать Extended MAPI (только C ++ или Delphi). Вы можете использовать Redemption (любой язык) - он предоставляет RDOSession . AddressBook . ResolveName / ResolveNameEx и RDOAddresList . ResolveName / ResolveNameEx.

Имейте в виду, что разрешение для определенного контейнера (разрешение PR_ANR в MAPI) может не работать при использовании адреса SMTP (ограничение GAL).

...