Sending Emails from Access with VBA: Outlook and SMTP
Automate email notifications, reports, and alerts directly from Access using VBA. Learn both the Outlook automation approach and direct SMTP sending.
Sending emails directly from Access is one of the most requested automation features. Whether you need to notify a manager when a record is updated, send a report to stakeholders on a schedule, or email customers their invoices, VBA gives you the tools to do it.
Method 1: Outlook Automation (Most Common)
If Outlook is installed on the machine running Access, you can automate it through VBA to send emails. This is the most reliable approach for most business environments.
Add a reference: Tools → References → Microsoft Outlook XX.X Object Library
Sub SendEmailViaOutlook(toAddress As String, subject As String, body As String, _
Optional attachmentPath As String = "")
On Error GoTo ErrorHandler
Dim olApp As Outlook.Application
Dim olMail As Outlook.MailItem
Set olApp = New Outlook.Application
Set olMail = olApp.CreateItem(olMailItem)
With olMail
.To = toAddress
.Subject = subject
.Body = body
' Add attachment if provided
If attachmentPath <> "" Then
.Attachments.Add attachmentPath
End If
.Send ' Send immediately
' Use .Display instead of .Send to show the email for review first
End With
Set olMail = Nothing
Set olApp = Nothing
Exit Sub
ErrorHandler:
MsgBox "Email error: " & Err.Description
End Sub
Usage:
SendEmailViaOutlook "[email protected]", _
"New Order Received", _
"Order #" & Me.OrderID & " has been placed by " & Me.CustomerName
Sending Multiple Recipients
With olMail
.To = "[email protected]; [email protected]"
.CC = "[email protected]"
.BCC = "[email protected]"
.Subject = "Monthly Report"
.HTMLBody = "<h1>Report</h1><p>Please find the report attached.</p>"
End With
Sending an Access Report as a PDF Attachment
One of the most powerful patterns is exporting a report to PDF and emailing it automatically:
Sub EmailReport(reportName As String, toAddress As String, subject As String)
On Error GoTo ErrorHandler
' Export the report to a temp PDF file
Dim pdfPath As String
pdfPath = Environ("TEMP") & "\" & reportName & "_" & Format(Now(), "yyyymmdd") & ".pdf"
DoCmd.OutputTo acOutputReport, reportName, acFormatPDF, pdfPath, False
' Send via Outlook
Dim olApp As New Outlook.Application
Dim olMail As Outlook.MailItem
Set olMail = olApp.CreateItem(olMailItem)
With olMail
.To = toAddress
.Subject = subject
.Body = "Please find the " & reportName & " report attached."
.Attachments.Add pdfPath
.Send
End With
' Clean up temp file
Kill pdfPath
MsgBox "Report emailed to " & toAddress
Exit Sub
ErrorHandler:
MsgBox "Error sending report: " & Err.Description
End Sub
Method 2: CDO (Collaboration Data Objects) — No Outlook Required
If Outlook is not installed, use CDO to send email directly via SMTP. This works on any machine with network access to an SMTP server.
Sub SendEmailViaCDO(toAddress As String, subject As String, body As String, _
smtpServer As String, smtpPort As Integer, _
smtpUser As String, smtpPassword As String)
On Error GoTo ErrorHandler
Dim cdoMsg As Object
Dim cdoConf As Object
Set cdoMsg = CreateObject("CDO.Message")
Set cdoConf = CreateObject("CDO.Configuration")
' Configure SMTP settings
With cdoConf.Fields
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = smtpServer
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = smtpPort
.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = smtpUser
.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = smtpPassword
.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
.Update
End With
With cdoMsg
.Configuration = cdoConf
.From = smtpUser
.To = toAddress
.Subject = subject
.TextBody = body
.Send
End With
Set cdoMsg = Nothing
Set cdoConf = Nothing
Exit Sub
ErrorHandler:
MsgBox "CDO email error: " & Err.Description
End Sub
Bulk Email from a Query
To send personalized emails to everyone in a query result:
Sub SendBulkEmails()
Dim db As Database
Dim rs As Recordset
Dim emailCount As Integer
Set db = CurrentDb
Set rs = db.OpenRecordset("SELECT Email, FirstName, InvoiceTotal FROM qryUnpaidInvoices")
emailCount = 0
Do While Not rs.EOF
If Not IsNull(rs!Email) Then
Dim body As String
body = "Dear " & rs!FirstName & "," & vbCrLf & vbCrLf & _
"This is a reminder that your invoice of $" & _
Format(rs!InvoiceTotal, "0.00") & " is outstanding." & vbCrLf & _
"Please contact us to arrange payment." & vbCrLf & vbCrLf & _
"Thank you."
SendEmailViaOutlook rs!Email, "Invoice Reminder", body
emailCount = emailCount + 1
End If
rs.MoveNext
Loop
rs.Close
MsgBox emailCount & " reminder emails sent."
End Sub
Scheduled Email Reports
Combine email sending with Windows Task Scheduler for automated scheduled reports:
- Create a VBA procedure that generates and emails the report
- Create a macro that calls the procedure
- Create a command-line shortcut:
"C:\Program Files\Microsoft Office\...\MSACCESS.EXE" "C:\Database.accdb" /x MacroName - Schedule the shortcut in Windows Task Scheduler
This runs Access in the background, executes the macro, and closes — no user interaction required.
Conclusion
Email automation from Access transforms a passive database into an active communication tool. The Outlook automation approach is the most reliable for most business environments and supports HTML emails, multiple recipients, and attachments with minimal code. Add email notifications to your key workflows — new record alerts, overdue reminders, scheduled reports — and your database will deliver value proactively rather than waiting to be queried.
Explore Topics
Written by
MS Access Blog
Content creator and writer sharing insights and stories.