Chase Ernst
Chase Ernst

Reputation: 1155

Getting email body using vba code

I am trying to get the email header and body inside my email in outlook using VBA. I am using the Application_NewMail() event handler to process that new mail has arrived, but I cannot figure out how to get the header and body from there.

This is the code that I have inside the Application_NewMail() event handler:

Private WithEvents myOlItems  As Outlook.Items

Private Sub Application_NewMail()
Dim olApp As Outlook.Application
Dim oNS         As NameSpace
Dim oFolder     As MAPIFolder
Dim oNewMail    As MailItem
Set olApp = Outlook.Application
Set oNS = GetNamespace("MAPI")
Set oFolder = oNS.GetDefaultFolder(olFolderInbox)
Set oNewMail = oFolder.Items.GetFirst
'This is the string that hold the mail body.
Dim mailBody As String
Dim mailArg() As String


    MsgBox "New Mail!"

End Sub

This function is firing properly once I receive emails. I successfully get the messagebox to pop up. But I want to be able to read the mail body and header to insert into a database.

The actual database side of it I know how to do, but I am unsure how to get the header and body from the email. I have tried something like this:

Set olItem = ActiveExplorer.Selection.Item(1)
    mailBody = oNewMail.Body
    mailArg = Split(mailBody, vbLf)

    'Check to see what is inside the body. We need to say Tank X: Y
    MsgBox "This is line one " & mailArg(0) & "This is line two " & mailArg(1)

And I receive the error: Object variable or With block variable not set

Any help will be greatly appreciated.

Upvotes: 0

Views: 11367

Answers (1)

Eugene Astafiev
Eugene Astafiev

Reputation: 49395

You need to handle the NewMailEx event of the Application class instead. This event fires once for every received item that is processed by Microsoft Outlook. The item can be one of several different item types, for example, MailItem, MeetingItem, or SharingItem. The EntryIDsCollection string contains the Entry ID that corresponds to that item.

The NewMailEx event fires when a new message arrives in the Inbox and before client rule processing occurs. You can use the Entry ID returned in the EntryIDCollection array to call the NameSpace.GetItemFromID method and process the item.

The Outlook object model provides three main ways for working with item bodies:

  1. Body.
  2. HTMLBody.
  3. The Word editor. The WordEditor property of the Inspector class returns an instance of the Word Document which represents the message body. So, you can use the Word object model do whatever you need with the message body.

Finally, you can use the PropertyAccessor object (see the corresponding property of the MailItem class) to read the "PR_TRANSPORT_MESSAGE_HEADERS" property value.

  propertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x007D001E")

Upvotes: 1

Related Questions