Доступ к "тексту" электронного письма Outlook из Excel VBA - PullRequest
0 голосов
/ 16 июня 2020

Следующий код перестал работать после обновления с Office 2010 на W7 до Office 365 на W10.

Sub readbodytest()

    Dim OL As Outlook.Application
    Dim DIB As Outlook.Folder
    Dim i As Object 'Outlook.ReportItem
    Dim Filter As String

    Set OL = CreateObject("Outlook.Application")
    Set DIB = OL.Session.GetDefaultFolder(olFolderInbox)

    Const PR_SENT_REPRESENTING_EMAIL_ADDRESS = "http://schemas.microsoft.com/mapi/proptag/0x0065001E"
    Filter = "@SQL=" & _
        """" & PR_SENT_REPRESENTING_EMAIL_ADDRESS & """ ci_phrasematch 'mailer-daemon' OR " & _
        """" & PR_SENT_REPRESENTING_EMAIL_ADDRESS & """ ci_phrasematch 'postmaster' OR " & _
        "urn:schemas:httpmail:subject ci_phrasematch 'undeliverable' OR " & _
        "urn:schemas:httpmail:subject ci_phrasematch 'returned'"
    For Each i In DIB.Items.Restrict(Filter)
        Debug.Print i.Body '<< Code fails here
    Next

    Set i = Nothing
    Set DIB = Nothing
    Set OL = Nothing
End Sub

Он возвращает ошибку времени выполнения -2147467259 «Ошибка метода« Body »объекта« _MailItem »»

Код будет работать при запуске непосредственно в Outlook VBA, но не при запуске извне.

Целью кода было выполнить массовый просмотр возвращенных почтовых отправлений, сопоставить информацию в теле письма. отправьте электронное письмо в запись в базе данных и обновите базу данных, чтобы записать сбой. база данных; вместо того, чтобы база данных пыталась получить ее из Outlook)

1 Ответ

0 голосов
/ 16 июня 2020

Имеет смысл использовать метод Logon класса Application, который регистрирует пользователя в MAPI, получая сеанс MAPI. Вот что говорит MSDN:

Используйте метод входа в систему только для входа в определенный профиль c, когда Outlook еще не запущен. Это связано с тем, что одновременно может выполняться только один процесс Outlook, и этот процесс Outlook использует только один профиль и поддерживает только один сеанс MAPI. Когда пользователи запускают Outlook во второй раз, этот экземпляр Outlook запускается в рамках того же процесса Outlook, не создает новый процесс и использует тот же профиль.

Если Outlook не запущен, а вы хотите только запустить Outlook с профилем по умолчанию не используйте метод входа в систему. Лучшая альтернатива показана в следующем примере кода, InitializeMAPI: сначала создайте экземпляр объекта Outlook Application, а затем укажите папку по умолчанию, такую ​​как Inbox. Это имеет побочный эффект инициализации MAPI для использования профиля по умолчанию и полной функциональности объектной модели.

Во-вторых, я бы посоветовал проверить тип элемента перед доступом к каким-либо свойствам. Не все элементы могут содержать такие свойства.

Еще одна возможная ошибка и, скорее всего, проблема безопасности при работе с объектной моделью Outlook. Когда вы пытаетесь получить доступ к любому конфиденциальному свойству, Outlook может вызвать проблему безопасности (это может быть ошибка в коде или защита пользовательского интерфейса / приглашение). «Безопасность» в этом контексте относится к так называемой «защите объектной модели», которая запускает запросы безопасности и блокирует доступ к определенным функциям, чтобы не допустить, чтобы вредоносные программы собирали адреса электронной почты из данных Outlook и использовали Outlook для распространения вирусов и спама. Вы можете использовать следующие способы преодоления разрыва:

  1. Компонент Security Manager for Outlook позволяет включать и выключать подсказки во время выполнения.

  2. Используйте низкоуровневый код, который не генерирует запросы безопасности. Или любые другие сторонние оболочки для этого API (например, Redemption).

  3. Разверните групповую политику, чтобы избежать запросов безопасности.

  4. Актуальное антивирусное программное обеспечение.

...