Какое значение возвращает mailItem.Recipients [i] .Address? - PullRequest
0 голосов
/ 22 апреля 2020

Согласно Microsoft mailItem.Recipients [i] .Address возвращает что-то вроде следующего:

/O=MFC2013/OU=EXCHANGE ADMINISTRATIVE GROUP (FYDIBOHF23SPDLT)/CN=RECIPIENTS/CN=B370134F8FFD4CF3A0023F27B6B61F7D-ADMINISTRATOR

Что это за значения, как и где они настроены?

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Это совершенно действительный адрес типа "EX". Если вам нужен адрес типа SMTP, вам нужно использовать Recipient.AddressEntry.GetExchangeUser().PrimarySmtpAddress (будьте готовы обрабатывать пустые значения и исключения).

Для оптимизации поиска по SMTP-адресу ваша стратегия должна быть

  1. Определить тип адреса получателя. Не раскрывается через OOM, но вы можете извлечь свойство PR_ADDRTYPE из таблицы получателей (вы можете увидеть его в OutlookSpy - нажмите кнопку IMessage, go на вкладке GetRecipientTable). Используйте имя свойства DASL ("http://schemas.microsoft.com/mapi/proptag/0x3002001F") для чтения свойства, используя Recipient.PropertyAccessor.GetProperty().

  2. Если это не что иное, как "EX", просто прочитайте свойство Recipient.Address

  3. Для типа адреса "EX" попробуйте прочитать свойство PR_SMTP_ADDRESS (имя DASL "http://schemas.microsoft.com/mapi/proptag/0x39FE001F"), используя Recipient.PropertyAccessor.GetProperty(). Если свойство отсутствует, будет сгенерировано исключение (вам нужно его обработать).

  4. Если вышеприведенный пункт 3 не удался, в качестве последнего средства попробуйте использовать Recipient.AddressEntry.GetExchangeUser().PrimarySmtpAddress. Будьте готовы обрабатывать пустые значения и исключения, например, если есть проблемы с сетевым подключением или если доступ в профиле без Exchange Server или с Exchange Server из другой организации.

0 голосов
/ 22 апреля 2020

Microsoft Exchange Server может работать с типами адресов электронной почты, такими как Exchange, SMTP, X.400, Microsoft Mail и т. Д. c. По умолчанию свойство Address объекта Mail.Recipient возвращает только адрес типа Exchange, например, такой:

/O=MFC2013/OU=EXCHANGE ADMINISTRATIVE GROUP (FYDIBOHF23SPDLT)/CN=RECIPIENTS/CN=B370134F8FFD4CF3A0023F27B6B61F7D-ADMINISTRATOR

Чтобы получить SMTP-адрес, используйте следующую последовательность вызовов:

Recipient.AddressEntry.GetExchangeUser().PrimarySmtpAddress

Теоретически, чтобы получить другие типы адресов, нам нужно найти получателя в адресной книге Outlook с помощью метода IAddrBook.ResolveName, затем достичь интерфейса IMailUser с помощью метода IAddrBook.OpenEntry и получить PR_EMS_AB_PROXY_ADDRESSES свойство.

Function ResolveDisplayNameToSMTP(sFromName)
  Dim oRecip As Outlook.Recipient
  Dim oEU As Outlook.ExchangeUser
  Dim oEDL As Outlook.ExchangeDistributionList

  Set oRecip = Application.Session.CreateRecipient(sFromName)
  oRecip.Resolve
  If oRecip.Resolved Then
    Select Case oRecip.AddressEntry.AddressEntryUserType
      Case OlAddressEntryUserType.olExchangeUserAddressEntry
        Set oEU = oRecip.AddressEntry.GetExchangeUser
        If Not (oEU Is Nothing) Then
          ResolveDisplayNameToSMTP = oEU.PrimarySmtpAddress + vbCrLf + oEU.BusinessTelephoneNumber
        End If
      Case OlAddressEntryUserType.olOutlookContactAddressEntry
        Set oEU = oRecip.AddressEntry.GetExchangeUser
        If Not (oEU Is Nothing) Then
          ResolveDisplayNameToSMTP = oEU.PrimarySmtpAddress + vbCrLf + oEU.BusinessTelephoneNumber
        End If
      Case OlAddressEntryUserType.olExchangeDistributionListAddressEntry
        Set oEDL = oRecip.AddressEntry.GetExchangeDistributionList
        If Not (oEDL Is Nothing) Then
          ResolveDisplayNameToSMTP = oEU.PrimarySmtpAddress + vbCrLf + oEU.BusinessTelephoneNumber
        End If
    End Select
  End If
End Function  ' ResolveDisplayNameToSMTP
...