pythonpython-3.xoutlookgal

How can I search the Outlook (2010) Global Address List for multiple names?


I've read this post How can I search the Outlook (2010) Global Address List for a name? and found a working solution for getting a name from Outlook GAL.

I have 3 questions:

  1. I can get the contact if the search_string is an email address. When it's a name, the search doesn't work. It would return False for resolved, but True for sendable. Then I get error when using ae object. What am I doing wrong?

  2. I don't understand the code enough to modify it for searching multiple names. I simply created a for loop but maybe there is a more efficient way? For example, can I reuse the outlook.Session object between different searches?

  3. Is the line recipient.Resolve() necessary?

Thanks in advance!

My attempt is below.

from __future__ import print_function
import win32com.client

search_strings = ['Doe John', 'Doe Jane']

outlook = win32com.client.gencache.EnsureDispatch('Outlook.Application')

for search_string in search_strings:
    recipient = outlook.Session.CreateRecipient(search_string)
    recipient.Resolve()
    print('Resolved OK: ', recipient.Resolved)
    print('Is it a sendable? (address): ', recipient.Sendable)
    print('Name: ', recipient.Name)

    ae = recipient.AddressEntry
    email_address = None

    if 'EX' == ae.Type:
        eu = ae.GetExchangeUser()
        email_address = eu.PrimarySmtpAddress

    if 'SMTP' == ae.Type:
        email_address = ae.Address

    print('Email address: ', email_address)

Solution

  • Can't believe I found the solution so quickly after posting the question. Since it's hard to find the answer. I'm sharing my findings here.

    It's inspired by How to fetch exact match of addressEntry object from GAL (Global Address List), though it's in c# rather than python.

    This method uses exact match of displayname rather than relying on outlook to resolve the name. Though, it's possible to loop through the global address list and do partial match yourself.

    import win32com.client
    
    search_string = 'Doe John'
    
    outlook = win32com.client.gencache.EnsureDispatch('Outlook.Application')
    gal = outlook.Session.GetGlobalAddressList()
    entries = gal.AddressEntries
    ae = entries[search_string]
    email_address = None
    
    if 'EX' == ae.Type:
        eu = ae.GetExchangeUser()
        email_address = eu.PrimarySmtpAddress
    
    if 'SMTP' == ae.Type:
        email_address = ae.Address
    
    print('Email address: ', email_address)