#vba #email #outlook #outlook-2010
#vba #Адрес электронной почты #outlook #outlook-2010
Вопрос:
Я хочу получить доступ к заголовкам электронной почты в Outlook 2010. Я использую приведенный ниже код, но, к сожалению, результат содержит только первые 252 символа заголовка. Любое предложение о том, что я делаю неправильно?
Dim strHeader As String
strHeader = GetInetHeaders(olItem)
MsgBox "Truncated string: " amp; strHeader
и
Function GetInetHeaders(olkMsg As Outlook.MailItem) As String
' Purpose: Returns the internet headers of a message.'
' Written: 4/28/2009'
' Author: BlueDevilFan'
' Outlook: 2007'
Const PR_TRANSPORT_MESSAGE_HEADERS = "http://schemas.microsoft.com/mapi/proptag/0x007D001E"
Dim olkPA As Outlook.PropertyAccessor
Set olkPA = olkMsg.PropertyAccessor
GetInetHeaders = olkPA.GetProperty(PR_TRANSPORT_MESSAGE_HEADERS)
Set olkPA = Nothing
End Function
Ответ №1:
Msgbox не является хорошим методом доказательства усечения. Текст может быть законно усечен.
Текст в почтовом элементе не выглядит усеченным. По крайней мере, я не замечаю обрезанной информации.
Private Sub Test_GetInetHeaders()
Dim olNewmail As mailItem
Dim strHeader As String
Dim olItem As mailItem
Set olItem = ActiveInspector.currentItem
strHeader = GetInetHeaders(olItem)
Set olNewmail = CreateItem(olMailItem)
olNewmail.body = strHeader
olNewmail.Display
MsgBox "Truncated string if limit exceeded: " amp; strHeader
ExitRoutine:
Set olItem = Nothing
Set olNewmail = Nothing
End Sub
Function GetInetHeaders(olkMsg As outlook.mailItem) As String
' Purpose: Returns the internet headers of a message.'
' Written: 4/28/2009'
' Author: BlueDevilFan'
' Outlook: 2007'
Const PR_TRANSPORT_MESSAGE_HEADERS = "http://schemas.microsoft.com/mapi/proptag/0x007D001E"
Dim olkPA As outlook.propertyAccessor
Set olkPA = olkMsg.propertyAccessor
GetInetHeaders = olkPA.GetProperty(PR_TRANSPORT_MESSAGE_HEADERS)
Set olkPA = Nothing
End Function
Комментарии:
1. Скопировано из сообщения ответа в ожидании удаления «Я использовал функцию отладки, которая связывает переменные с 252 символами. Использование метода, описанного @niton, показало, что функция хорошо работает в Outlook 2010» Jofre
Ответ №2:
Класс PropertyAccessor имеет некоторые ограничения. Одна из них заключается в том, что строковые свойства ограничены по размеру в зависимости от типа хранилища информации. Для чтения свойств без ограничений, введенных ООМ, необходимо использовать MAPI с расширением API низкого уровня. Метод OpenProperty IMAPIProp
интерфейса возвращает указатель на интерфейс, который можно использовать для доступа к свойству. Вот что говорится в библиотеке MSDN:
Метод IMAPIProp::OpenProperty предоставляет доступ к свойству через определенный интерфейс. OpenProperty является альтернативой методам IMAPIProp ::GetProps и IMAPIProp ::setProps. При сбое GetProps или setProps из-за слишком большого или слишком сложного свойства вызовите OpenProperty .
Или вы можете рассмотреть возможность использования сторонней оболочки для расширенного MAPI (например, Redemption).
Комментарии:
1. Насколько я понимаю, для расширенного MAPI требуется CDO, который недоступен в Outlook 2010. Отправленный вами пример написан на C и хотел бы использовать VBA, если это возможно.
2. Расширенный MAPI — это собственный API, используемый Outlook. Для его использования вам потребуется использовать C или Delphi. CDO 1.21 — это оболочка расширенного MAPI, которую можно использовать с любого языка, включая VBA. Корпорация Майкрософт больше не поддерживает и не распространяет CDO 1.21. Redemption аналогичен CDO 1.21 (с гораздо большей функциональностью) и может использоваться с любого языка.