【问题标题】:Outlook VBA-- Some MailItem Properties return values, others do notOutlook VBA - 一些 MailItem 属性返回值,其他不返回
【发布时间】:2013-06-08 14:03:32
【问题描述】:

编辑:新信息:我刚刚意识到,虽然 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,这就是我应该得到的。

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

【问题讨论】:

  • 如何声明和分配InboxItems?你在用Option Explicit吗?
  • @DougGlancy 我将编辑大部分代码,请稍等
  • 这似乎对我有用,即我得到了 Body 和 SenderEmail 内容。祝你好运!
  • @DougGlancy 哈哈好吧,至少我知道代码确实有效。我只是错过了一些东西...感谢您的测试:)

标签: vba outlook mailitem


【解决方案1】:

多种物品类型

首先,不能保证Inbox.Items 集合中的所有项目都是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 对象的一些属性已展开:

正文与 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

【讨论】:

  • 非常感谢您的回答!问题是,出于测试目的,收件箱中只有一封电子邮件,它有正文和主题,并且在收到时确实有一个发件人。尽管如此,我只得到了两个属性,主题和日期,而对于正文和发件人电子邮件,我得到了“”。感谢您到目前为止的帮助!
  • @Wolves 我刚刚更新了我的答案,增加了一点——您需要检查多个 Body 属性。请参阅我的更新答案。
  • 我会尝试一下并回复您。谢谢你的帮助:)
  • 你的函数工作正常;当我使用 F8 逐步完成它时,它会进入您的函数,它只选择第一种情况,并将 MailBody 设置为 MailItem.Body,而不是 HTML 或 RTF。这是一个好主意,也是我没有想到的,但不幸的是它没有奏效;我仍然得到了身体的输出,“”。非常感谢您试一试!
猜你喜欢
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
相关资源
最近更新 更多