不同類型要用不同方式才能取得正確的郵件地址,再加上網路上查到的都不夠全面,麻煩的讓人生厭。
主要是靠 addressEntry.AddressEntryUserType 進來辨別,像是 0-5都是 Exchange 相關,其中DistributionList (AddressEntryUserType == 1) 是團隊,和 ExchangeUser 的抓法不同。
但有趣的是 Microsoft Viva Insights 的郵件寄送信箱 viva-noreply@microsoft.com 卻是 SMTP 類 (AddressEntryUserType == 30) 的,所以想偷懶用 @ 後面的字串來判斷是行不通的,下圖為 Costco 廣告信箱和 viva 的內容。
最後是同郵件地址也同 AddressEntryUserType,但在 Type 上出現兩種可能,或許是差在身分(如:收/寄件人或副本人員)吧,難怪用 Type == "Ex" 這招沒用。
[註] 圖中帳號為個人申請 Outlook 帳號,不屬於任何組織但有購買 O365 家庭版。
[註] 圖中帳號為個人申請 Outlook 帳號,不屬於任何組織但有購買 O365 家庭版。
最後附上包好的函式。
public static string GetMailAddress(AddressEntry addressEntry)
{
string sEmail = addressEntry.Address;
switch (addressEntry.AddressEntryUserType)
{
case OlAddressEntryUserType.olExchangeUserAddressEntry:
// (0) An Exchange user that belongs to the same Exchange forest.
sEmail = addressEntry.GetExchangeUser().PrimarySmtpAddress;
break;
case OlAddressEntryUserType.olExchangeDistributionListAddressEntry:
// (1) An address entry that is an Exchange distribution list.
sEmail = addressEntry.GetExchangeDistributionList().PrimarySmtpAddress;
break;
case OlAddressEntryUserType.olExchangePublicFolderAddressEntry:
// (2) An address entry that is an Exchange public folder.
sEmail = addressEntry.Address;
break;
case OlAddressEntryUserType.olExchangeAgentAddressEntry:
// (3) An address entry that is an Exchange agent.
sEmail = addressEntry.Address;
break;
case OlAddressEntryUserType.olExchangeOrganizationAddressEntry:
// (4) An address entry that is an Exchange organization
sEmail = addressEntry.Address;
break;
case OlAddressEntryUserType.olExchangeRemoteUserAddressEntry:
// (5) An Exchange user that belongs to a different Exchange forest.
sEmail = addressEntry.Address;
break;
case OlAddressEntryUserType.olOutlookContactAddressEntry:
// (10) An address entry in an Outlook Contacts folder.
sEmail = addressEntry.Address;
break;
case OlAddressEntryUserType.olOutlookDistributionListAddressEntry:
// (11) An address entry that is an Outlook distribution list.
sEmail = addressEntry.Address;
break;
case OlAddressEntryUserType.olLdapAddressEntry:
// (20) An address entry that uses the Lightweight Directory Access Protocol (LDAP).
sEmail = addressEntry.GetExchangeUser().PrimarySmtpAddress;
break;
case OlAddressEntryUserType.olSmtpAddressEntry:
// (30) An address entry that uses the Simple Mail Transfer Protocol (SMTP).
sEmail = (addressEntry.Type == "EX")? addressEntry.Name: addressEntry.Address;
break;
case OlAddressEntryUserType.olOtherAddressEntry:
// (40) A custom or some other type of address entry such as FAX.
sEmail = addressEntry.Address;
break;
}
return sEmail;
}