Как извлечь адреса электронной почты из поля "кому" в outlook?

Я в какой-то степени использую VBA, используя этот код:

Sub ExtractEmail()
Dim OlApp As Outlook.Application
Dim Mailobject As Object
Dim Email As String
Dim NS As NameSpace
Dim Folder As MAPIFolder
Set OlApp = CreateObject("Outlook.Application")
' Setup Namespace
Set NS = ThisOutlookSession.Session
' Display select folder dialog
Set Folder = NS.PickFolder
' Create Text File
Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile("c:mydocumentsemailss.txt", True)
' loop to read email address from mail items.
For Each Mailobject In Folder.Items
   Email = Mailobject.To
   a.WriteLine (Email)
Next
Set OlApp = Nothing
Set Mailobject = Nothing
a.Close
End Sub

однако это дает результат в виде имен адресов электронной почты, а не фактического адреса электронной почты с "something@this.domain".

есть ли атрибут mailobject, который позволит адреса электронной почты, а не имена, которые будут записаны из 'To' текстовое поле.

спасибо

2 ответов


Проверьте объект коллекции получателей для вашего почтового элемента, который должен позволить вам получить адрес:http://msdn.microsoft.com/en-us/library/office/ff868695.aspx


обновление 8/10/2017

оглядываясь на этот ответ, я понял, что сделал плохую вещь, только связав где-то и не предоставив немного больше информации.

вот фрагмент кода из этой ссылки MSDN выше, показывающий, как объект Recipients может быть используется для получения адреса электронной почты (фрагмент кода):

Sub GetSMTPAddressForRecipients(mail As Outlook.MailItem) 
    Dim recips As Outlook.Recipients 
    Dim recip As Outlook.Recipient 
    Dim pa As Outlook.PropertyAccessor 
    Const PR_SMTP_ADDRESS As String = _ 
        "http://schemas.microsoft.com/mapi/proptag/0x39FE001E" 
    Set recips = mail.Recipients 
    For Each recip In recips 
        Set pa = recip.PropertyAccessor 
        Debug.Print recip.name &; " SMTP=" _ 
           &; pa.GetProperty(PR_SMTP_ADDRESS) 
    Next 
End Sub 

похоже, для адресов электронной почты за пределами вашей организации, SMTP-Адрес скрыт в emailObject.Recipients(i).Address, хотя это, похоже, не позволяет вам различать/CC/BCC.

код Microsoft дал мне ошибку, и некоторые исследования показывают, что страница схемы больше не доступна. Мне нужен был список адресов электронной почты с запятой, которые были либо в моей организации Exchange, либо за ее пределами. Объединение его с другим ответом S / O для преобразования внутренней компании отображаемые имена электронной почты для имен SMTP, это делает трюк.

Function getRecepientEmailAddress(eml As Variant)
    Set out = CreateObject("System.Collections.Arraylist") ' a JavaScript-y array

    For Each emlAddr In eml.Recipients
        If Left(emlAddr.Address, 1) = "/" Then
            ' it's an Exchange email address... resolve it to an SMTP email address
            out.Add ResolveDisplayNameToSMTP(emlAddr)
        Else
            out.Add emlAddr.Address
        End If
    Next
    getRecepientEmailAddres = Join(out.ToArray(), ";")
End Function

Если письмо находится внутри вашей организации, вам необходимо преобразовать его в адрес электронной почты SMTP. Я нашел эту функцию из еще один ответ StackOverflow полезная:

Function ResolveDisplayNameToSMTP(sFromName) As String
    ' takes a Display Name (i.e. "James Smith") and turns it into an email address (james.smith@myco.com)
    ' necessary because the Outlook address is a long, convoluted string when the email is going to someone in the organization. 
    ' source:  https://stackoverflow.com/questions/31161726/creating-a-check-names-button-in-excel

    Dim OLApp As Object 'Outlook.Application
    Dim oRecip As Object 'Outlook.Recipient
    Dim oEU As Object 'Outlook.ExchangeUser
    Dim oEDL As Object 'Outlook.ExchangeDistributionList

    Set OLApp = CreateObject("Outlook.Application")
    Set oRecip = OLApp.Session.CreateRecipient(sFromName)
    oRecip.Resolve
    If oRecip.Resolved Then
        Select Case oRecip.AddressEntry.AddressEntryUserType
            Case 0, 5 'olExchangeUserAddressEntry & olExchangeRemoteUserAddressEntry
                Set oEU = oRecip.AddressEntry.GetExchangeUser
                If Not (oEU Is Nothing) Then
                    ResolveDisplayNameToSMTP = oEU.PrimarySmtpAddress
                End If
            Case 10, 30 'olOutlookContactAddressEntry & 'olSmtpAddressEntry
                    ResolveDisplayNameToSMTP = oRecip.AddressEntry.Address
        End Select
    End If
End Function