Can I send an HTML file as body text using Outlook.MailItem?

Posted on 2008-10-24
Last Modified: 2013-11-27
I'm trying to send an HTML file as 'body text' via MS Access vba using the Outlook.MailItem feature.
I'm able to do it fine with the CDO message object as follows:
objMessage.CreateMHTMLBody "file://c|/temp/test.htm"

But when I try to do this with the Outlook message object, I get an error.
I couldn't find a 'CreateMHTMLBody' option using Outlook objects, so I tried:
objMailMessage.HTMLBody "file://c|/temp/test.htm"
But received an error :(

The reason why I'm trying to use Outlook objects instead of CDO is that I want to save to my Outlook drafts folder.

Question by:Bill543
  • 2
LVL 28

Expert Comment

ID: 22799725
I think you need to create a message template in Outlook using the html page.  Then you can create a new message using that template.  I have some code around here somewhere that does exactly that.  I'll see if I can dig it up.
OM Gang
LVL 28

Accepted Solution

omgang earned 250 total points
ID: 22799786
Found it - it's older code but shows how to create an Outlook message in Access and specify a template to use
OM Gang
Sub SendMessage(Reg As String)

On Error Resume Next

        'declare and open instance of MS Outlook

    Dim olOutlook As New Outlook.Application

    Dim olNS As Outlook.NameSpace

    Dim olFolders As Outlook.MAPIFolder

    Dim olContacts As Outlook.MAPIFolder

    Dim olItems As Outlook.Items

    Dim olConItem As Outlook.ContactItem

    Dim olOutlookMsg As Outlook.MailItem

    Dim olOutlookRecip As Outlook.Recipient

    Dim olOutlookAttach As Outlook.Attachment

    Dim strMsgBody As String, strPST As String

    Dim strCriteria As String

    Dim intCounter As Integer


        'build message body for this region

        'function call - this module

        'returns "Failed" on error

    strMsgBody = BuildMsg(Reg)

    If strMsgBody = "Failed" Then

            'call error handler with specifics - this module

        Call ErrorHandler("BuildMsg", 1, False)

        GoTo Exit_SendMessage

    End If


        'assign name of outlook PST folder we want to use to string


    strPST = "Broadcast"

        'set object Outlook NameSpace

    Set olNS = olOutlook.GetNamespace("MAPI")

        'set object NameSpace Folders for PST file

    Set olFolders = olNS.Folders(strPST)

        'set object Contacts folder for PST file

    Set olContacts = olFolders.Folders("Contacts")

        'set object Contacts in folder

    Set olItems = olContacts.Items


        'assign item category for this region to string variable so

        'we can search for contacts

    strCriteria = Reg & "_Broadcast"


        'loop through list of contacts

    For intCounter = 1 To olItems.Count

        Set olConItem = olItems(intCounter)

            'find contacts for the current region

        If olConItem.Categories = strCriteria Then


                'select message template for this region

            Set olOutlookMsg = olOutlook.CreateItemFromTemplate _

                    ("i:\outlook\templates\" & Reg & "_Broadcast.oft")

            With olOutlookMsg


                Set olOutlookRecip = .Recipients.Add(olConItem.Email1Address)

                olOutlookRecip.Type = olTo

                    'subject, body, importance

                .Subject = "Inventories Available for " _

                        & "Cherry Pick"

                .Body = strMsgBody

                .Importance = olImportanceNormal


                Set olOutlookAttach = .Attachments.Add _

                        ("p:\output\inventory1.pdf", , , "Inventory 1")

                Set olOutlookAttach = .Attachments.Add _

                        ("p:\output\inventory2.pdf", , , "Inventory 2")

                    'resolve recipient name

                For Each olOutlookRecip In .Recipients



                    'display before sending?  add (DisplayMsg As Boolean)

                    'to sub/func declare

                'If DisplayMsg Then

                '    .Display


                '    .Save

                '    .Send

                'End If



            End With

        End If


    Next intCounter


        'clear object variables

    Set olOutlookAttach = Nothing

    Set olOutlookRecip = Nothing

    Set olOutlookMsg = Nothing

    Set olConItem = Nothing

    Set olItems = Nothing

    Set olContacts = Nothing

    Set olFolders = Nothing

    Set olNS = Nothing

    Set olOutlook = Nothing

    Exit Sub

End Sub

Open in new window


Author Closing Comment

ID: 31509811
Thanks! As usual you pulled through. Your solution worked for me.
I needed to add/edit the below line from your code:
'select message template for this region
Set olOutlookMsg = olOutlook.CreateItemFromTemplate _
("i:\outlook\templates\" & Reg & "_Broadcast.oft")

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
vba DCount with 2 criteria 3 33
Transfer records between two Access tables 6 36
ms/access hyperlink/ftp 7 31
How to base a filter depending on fields contents? 15 45
Experts-Exchange is a great place to come for help with solutions for your database issues, and many problems are resolved within minutes of being posted.  Others take a little more time and effort and often providing a sample database is very helpf…
Introduction The Visual Basic for Applications (VBA) language is at the heart of every application that you write. It is your key to taking Access beyond the world of wizards into a world where anything is possible. This article introduces you to…
Familiarize people with the process of utilizing SQL Server stored procedures from within Microsoft Access. Microsoft Access is a very powerful client/server development tool. One of the SQL Server objects that you can interact with from within Micr…
With Microsoft Access, learn how to specify relationships between tables and set various options on the relationship. Add the tables: Create the relationship: Decide if you’re going to set referential integrity: Decide if you want cascade upda…

932 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now