Outlook VBA— Some MailItem Properties return values, others do not

后端 未结 1 538
鱼传尺愫
鱼传尺愫 2021-01-25 19:53

EDIT: New info: I just now realised that, while the return of Mailitem.Body is \"\", the actual value is \"Application-defined or object-defined error\" . I\'m not entirely sure

相关标签:
1条回答
  • 2021-01-25 20:15

    Multiple Item Types

    First, there is no guarantee that all items in the Inbox.Items collection are of type MailItem. Inboxes also contain AppointmentItem, MeetingItem, and other *Item type objects. Not all of these item types have the same properties populated. To ensure you do not get a type mismatch error, declare your iterator variable as a generic Object and only assign it to a strongly-typed MailItem variable if it is of the correct type:

    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
    

    Optional properties

    Second, there is no gaurantee that all properties of an object will be populated. If a mail item was never sent, it will have no sender address, and certainly it is possible to have an email with no body. A good way to get familiar with which properties are available and what they contain is to use the Locals window (View > Locals Window in the VBA IDE). Here's a screen shot of the above code paused in the loop, with some of the properties of the oMailItem object expanded:

    Locals Window in Outlook VBA IDE

    Body vs. HTMLBody

    MailItem objects have three body properties: Body, HTMLBody, and RTFBody. Usually only one of them is populated. Which one depends on the format of the email. You can check the BodyFormat property to find which one is applicable to the current item. Using that, here's a generalized way to get the raw body of a MailItem, no matter what the format:

    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
    
    0 讨论(0)
提交回复
热议问题