我有两列,标题分别为To和Cc。
我需要从Outlook中提取收件人和抄送电子邮件地址,而不是姓名到Excel文件中。
Sub ExportOutlookInfo()
Dim o As Outlook.Application
Set o = New Outlook.Application
Dim ons As Outlook.Namespace
Set ons = o.GetNamespace("MAPI")
Dim omail As Outlook.MailItem
Set omail = o.CreateItem(olMailItem)
Dim i As Long
Dim olRecip As Outlook.Recipient
Dim olRecipAddress As String
Dim SENT_FLDR As MAPIFolder
Dim Items As Outlook.Items
Set SENT_FLDR = ons.GetDefaultFolder(olFolderSentMail)
Set Items = SENT_FLDR.Items
Dim recp As Outlook.Application
For i = Items.Count To 1 Step -1
DoEvents
For Each olRecip In Items(i).Recipients
Debug.Print olRecip.Address
Next olRecip
Next i
End Sub
使用MailItem
类的Recipients
属性来获取收件人电子邮件地址。"使用Outlook收件人和收件人"集合–开发人员指南文章解释了如何处理收件人。如果你需要获得收件人的电子邮件地址,你可以使用以下通话顺序:
Recipient.AddressEntry.Address
AddressEntry
类的Address
属性返回一个表示AddressEntry
的电子邮件地址的字符串。
此外,您还可以找到AddressEntry
类的GetExchangeUser方法,如果AddressEntry属于ExchangeAddressList
对象(如全局地址列表(GAL))并对应于Exchange用户,则该方法返回表示AddressEntry的ExchangeUser对象。ExchangeUser
类提供了PrimarySmtpAddress属性,我想您正在查找该属性。阅读HowTo:将基于Exchange的电子邮件地址转换为SMTP电子邮件地址文章中有关转换电子邮件地址的更多信息。
还有另一种获取收件人SMTP地址的方法。下面的GetSMTPAddressForRecipients
方法将MailItem
作为输入参数,然后显示该邮件项目的每个收件人的SMTP地址。该方法首先检索Recipients
集合,该集合表示为邮件项目指定的一组收件人。然后,对于该Recipients
集合中的每个Recipient
,该方法获取与该Recipient
对象相对应的PropertyAccessor
对象,并使用PropertyAccessor
获取映射到收件人SMTP地址的MAPI属性https://schemas.microsoft.com/mapi/proptag/0x39FE001E
的值。
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
假设您正在访问To
和CC
属性(其中包含以;
分隔的显示名称列表,这些列表可能包含也可能不包含电子邮件地址),则需要一次提取一个地址-在MailItem.Recipients
集合中循环,然后对每个Recipient
对象检查Recipient.Type
属性(可以是olTo
、olCC
、olBCC
)。然后可以读取Recipient.Address
属性。
请注意,对于Exchange收件人(地址类型为"EX"
而不是"SMTP"
),您最终会得到EX地址。如果您总是想要SMTP地址,请使用Recipient.PropertyAccessor.GetProperty
读取PR_ADDRTYPE
(DASL名称"http://schemas.microsoft.com/mapi/proptag/0x3002001F"
)MAPI属性,检查您的地址类型是否正确。如果是";SMTP";,Recipient.Address
属性就是您所需要的。如果是";EX";,尝试读取PR_SMTP_ADDRESS
MAPI属性(DASL名称"http://schemas.microsoft.com/mapi/proptag/0x39FE001F"
)。如果它丢失了,您的最后手段将是Recipient.AddressEntry.GetExchangeUser().PrimarySmtpAddress
(价格昂贵,可能会引发错误)。