【问题标题】:VBA Export Outlook Non-HTML Email Body into ExcelVBA 将 Outlook 非 HTML 电子邮件正文导出到 Excel
【发布时间】:2019-03-11 03:50:16
【问题描述】:

我想通过单击 excel 中的按钮将 Outlook 非 HTML 电子邮件正文 导出到 excel 中。以下是我的代码。感谢是否有人可以在这方面为我提供帮助。

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

sText = StrConv(OutlookMail.RTFBody, vbUnicode)

Range("D3").Offset(i, 0).Value = sText

我确实试过了,但它提示 运行时错误 '1004' 应用程序定义或对象定义的错误但它适用于带有 HTML 标记的正文。

Range("D3").Offset(i, 0).Value = OutlookMail.Body

这是我的电子邮件文件夹的结构

以下是我完整的 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

【问题讨论】:

  • 你试过OutlookMail.Body吗?
  • 我做到了,它只适用于带有 HTML 标签的电子邮件正文。纯文本正文将导致错误 1004。
  • @Anthony White 如果您首先将正文写入纯文本文件,然后将第二个子导入文本文件到 excel,它会起作用。

标签: excel vba outlook


【解决方案1】:

一封电子邮件可以有多个正文,也可以没有。 Outlook 可识别文本、Html 和 RTF 正文。近年来,我检查过的所有电子邮件都没有包含 RTF 正文。如果您想格式化您的消息,它曾经是唯一的选择。今天,Html 和 CSS 提供的功能远远超过 RTF,我怀疑是否有智能手机接受 RTF。我很惊讶您收到一封带有 RTF 正文的电子邮件;我猜它来自旧系统。

忽略 RTF,如果电子邮件具有 Html 正文,则将向用户显示该正文。只有在没有 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

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

Cells.Columns.Autofit
Cells.VerticalAlignment = xlTop

您的代码在活动工作表上运行。这依赖于用户在启动宏时是否激活了正确的工作表。您应该命名目标工作表以避免错误。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      感谢您的所有回答,我已经改进了我的代码并且我已经解决了问题。这是由于脚本生成并发送到我的电子邮件的“=”符号。 Excel 以不同的方式处理“=”符号,这就是它不允许我正确提取的原因。将“=”符号更改为“#”符号后,我可以正常提取电子邮件:

      OutlookMail.Body

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-05
        • 1970-01-01
        • 2020-10-06
        • 1970-01-01
        • 2014-12-08
        • 1970-01-01
        相关资源
        最近更新 更多