Усеченные заголовки электронной почты Outlook, полученные с помощью VBA

#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 (с гораздо большей функциональностью) и может использоваться с любого языка.