I hear a lot of complaints about the quality of Outlook.com's spam filters and the annoyance that blocking an address sends the message to the Junk Email folder instead of deleting the message. While you can't do much about it if you use Outlook on the web, you can use a macro to do something with the messages in Outlook on Windows desktop.
You can use a run a script rule or an ItemAdd macro to watch a specific folder. Which is better? It depends on several factors, including how much mail you receive at a time. If you receive a lot of mail, a rule may be able to filter which messages the macro runs on (such as except if the sender is in my address book), while the ItemAdd macro checks every message. But the ItemAdd macro can run on specific folders.
While it might be easier to manage if you put the words in alphabetical order, if you have a long list of words, putting the most frequent words first in the list will be faster as the macro exits when it finds the first match.
Run a script rules should be added to a module.
Sub OffensiveWords(Item As MailItem) Dim arrSpam As Variant Dim strBody As String Dim i As Long strBody = Item.Subject & " " & Item.Body ' Set up the array - use lower case arrSpam = Array("funded", "ppp", "loan", "funding", "word5") ' Go through the array and look for a match, then do something For i = LBound(arrSpam) To UBound(arrSpam) If InStr(LCase(strBody), arrSpam(i)) Then ' do whatever here Item.Categories = "Spammy" Item.Save Exit Sub End if Next i End Sub ' use this to test the rules script - select a message and run this macro Sub RunAndRules() Dim objApp As Outlook.Application Dim objItem As Object ' MailItem Set objApp = Application Set objItem = objApp.ActiveExplorer.Selection.Item(1) 'macro name you want to run goes here OffensiveWords objItem End Sub
ItemAdd macro version
This macro runs when a new message is added to the Inbox, so to test it, copy and paste (or move) a message in the Inbox.
If you want to want a different folder, you'll change the folder in this line:
Set inboxItems = olNS.GetDefaultFolder(olFolderInbox).Items
This macro goes in ThisOutlookSession. To test it without restarting Outlook, click in the application_startup macro and click Run.
Private WithEvents inboxItems As Outlook.Items Private Sub Application_Startup() Dim olApp As Outlook.Application Dim olNS As Outlook.NameSpace Set olApp = Outlook.Application Set olNS = olApp.GetNamespace("MAPI") Set inboxItems = olNS.GetDefaultFolder(olFolderInbox).Items End Sub Private Sub inboxItems_ItemAdd(ByVal Item As Object) Dim arrSpam As Variant Dim strBody As String Dim i As Long If TypeName(Item) = "MailItem" Then strBody = Item.Subject & " " & Item.Body ' Set up the array arrSpam = Array("funded", "ppp", "loan", "funding", "word5") ' Go through the array and look for a match, then do something For i = LBound(arrSpam) To UBound(arrSpam) If InStr(LCase(strBody), arrSpam(i)) Then ' do whatever Item.Delete ' Item.Categories = "Spammy" ' Item.Save Exit Sub End If Next i End If End Sub
For more information on ItemAdd macros see:
Look for the word only in the reply, not quoted text
This macro looks for words in the reply only, not in the quoted message. In order for this to work on new messages (with no quoted text), we need to use an IF statement. If From: is not found, the macro looks for the word in the entire message.
As written, the macro can look for multiple words.
Sub FindWordReply(Item As MailItem) Dim arrWord As Variant Dim strBody As String Dim lBody As Long Dim i As Long Dim myDestFolder As Folder Dim myNamespace As NameSpace Set myNamespace = Application.GetNamespace("MAPI") lBody = InStr(1, Item.Body, "From: ") Debug.Print lBody If lBody > 0 Then strBody = Left(Item.Body, lBody) Else strBody = Item.Body End If ' Set up the array - use lower case arrWord = Array("sync", "onedrive", "onenote", "search", "word5") ' Go through the array and look for a match, then do something For i = LBound(arrWord) To UBound(arrWord) If InStr(LCase(strBody), arrWord(i)) Then ' do whatever here ' to move Set myDestFolder = myNamespace.GetDefaultFolder(olFolderInbox).Folders("reminders") ' then do whatever With Item .UnRead = True .Move myDestFolder End With Exit Sub End If Next i End Sub
Look for a formatted word
This version of the run a script macro looks for a word with specific HTML formatting. It will not work with RTF formatted messages and may fail with some HTML messages, depending on how it is formatted in the source code. If the messages are generated by an application, they should use an identical format for every message.
To view the message source, right click on the bottom of the message and choose View Source.
Sub FormattedWords(Item As MailItem) Dim arrFormat As Variant Dim strBody As String Dim i As Long strBody = Item.HTMLBody '' #### ' look for multiple words ' Set up the array - use lower case arrFormat = Array("<u>hello", "style='text-decoration: underline;'>hello") ' Go through the array and look for a match, then do something For i = LBound(arrFormat) To UBound(arrFormat) If InStr(LCase(strBody), arrFormat(i)) Then ' do whatever here Item.Categories = "Underlined" Item.Save Exit Sub End If Next i '' #### '' use this for just one word or format '' instead of code above 'If InStr(1, Item.HTMLBody, "<u>Hello") > 0 Then ' Item.Categories = "Underlined" ' Item.Save ' Exit Sub ' End If End Sub ' use this to test the rules script - select a message and run this macro Sub RunAndRules() Dim objApp As Outlook.Application Dim objItem As Object ' MailItem Set objApp = Application Set objItem = objApp.ActiveExplorer.Selection.Item(1) 'macro name you want to run goes here FormattedWords objItem End Sub
How to use the macros on this page
First: You need to have macro security set to the lowest setting, Enable all macros during testing. The macros will not work with the top two options that disable all macros or unsigned macros. You could choose the option Notification for all macros, then accept it each time you restart Outlook, however, because it's somewhat hard to sneak macros into Outlook (unlike in Word and Excel), allowing all macros is safe, especially during the testing phase. You can sign the macro when it is finished and change the macro security to notify.
To check your macro security in Outlook 2010 and newer, go to File, Options, Trust Center and open Trust Center Settings, and change the Macro Settings. In Outlook 2007 and older, look at Tools, Macro Security.
After you test the macro and see that it works, you can either leave macro security set to low or sign the macro.
Macros that run when Outlook starts or automatically need to be in ThisOutlookSession, all other macros should be put in a module, but most will also work if placed in ThisOutlookSession. (It's generally recommended to keep only the automatic macros in ThisOutlookSession and use modules for all other macros.) The instructions are below.
Open the VBA Editor by pressing Alt+F11 on your keyboard.
To put the code in a module:
- Right click on Project1 and choose Insert > Module
- Copy and paste the macro into the new module.
To put the macro code in ThisOutlookSession:
- Expand Project1 and double click on ThisOutlookSession.
- Copy then paste the macro into ThisOutlookSession. (Click within the code, Select All using Ctrl+A, Ctrl+C to copy, Ctrl+V to paste.)
More information as well as screenshots are at
Hi Diane,
Thanks for sharing these codes and ideas. Is there a way to get a warning message if I received an email from a new domain that is not listed in my outlook INBOX using a VBA code?
Your feedback is much appreciated
You could. How you do it depends on the size of the inbox - it would be too slow to check all messages each time it runs - and if you want notified only if there is a message from the domain still in the inbox or just if its a new domain you never received mail from before.
I am more interested in a warning if its a new domain that I have never received mail from before. any clues?
Thanks again, much appreciated