前往
大廳
主題

[C#] AddressEntry

Sadaakira_Y2 | 2023-03-05 13:03:54 | 巴幣 2 | 人氣 127

不同類型要用不同方式才能取得正確的郵件地址,再加上網路上查到的都不夠全面,麻煩的讓人生厭。


主要是靠 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 家庭版。

最後附上包好的函式。
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;
}

創作回應

更多創作