Search code examples
c#vstooutlook-addinoutlook-2010mapi

How to get the sender e-mail address associated by the folder item? (vsto / outlook 2010 / mapi)


I have in my Outlook 2010-Add-In (c#) many folders. They are in my private post box or in one of my shared post boxes.

Now I am looking for a solution to find out, how to get the right email address (sender / recipient) associated with a dedicated folder. It could be any folder from my private or anyone of my shared post boxes.

I think, maybe I could use the EntryId / StoreId from the folder item to identify the corresponding email address.

I know already, that I could get the email address from any mail item but I'm not looking for this solution.


Solution

  • I like to answer my own questions: I think that I've found a plausible solution.

    I do not treat any exceptions inside the function, I do that from outside.

    private string GetSMTPAddressByFolderItem(Outlook.MAPIFolder mapiFolder)
        {
    
            string PR_MAILBOX_OWNER_ENTRYID = @"http://schemas.microsoft.com/mapi/proptag/0x661B0102";
            string PR_SMTP_ADDRESS = @"http://schemas.microsoft.com/mapi/proptag/0x39FE001E";
    
            Outlook.Store store = null;
            Outlook.NameSpace ns = null;
            Outlook.AddressEntry sender = null;
            Outlook._ExchangeUser exchUser = null;
    
            try
            {
                if (mapiFolder == null)
                {
                    return null;
                }
    
                // Get the parent store.
                store = mapiFolder.Store;
    
                string storeOwnerEntryId = store.PropertyAccessor.BinaryToString(store.PropertyAccessor.GetProperty(PR_MAILBOX_OWNER_ENTRYID)) as string;
                ns = Application.GetNamespace(Constants.OL_NAMESPACE); // i.e. "MAPI"
    
                sender = ns.GetAddressEntryFromID(storeOwnerEntryId);
    
                if (sender != null)
                {
                    if (sender.AddressEntryUserType == Outlook.OlAddressEntryUserType.olExchangeUserAddressEntry ||
                        sender.AddressEntryUserType == Outlook.OlAddressEntryUserType.olExchangeRemoteUserAddressEntry)
                    {
                        exchUser = sender.GetExchangeUser();
    
                        if (exchUser != null)
                        {
                            return exchUser.PrimarySmtpAddress;
                        }
                        else
                        {
                            return null;
                        }
                    }
                    else
                    {
                        return sender.PropertyAccessor.GetProperty(PR_SMTP_ADDRESS) as string;
                    }
                }
    
                return null;
            }
            finally
            {
                if (ns != null)
                {
                    Marshal.ReleaseComObject(ns);
                    ns = null;
                }
                if (store != null)
                {
                    Marshal.ReleaseComObject(store);
                    store = null;
                }
                if (sender != null)
                {
                    Marshal.ReleaseComObject(sender);
                    sender = null;
                }
                if (exchUser != null)
                {
                    Marshal.ReleaseComObject(exchUser);
                    exchUser = null;
                }
            }
        }