VBA Экспорт Тела электронной почты без HTML в Outlook - PullRequest
0 голосов
/ 11 марта 2019

Я хочу экспортировать Outlook Тело электронной почты без HTML в Excel одним нажатием кнопки в Excel. Ниже приведены мои коды. Буду признателен, если кто-нибудь сможет мне помочь в этом.

Это код, который я использую для печати простого текста электронного письма , но я получаю много нежелательного текста

sText = StrConv (OutlookMail.RTFBody, vbUnicode)

Диапазон ("D3"). Смещение (i, 0). Значение = sText

Output Example

Я пробовал это, но он выдает ошибка времени выполнения '1004' Определяемая приложением или объектная ошибка Она работает на теле с тегами HTML.

Диапазон ("D3"). Смещение (i, 0). Значение = OutlookMail.Body

Это структура моих папок электронной почты

My email folders

Ниже приведены мои полные коды VBA

Sub extract_email()

Dim OutlookApp As New Outlook.Application
Dim Folder As Outlook.MAPIFolder
Dim OutlookMail As MailItem

Dim sText As String
Dim i As Integer

Set myAccount = OutlookApp.GetNamespace("MAPI")
Set Folder = myAccount.GetDefaultFolder(olFolderInbox).Parent
Set Folder = Folder.Folders("Test_Main").Folders("Test_Sub")

i = 1

Range("A4:D20").Clear

For Each OutlookMail In Folder.Items
    If OutlookMail.ReceivedTime >= Range("B1").Value And OutlookMail.SenderName = "Test_Admin" Then
        Range("A3").Offset(i, 0).Value = OutlookMail.Subject
        Range("A3").Offset(i, 0).Columns.AutoFit
        Range("A3").Offset(i, 0).VerticalAlignment = xlTop
        Range("B3").Offset(i, 0).Value = OutlookMail.ReceivedTime
        Range("B3").Offset(i, 0).Columns.AutoFit
        Range("B3").Offset(i, 0).VerticalAlignment = xlTop
        Range("C3").Offset(i, 0).Value = OutlookMail.SenderName
        Range("C3").Offset(i, 0).Columns.AutoFit


        sText = StrConv(OutlookMail.RTFBody, vbUnicode)
        Range("D3").Offset(i, 0).Value = sText
        Range("D3").Offset(i, 0).Columns.AutoFit
        Range("D3").Offset(i, 0).VerticalAlignment = xlTop

        i = i + 1
    End If
Next OutlookMail

Set Folder = Nothing

End Sub

Ответы [ 3 ]

0 голосов
/ 11 марта 2019

Электронное письмо может иметь несколько тел или ни одного.Outlook распознает текст, HTML и RTF тела.Ни одно электронное письмо, которое я изучал в последние годы, не содержало тела RTF.Когда-то это был единственный вариант, если вы хотите отформатировать ваше сообщение.Сегодня HTML и CSS предлагают гораздо больше функциональности, чем RTF, и я сомневаюсь, что какой-либо смартфон поддерживает RTF.Я удивлен, что вы получаете письмо с телом RTF;Полагаю, это из устаревшей системы.

Игнорирование RTF, если электронное письмо имеет текст Html, это то, что отображается пользователю.Только если нет HTML-тела, пользователь увидит текстовое тело.

Из рассмотренных мною электронных писем все имеют текст и текст HTML.Почти все эти текстовые тела являются телом Html, каждый тег заменяется на возврат каретки и перевод строки.Поскольку CRLF как символ новой строки является соглашением Windows, я подозреваю, что если в письме нет текстового тела, Outlook создает его из тела Html для макросов, которые хотят обрабатывать текстовое тело.Если моя теория верна, Outlook не делает то же самое для электронной почты, которая содержит только электронную почту RTF.Следовательно, у вас есть текстовое тело, если есть тело HTML, но нет, если есть тело RTF.

Спецификация для RTF Microsoft доступна онлайн, так что вы можете изучить формат, если хотите.Если вы ищете «Могу ли я обработать RTF из VBA?», Вы найдете множество предложений, которые могут вас заинтересовать.

В качестве альтернативы показанный вами пример RTF выглядит просто:

{string of RTF commands{string of RTF commands}}
{string of RTF commands ending in “1033 ”text\par
text\par
text\par
}

Если вы удалили все до «1033», а конечный «}» затем заменили «\ par» на «», вы можете получить то, что хотите.

У меня проблемы с вашим VBA.Например:

Не все элементы в папке «Входящие» являются MailItems.Вы должны иметь:

For Each OutlookMail In Folder.Items
  If OutlookMail.Class = olMail Then 
    If OutlookMail.ReceivedTime ... Then
      :   :   :
    End If
  End If

Вам не нужно форматировать ячейки по отдельности.Следующее в нижней части будет обрабатывать AutoFit и вертикальное выравнивание:

Cells.Columns.Autofit
Cells.VerticalAlignment = xlTop

Ваш код работает на активном листе.Это зависит от того, активен ли правильный лист при запуске макроса.Вы должны назвать целевой лист, чтобы избежать ошибок.

0 голосов
/ 25 марта 2019

Спасибо за все ответы, я улучшил свои коды и выяснил проблему. Это связано с символами "=", которые генерируются из скрипта и отправляются на мою электронную почту. Excel обрабатывает знак "=" по-разному, поэтому он не позволяет мне извлечь должным образом. После того, как я изменил символ «=» на символ «#», я могу извлечь письмо, как правило, используя:

OutlookMail.Body

0 голосов
/ 11 марта 2019

Excel не поддерживает RTF напрямую, но обычный текст MailItem.Body должен работать нормально, я никогда не видел, чтобы MailItem.Body вызывал исключение.Вы сначала сохраняете сообщение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...