VBA将Outlook非HTML电子邮件正文导出到Excel

时间:2019-03-11 03:50:17

标签: excel vba outlook outlook-vba

我想通过单击excel中的按钮将Outlook 非HTML电子邮件正文导出到excel。以下是我的代码。谢谢有人能协助我。

这是我用来打印纯文本电子邮件正文的代码,但是我收到很多不需要的文本

  

sText = StrConv(OutlookMail.RTFBody,vbUnicode)

     

Range(“ D3”)。Offset(i,0).Value = sText

Output Example

我确实尝试过此操作,但会提示运行时错误'1004' 应用程序定义或对象定义的错误,但它可以在带有HTML标记的正文上使用。

  

Range(“ D3”)。Offset(i,0).Value = 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 :(得分:0)

Excel不直接支持RTF,但是纯文本MailItem.Body应该可以正常工作,我从未见过MailItem.Body引发异常。您先保存邮件吗?

答案 1 :(得分:0)

电子邮件可以有多个正文,也可以没有。 Outlook可以识别文本,HTML和RTF正文。我近年来检查过的电子邮件中没有包含RTF正文。如果要格式化邮件,这是唯一的选择。如今,Html和CSS提供的功能远远超过RTF,我怀疑是否有任何智能手机接受RTF。我很惊讶您收到带有RTF正文的电子邮件;我的猜测是来自旧系统。

如果电子邮件具有HTML正文,则忽略RTF,这就是向用户显示的内容。仅当没有HTML正文时,用户才会看到文本正文。

在我检查过的电子邮件中,所有电子邮件均包含文本和HTML正文。几乎所有这些文本主体都是HTML主体,每个标记都由回车符和换行符代替。由于CRLF作为换行符是Windows的约定,因此我怀疑电子邮件是否没有文本正文,Outlook会从HTML正文中创建一封电子邮件,以获取要处理文本正文的宏的好处。如果我的理论是正确的,则Outlook对于仅包含RTF电子邮件的电子邮件不会执行相同的操作。因此,如果有HTML正文,则为文本正文,而如果有RTF正文,则为文本正文。

Microsoft RTF规范可以在线获得,因此您可以根据需要研究格式。如果您搜索“我可以从VBA处理RTF吗?”,您会发现很多有趣的建议。

或者,您显示的示例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

您不需要单独格式化单元格。底部的以下内容将处理自动调整和垂直对齐:

Cells.Columns.Autofit
Cells.VerticalAlignment = xlTop

您的代码在活动工作表上运行。这取决于启动宏时用户具有正确的活动工作表。您应该为目标工作表命名,以免出错。

答案 2 :(得分:0)

感谢您提供所有答案,我改进了代码,并找出了问题所在。这是因为脚本生成了“ =”符号并将其发送到我的电子邮件中。 Excel以不同的方式对待“ =”符号,这就是为什么它不允许我正确提取的原因。将“ =”符号更改为“#”符号后,可以正常使用以下方式提取电子邮件:

  

OutlookMail.Body