1

编辑:新信息:我刚刚意识到,虽然 Mailitem.Body 的返回是 "",但实际值是 "Application-defined or object-defined error" 。我不完全确定这意味着什么,但我知道它出现在多个字段中——我在下面提供了一个屏幕截图。

错误

我遇到了一个问题,某些属性将返回正确的值,而其他属性则不会。我有一个示例电子邮件,其中我有一封主题为“主题”的电子邮件,邮件是“正文”,发件人电子邮件地址是“email@address.com”,发送日期是 2013 年 6 月 12 日。

当我运行以下代码时:

    Dim ComputerName As String
    Dim ErrorState As String
For Each MailItem In InboxItems
        ComputerName = MailItem.Subject
        'ErrorState = MailItem.Body
        ErrorState = MailBody(MailItem)
        strDate = GetDate(MailItem.SentOn)
        SenderEmail = MailItem.SenderEmailAddress
        If strDate = DateToday And SenderEmail = "email@address.com" Then
            Computers(a, 0) = ComputerName
            Computers(a, 1) = ErrorState
            a = a + 1
        End If
        Debug.Print MailItem.Subject
        Debug.Print MailItem.Body
    Next MailItem

我得到的是 ComputerName = "Subject"、ErrorState = ""、SenderEmail = "" 和 strDate = "2013/6/12"(在这种情况下是正确的格式)。为什么这会为两个 Mailitem 属性返回正确的值,而不是为其他两个?这是一个非常奇怪的问题,我希望大家能给予任何帮助!

我将在此处为代码添加更多上下文:

    Set objOutlook = CreateObject("Outlook.Application", "localhost")
    Set objNamespace = objOutlook.GetNamespace("MAPI")
    Set Inbox = GetFolder("email@address.org/inbox")
    Set InboxItems = Inbox.Items
    InboxItems.SetColumns ("SentOn")

GetFolder 是一个通过文件夹路径获取邮箱的函数。我必须这样做,因为我没有使用 Outlook 中的默认收件箱。

我还尝试使用下面建议的 MailBody 函数,以防正文为 HTML 或 RTF 格式。不幸的是,证明body是正常的,MailItem.Body应该找回来了,还是不行。MailItem.Body 返回“”,即使我知道电子邮件有正文。身体只是数字 1,这就是我应该得到的。

另外,我应该注意电子邮件的发件人与收件人相同;换句话说,这封电子邮件是从一个电子邮件地址发送给它自己的。我不知道这是否会有所作为,但我想我会把它放在那里以防万一。

4

1 回答 1

6

多种物品类型

首先,不能保证Inbox.Items集合中的所有项目都是 type MailItem。收件箱还包含AppointmentItemMeetingItem和其他*Item类型的对象。并非所有这些项目类型都填充了相同的属性。为确保不会出现类型不匹配错误,请将迭代器变量声明为泛型Object,并且仅在其类型正确时将其分配给强类型MailItem变量:

Dim oInbox    As Outlook.Folder
Dim oItem     As Object
Dim oMailItem As MailItem

Set oInbox = ActiveExplorer.Session.DefaultStore.GetRootFolder().Folders("Inbox")
For Each oItem In oInbox.Items
    If TypeOf oItem Is MailItem Then
        Set oMailItem = oItem
        ' Do stuff
    Else
        Debug.Print "Skipping " & TypeName(oItem)
    End If
Next

可选属性

其次,不能保证对象的所有属性都会被填充。如果一个邮件项目从未发送过,它将没有发件人地址,当然也可能有一封没有正文的电子邮件。熟悉哪些属性可用以及它们包含什么的一个好方法是使用 Locals 窗口(VBA IDE 中的 View > Locals Window)。这是上述代码在循环中暂停的屏幕截图,其中oMailItem扩展了对象的一些属性:

Outlook VBA IDE 中的局部变量窗口

正文与 HTMLBody

MailItem对象具有三个主体属性:BodyHTMLBodyRTFBody。通常只有其中一个被填充。哪一个取决于电子邮件的格式。您可以检查BodyFormat属性以找到适用于当前项目的属性。使用它,这是获取 MailItem 原始正文的通用方法,无论格式如何:

Public Function MailBody(ByVal MailItem As MailItem) As String
    Select Case MailItem.BodyFormat
        Case OlBodyFormat.olFormatPlain, OlBodyFormat.olFormatUnspecified
            MailBody = MailItem.Body
        Case OlBodyFormat.olFormatHTML
            MailBody = MailItem.HTMLBody
        Case OlBodyFormat.olFormatRichText
            MailBody = MailItem.RTFBody
    End Select
End Function
于 2013-06-12T13:22:00.737 回答