Outlook Greeting and Goodbye Contacts | VBA Macro #35

Share on facebook
Share on twitter
Share on linkedin
This is an Outlook macro that is the combination of two existing Outlook macros Greeting and Goodbye [VBA Macro #13] and Hello Contacts [VBA Macro #33]. Starting an email with a Greeting or ending it with a Goodbye can look more personable with some VBA code! The Greeting and Goodbye Contact macro automates the entry of a Greeting “Good Morning” or “Hello” followed by the First Name of the recipient you are emailing. To identify the First Name this macro uses the recipient’s email address to loop through all the existing contact records for a matching email address. If a match is found the contact’s First Name field value is used in the beginning of the email. To utilize the Greeting and Goodbye Contacts macro, you will need to add contacts in Outlook.  If you haven’t created an Outlook contact before checkout this link to see the multiple ways to do this. You can create a contact directly from an email message, with an import, or manually from scratch. The appropriate Greeting and Goodbye is determined by the current time and the day of the week. The Greeting and Goodbye Contacts macro helps you deliver better customer service and create better connections with your clients! This Outlook macro can be fired from a custom button or trigger automatically when replying to an email.

See it in Action!

Watch this video to see this macro in action.

The Code

Here is the code for this macro. Make sure the following References are setup before running it: Visual Basic For Applications, Microsoft Outlook 16.0 Object Library, Microsoft Office 16.0 Object Library, Microsoft Word 16.0 Object Library
***Recent Code Updates
09.12.2021 With an update to Office 365 SMTP Email Addresses were no longer being recognized in the code. Made a handful of updates to handle this going forward. Now looking for Recipient.Address containing “EXCHANGE ADMINISTRATIVE GROUP” to determine if SMTP PropertyAccessor needs to be used to evaluate actual Email Address. In Outlook Contact also looking to Email Display Name instead of Email Address when evaluating SMTP. This required an update to SetColumns to include Email1DisplayName. Thoughts were that Recipient.DisplayType = olRemoteUser would help but didn’t seem to resolve the issue so removing for now. Did add Recipients.ResolveAll to help Outlook resolve recipients when code is running.
Copy the Code
'Leverage & Lean "Less Clicks, More Results"
Sub GreetingGoodbyeContacts()
Const PR_SMTP_ADDRESS As String = "http://schemas.microsoft.com/mapi/proptag/0x39FE001E"
' Means that these variables are in use
Dim ContactEmailAddress As String '
Dim ContactItem As Object '
Dim ContactItems As Items '
Dim ContactName As String '
Dim EmailCurrent As Outlook.MailItem '
Dim Goodbye As String '
Dim Greeting As String '
Dim GreetingGoodbyeContacts As String '
Dim objApp As Application '
Dim objNS As NameSpace '
Dim olDocument As Word.Document '
Dim olInspector As Outlook.Inspector '
Dim olSelection As Word.Selection '
Dim Recipient As Recipient
Dim RecipientEmail As Object
Dim RecipientEmailAddress As String '
Dim SMTPCheck As Boolean '
Dim SMTP As Outlook.PropertyAccessor '
Dim TimeofDay As Date '
Dim Weekday As String '
On Error GoTo LeverageLean
Set olInspector = Application.ActiveInspector()
Set RecipientEmail = olInspector.CurrentItem
RecipientEmail.Recipients.ResolveAll 'Ensure Outlook has resolved all recipients before capturing RecipientEmailAddress
Weekday = Format(Date, "dddd") 'What day of the week is it?
TimeofDay = Time() 'What time is it now?
'Custom Greeting and Goodbye based on answers
If TimeofDay < "9:00:00 AM" Then
Greeting = "Good Morning"
ElseIf Weekday = "Friday" And TimeofDay > "3:30:00 PM" Then
Greeting = "Hello"
Goodbye = "Enjoy your weekend!"
ElseIf TimeofDay > "3:30:00 PM" Then
Greeting = "Hello"
Goodbye = "Have a great night!"
ElseIf Greeting = "" Then
Greeting = "Hello"
End If
For Each Recipient In RecipientEmail.Recipients 'Loop through all the Recipients
If Recipient.Type = olTo And RecipientEmailAddress = "" Then 'If the Recipient is in the To field
If InStr(1, Recipient.Address, "EXCHANGE ADMINISTRATIVE GROUP") > 0 Then
SMTPCheck = True
Set SMTP = Recipient.PropertyAccessor
RecipientEmailAddress = SMTP.GetProperty(PR_SMTP_ADDRESS) 'Capture the first Recipient listed in the To field
ElseIf InStr(1, Recipient.Address, "EXCHANGE ADMINISTRATIVE GROUP") = 0 Then
RecipientEmailAddress = Recipient.Address 'Capture the first Recipient listed in the To field
End If
End If
Next Recipient
Set objApp = CreateObject("Outlook.Application")
Set objNS = objApp.GetNamespace("MAPI")
Set ContactItems = objNS.GetDefaultFolder(olFolderContacts).Items 'Set Contacts Folder
ContactItems.SetColumns ("Email1Address, Email1DisplayName, FirstName") 'Set Columns to only look to a Contact's Primary Email Address and First Name value
For Each ContactItem In ContactItems 'Loop through the Contacts Items
If SMTPCheck = True Then
ContactEmailAddress = ContactItem.Email1DisplayName 'Set the Contact's Email Address using Display Name to help with SMTP Address
ElseIf SMTPCheck = False Then
ContactEmailAddress = ContactItem.Email1Address 'Set the Contact's Email Address
End If
If InStr(1, ContactEmailAddress, RecipientEmailAddress) > 0 Then
ContactName = ContactItem.FirstName 'Set the ContactName with the Contact's First Name
End If
If ContactName = "" Then 'If no Contact Name is found
GreetingGoodbyeContacts = Greeting & "," & vbNewLine & vbNewLine & Goodbye
ElseIf ContactName <> "" Then 'If a Contact Name is found
GreetingGoodbyeContacts = Greeting & " " & ContactName & "," & vbNewLine & vbNewLine & vbNewLine & vbNewLine & Goodbye
End If
Set olDocument = olInspector.WordEditor
Set olSelection = olDocument.Application.Selection
olSelection.TypeText GreetingGoodbyeContacts 'Enter Hello Contacts at the beginning of the email
Set ContactItem = Nothing
Set ContactItems = Nothing
Set objApp = Nothing
Set objNS = Nothing
Set olDocument = Nothing
Set olInspector = Nothing
Set olSelection = Nothing
Set SMTP = Nothing
Exit Sub
MsgBox (Err.Number & " - " & Err.Description & vbNewLine & vbNewLine & "Don't hesitate to email me: brentschneider@leveragelean.com")
End Sub
'Stay Awesome!

Macro Monday

Here is the Macro Monday video this macro was featured in. Watch this video to learn how to get the most out of this macro and start using it today!


These lines of code can be customized to personalize this macro. These lines of code can be customized to personalize this macro.

32 through 41: Update the TimeofDay to get your Greeting and Goodbye to fire at specific times. You can also indicate certain Greetings or Goodbyes to be generated based on the Weekday within these lines of code.
62 through 65: GreetingGoodbyeContacts is the final string that will be entered into your email body. Here is where you can update spacing by adding or removing vbNewLine.

Although you can create a custom button to trigger the Greeting and Goodbye macro on command you can also automate this macro with some additional VBA code.

Here is the additional code that can you used to fire this macro with Outlook’s Reply and Reply All buttons. Copy and Paste this VBA code into your Outlook Session and restart Outlook. You must make your GreetingGoodbye macro Public so it can be called within your Outlook Session.
'Leverage & Lean "Less Clicks, More Results"
Option Explicit
Private WithEvents oExpl As Explorer
Private WithEvents oItem As MailItem
Dim bDiscardEvents As Boolean
Dim oResponse As MailItem
Private Sub Application_Startup()
Set oExpl = Application.ActiveExplorer
bDiscardEvents = False

'Call the Macros listed below:
'Call MacroName
End Sub
Private Sub oExpl_SelectionChange()
On Error Resume Next
Set oItem = oExpl.Selection.Item(1)
End Sub
Sub oItem_Reply(ByVal Response As Object, Cancel As Boolean)
On Error GoTo LeverageLean
Cancel = True
bDiscardEvents = True

'Display current email selection
Set oResponse = oItem.Reply

'Call the Macros listed below:
'Call MacroName

Exit Sub


End Sub
Sub oItem_ReplyAll(ByVal Response As Object, Cancel As Boolean)
On Error GoTo LeverageLean
Cancel = True
bDiscardEvents = True

'Display current email selection
Set oResponse = oItem.ReplyAll

'Call the Macros listed below:
'Call MacroName

Exit Sub


End Sub
'Stay Awesome!

First time using VBA?

The Developer Tab is an additional section of the ribbon when activated allows you access to Visual Basic in Applications like Access, Excel, Outlook, PowerPoint, Word.
Setup Now
Once the Developer Tab is available you will have the capability to update your security to allow Macros to run in the current application.
Setup Now
A sub of code is a collection of objects and variables. For the code to successfully run a library of references needs to be set.
Setup Now
Subscribe as an Insider to receive additional rights.
If you like our content and want to show your support tip us here!

Contact Us

Looking to improve your computer processes?
Leverage & Lean is here to help!

Powered By MemberPress WooCommerce Plus Integration

Free Macro

Start creating Less Clicks, More Results today!