Outlook VBA--某些MailItem属性返回值,其他则不返回值

Wol*_*ves 1 outlook vba mailitem

编辑:新信息:我刚才意识到,虽然Mailitem.Body的返回是"",但实际值是"应用程序定义的或对象定义的错误".我不完全确定这意味着什么,但我确实知道它出现在多个领域 - 我在下面放了一个屏幕截图.

错误

我遇到的问题是某些属性会返回正确的值,而其他属性则不会.我有一个示例电子邮件,其中我有一个主题为"主题"的电子邮件,邮件为"正文",发件人电子邮件地址为"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
Run Code Online (Sandbox Code Playgroud)

我得到的是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")
Run Code Online (Sandbox Code Playgroud)

GetFolder是一个按文件夹路径获取邮箱的功能.我必须这样做,因为我没有使用outlook中的默认收件箱.

我还尝试使用下面提出的MailBody函数,以防身体采用HTML或RTF格式.不幸的是,它证明了身体是正常的,并且MailItem.Body应该已经检索它,它仍然无法正常工作.MailItem.Body返回"",即使我知道电子邮件有正文.身体只是数字1,这就是我应该得到的.

此外,我应该注意电子邮件的发件人与收件人相同; 换句话说,电子邮件是从一个电子邮件地址发送给自己的.我不知道这是否会产生影响,但我想我会把它放在那里以防万一.

Jos*_*nig 6

多种项目类型

首先,不能保证Inbox.Items集合中的所有项目都是类型MailItem.收件箱还包含AppointmentItem,MeetingItem和其他*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
Run Code Online (Sandbox Code Playgroud)

可选属性

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

Outlook VBA IDE中的本地窗口

正文与HTMLBody

MailItem对象有三种机身特性:Body,HTMLBody,和RTFBody.通常只会填充其中一个.哪一个取决于电子邮件的格式.您可以查看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
Run Code Online (Sandbox Code Playgroud)