• Outlook User
  • New Outlook app
  • Outlook.com
  • Outlook Mac
  • Outlook & iCloud
  • Developer
  • Microsoft 365 Admin
    • Common Problems
    • Microsoft 365
    • Outlook BCM
    • Utilities & Addins

Processing Incoming E-mails with Macros

Slipstick Systems

› Developer › Processing Incoming E-mails with Macros

Last reviewed on November 4, 2021     25 Comments

The Rules Wizard is great for a lot of things when automatically processing incoming e-mails. However, when there's that one certain thing that you can't do with it, you can always be the Wizard yourself and write your own rules with VBA. However, one of the greatest challenges for developers programming with Outlook is learning how to effectively hook into application events. While it is relatively easy to gain access to objects on the fly, it is not entirely obvious where, when or how these objects should be managed. If Outlook automation was anything like most object models, it would be very straightforward.
Imagine this "fantasy" code:

Sub WorkWithNewMail()

Dim objOutlook As Outlook.Application
Dim objAllNewMail As Outlook.Items
Dim objMyEmail As Outlook.MailItem
Set objOutlook = New Outlook.Application
Set objAllNewMail = objOutlook.NewMail
For Each objMyEmail In objAllNewMail
'Do something with every e-mail received
Next
End Sub

Wouldn't this make things easier! Unfortunately, there is no magical NewMail collection. You have to build it, and hook into it at the proper time. What is essential is instantiating the necessary objects when Outlook starts. To begin, open the Visual Basic Editor (ALT+F11) and open the ThisOutlookSession module from the Project Explorer window. The first code that we need to add are module level variables that we'll declare in the general declarations section of the module at the top:

Option Explicit
Private objNS As Outlook.NameSpace
Private WithEvents objNewMailItems As Outlook.Items

The most important object in this example is objNewMailItems, as we'll soon see. The "WithEvents" statement means we are declaring this object in a way that will allow us to access not only the properties of that object, but also the events that the object exposes.

Now, we have to hook these variables up. The ThisOutlookSession module is special compared to the regular modules that you usually insert into a VBA project in Outlook - it has a "built-in" Application object variable already declared. This way you don't have to add a "Private WithEvents objApp As Outlook.Application" line or something similar in the general declarations section of the module. With that in mind, add this procedure:

Private Sub Application_Startup()
Dim objMyInbox As Outlook.MAPIFolder

Set objNS = Application.GetNamespace("MAPI")
Set objMyInbox = objNS.GetDefaultFolder(olFolderInbox)
Set objNewMailItems = objMyInbox.Items
Set objMyInbox = Nothing
End Sub

This is essentially where it all begins. As the name of the Application_Startup event indicates, this loads when Outlook launches and is essential to ensure that we gain access to e-mails delivered to the Inbox. This is done by hooking up an event aware procedure tied to the Items collection that we retrieve from the MAPIFolder object we set from the Inbox folder. The event where all the processing on incoming e-mails occurs will be here:

Private Sub objNewMailItems_ItemAdd(ByVal Item As Object)
'Ensure we are only working with e-mail items
If Item.Class <> olMail Then Exit Sub

Debug.Print "Message subject: " & Item.Subject
Debug.Print "Message sender: " & Item.SenderName &" (" & Item.SenderEmailAddress & ")";
End Sub

And that's really all there is to it! The Item object is checked to ensure that it is a MailItem object before we work with it any further.

Once it is validated, we can work with all the properties and methods of the MailItem object to do whatever we want with it. Just printing out the subject line and sender information to the Debug window like the example above is pretty boring, but there are all kinds of possibilities using code to work with e-mails in ways that the Rules Wizard can't handle:

- write e-mail info to a database
- automatically save attachments to the file system
- lookup the sender's Contact item and start a Word mail merge using their mailing address
- parse the message body for line items to be added to a spreadsheet

Those are just a few examples, but as long as whatever you want to do has an Object Model it can be done - you don't just have to automate Outlook or other Office applications.

There are a few caveats to mention though. If a large number of items are added to a folder at that same time, the ItemAdd event may not fire.

However, you can get around this if you use Outlook 2003 or newer. The NewMailEx event provides a list of all the unique EntryID values for e-mails that were delivered during the last Send/Receive cycle. These values can be used to retrieve each e-mail individually as in the ItemAdd event by using the NameSpace GetItemFromID method.

Private Sub Application_NewMailEx(ByVal EntryIDCollection As
String)
Dim objNS As Outlook.NameSpace
Dim objEmail As Outlook.MailItem
Dim strIDs() As String
Dim intX As Integer
strIDs = Split(EntryIDCollection, ",")
For intX = 0 To UBound(strIDs)
Set objNS = Application.GetNamespace("MAPI")
Set objEmail = objNS.GetItemFromID(strIDs(intX))
Debug.Print "Message subject: " & objEmail.Subject
Debug.Print "Message sender:" & objEmail.SenderName &" (" & objEmail.SenderEmailAddress & ")"
Next
Set objEmail = Nothing
End Sub

Note: The Outlook 2003 VBA help file seems to indicate that NewMailEx only works with Exchange Server mailboxes. This is not true - try it and see with POP or IMAP accounts.

Finally, don't expect this code to process e-mails the way server-side based rules do. Outlook of course has to be running for your code rules to work. For requirements where e-mail needs to be processed 24/7, see the Exchange SDK for information on building Event Sinks that run on the server.

To take this example further, there may be situations where you need to interact with e-mails that are opened rather than received. This involves a different approach and is explained in this article: Getting a Handle on Your E-mails with VBA

How to Use VBA

Copy and paste the code from this page into your ThisOutlookSession project. To do this, click within the code, Select All using Ctrl+A, Ctrl+C to copy.

In Outlook, press Alt+F11 to open the VBA editor and expand Microsoft Outlook Objects then double click on ThisOutlookSession to open it in the editing pane and Ctrl+P to paste the code.

For more detailed instructions and screenshots, see How to use Outlook's VBA Editor

Processing Incoming E-mails with Macros was last modified: November 4th, 2021 by Eric Legault
Post Views: 27

Related Posts:

  • How to use an ItemAdd Macro
  • To automatically add recipients to Contacts in Outlook using VBA
  • Save all incoming messages to the hard drive
  • Get the mailbox name from properties
    Process items in a shared mailbox

About Eric Legault

An Outlook developer MVP since 2003, Eric has completed several dozen projects using the Outlook/Exchange/SharePoint platforms, from COM Add-Ins to custom Forms, desktop applications and Windows Service applications. When not working, Eric keeps busy building relationships with technical communities via social media and by contributing to online support forums, writing technical articles and editing technical books and speaking at conferences around the world on Outlook and Office development. Eric Legault+

Comments

  1. AmronN says

    May 17, 2023 at 12:35 pm

    I have multiple email accounts/mailboxes set up in my Outlook. (my personal company account, a mailbox for windows problems, a mailbox for unix problems, and another mailbox for network problems), and I want to see if there is any way to determine the execution of one or the other code in a macro , depending on which account/mailbox the emails arrive. That is to say, if an email arrives in the Windows mailbox, a certain code of the macro is executed, if it arrives in the Linux mailbox, it executes another code within the macro and so on, executes one or the other code within a macro depending on a Which mailbox/account (FMB) does the mail arrive? Is it possible? Any ideas?... Thanks

    Reply
  2. Vic says

    May 7, 2022 at 12:38 pm

    Thanks a lot for the instructional. 
    I am trying to figure out a way to trigger different modules based on different subject lines. The goal is to forward email without an FW in the subject line and a 'forwarding' header in the body of the mail. For that, I use the outlook rule which runs a script
    **
    Sub SendNew(Item As Outlook.MailItem)
     
    Dim objMsg As MailItem
    Set objMsg = Application.CreateItem(olMailItem)

    objMsg.Body = Item.Body
    objMsg.Subject = "FW: " & Item.Subject
    objMsg.Recipients.Add "alias@domain.com"

    objMsg.Send

    End Sub
    **
    works great. problem is, I want for different names in the subject line to trigger different modules which in return will send to different email addresses. It appears that VBA accepts only one project and I cannot figure out a way to select various modules in 'rules' it offers only 1 script.

    Reply
  3. Wil Heeren says

    October 21, 2020 at 12:53 pm

    Hello
    Nice macro but here is what i would like to do.
    I have several email accounts but for 1 particular account i would like to when a new email comes into that account.

    1) open the email
    2) reply to
    3) insert an oft
    4) send
    5) close the email

    If this is at all possible ?

    Reply
  4. Saby says

    November 9, 2017 at 1:42 am

    Hi ,
    It is really working great .The only drawback I see is to use this code we have to keep outlook opened for all the time .Is there any way we can get the mails even if the Outlook is closed?
    Please provide me solutions .

    Thanks,
    Saby

    Reply
    • Diane Poremsky says

      November 21, 2017 at 12:53 am

      Sorry, no. Outlook needs to be open to use a macro. The only option when outlook is closed is server-side rules.

      Reply
  5. Peter Braun says

    January 14, 2017 at 3:23 pm

    Hi,

    Thank you very much for posting. I thought I had left this comment yesterday but it seems to have disappeared now. Did I do something wrong? Maybe I just didn’t post it correctly…

    I’m trying to run a version of your code to watch a particular folder for new items.

    The problem is that when I try to set my WithEvents variable, it seems to disappear after the Application_Startup sub finishes: it’s empty in in my watch window when I run other subs and the ItemAdd sub I built on it doesn’t fire when an item is added.

    I know I’ve assigned my variable to the right folder because the correct subject prints from the Debug.Print clntFldrItms.item(1).Subject line.

    I also know that the Application_Startup sub runs on startup because every time I open Outlook, the VBA editor opens and code has stopped at the Stop command.

    I’m using Outlook 2016 with an IMAP email address (gmail).

    All code is in ThisOutlookSession. Code below.

    Any help you can provide would be really appreciated. Thank you!

    Peter

    Option Explicit

    Public WithEvents clntFldrItms As Outlook.Items

    Private Sub Application_Startup()
    Dim clntFldr As MAPIFolder
    Set clntFldr = Application.Session.GetDefaultFolder(olFolderSentMail).Folders("Client Emails")
    Set clntFldrItms = clntFldr.Items
    Debug.Print clntFldrItms.item(1).Subject
    Stop
    End Sub

    Private Sub clntFldrItms_ItemAdd(ByVal item As Object)
    Dim bChar As String
    bChar = "/:*?™""® <>|.&@#_+©~;-+=^$!,'" & Chr(34)
    Dim saveName As String
    If item.Class = olMail Then
    saveName = item.Subject
    For x = 1 To Len(bChar)
    saveName = Replace(saveName, Mid(bChar, x, 1), "-")
    Next x
    item.SaveAs "C:UsersUserGoogle Drive8 - VBA workPreparation for Assisted ResponderSent Messages Folder" & _
    saveName & ".msg", olMSG
    End If
    End Sub

    Reply
  6. Peter Braun says

    January 13, 2017 at 11:32 am

    Hi,

    I'm having a problem with trying to use this code because my Outlook.Items variable disappears after the Application_Startup sub finishes. I've put all code in ThisOutlookSession, see below for what it is. I know it runs because the Stop is executed on startup (it's just there for troubleshooting). I've also Debug.Print the item(1) in the collection and it's correct. I feel like it's a simple mistake but for the life of me I can't figure it out. Using Outlook 2016 (mistake?).

    I've found another Slipstick post on this so posted there too. Hope not to be too annoying.

    Thank you in advance for any help you can provide.

    Peter

    Option Explicit

    Public WithEvents clntFldrItms As Outlook.Items
    'https://www.slipstick.com/developer/itemadd-macro/
    'https://www.slipstick.com/developer/processing-incoming-e-mails-with-macros/

    Private Sub Application_Startup()
    Dim clntFldr As MAPIFolder
    Set clntFldr = Application.Session.GetDefaultFolder(olFolderSentMail).Folders("Client Emails")
    Set clntFldrItms = clntFldr.Items
    Debug.Print clntFldrItms.item(1).Subject
    Stop
    End Sub

    Private Sub clntFldrItms_ItemAdd(ByVal item As Object)
    Dim bChar As String
    bChar = "/:*?™""® <>|.&@#_+©~;-+=^$!,'" & Chr(34)
    Dim saveName As String
    If item.Class = olMail Then
    saveName = item.Subject
    For x = 1 To Len(bChar)
    saveName = Replace(saveName, Mid(bChar, x, 1), "-")
    Next x
    item.SaveAs "C:UsersUserGoogle Drive8 - VBA workPreparation for Assisted ResponderSent Messages Folder" & _
    saveName & ".msg", olMSG
    End If
    End Sub

    Reply
  7. Vit says

    November 7, 2016 at 8:07 am

    Can you help me? How to adapt this macro for few accounts?

    Reply
    • Diane Poremsky says

      February 6, 2017 at 1:19 am

      You need to use ItemAdd macros if they are shared mailboxes - you need to 'watch' each folder - or use rules and run a script if they are added as accounts in your profile (itemadd will also work with accounts, but rules are usually easier).

      Reply
  8. Richard says

    September 4, 2015 at 12:57 pm

    Diane,

    Well what do you know? After ticking the 'Permanently delete...' option in global settings, it worked! And BTW, AutoArchive does appear to work on non-default accounts. It did for me, anyway. Thanks for your help, Diane.

    Reply
    • Diane Poremsky says

      September 4, 2015 at 9:58 pm

      Thanks for the update. They may have changed the behavior of autoarchive - it used to only work on the default data file. I'll have to retest it, it's been a few years.

      Reply
  9. Richard says

    September 2, 2015 at 10:59 pm

    Yes, but should 'Permanently delete old items' in the global settings box be ticked also, or only in the specific Junk E-mail folder properties? And sadly, the POP acc't that's delivering all of the spam is not the default account. I guess I'll try changing the global settings per you suggestion, and see if maybe that works.

    Reply
    • Diane Poremsky says

      September 2, 2015 at 11:07 pm

      It's up to you, but I would only set that in the folder properties. Choose move old items to... and the folder setting will override it as needed. This protects you if a folder gets set to archive - they won't be deleted permanently.

      Reply
  10. Richard says

    September 2, 2015 at 8:25 pm

    Diane,

    I've tried following your procedure to empty Junk E-mail folder via AutoArchive tool. Doesn't seem to work. I have 2 POP accounts and one IMAP account in OL 2010. All the Junk email is originating from one of the POP accounts, and all headers indicate that Outlook is the one flagging them as junk. I am using the same settings which are shown in your video, but set for one day intervals. Per your video, 'Permanently delete old items' is not checked in the global settings dialog, but it is checked in the individual Junk E-mail folder AutoArchive settings. Does the global setting to permanently delete need to be checked too??? I have individually selected "Do not auto archive...' for all other mail folders because I don't want them archived. Result is an exploding Junk E-mail folder that is not being emptied. What am I doing wrong?

    Richard

    Reply
    • Diane Poremsky says

      September 2, 2015 at 10:34 pm

      Unless things have changed, AutoArchive only works on the default data file.... but yes, you need global settings set too - you need Archive or delete old items selected.

      Reply
  11. G says

    July 25, 2014 at 9:02 am

    still no crashes - that was it.. thanks for your help!!

    Reply
  12. G says

    July 24, 2014 at 4:12 pm

    i dont call it later - well it gets called when new emails come in again i guess.

    hmm the process_args function has a few exit subs.. would that skip out set objemail = nothing if i left it outside the for loop?

    releasing it after the delete seems to be working so far... no errors yet.. but i aint holding my breathe!

    Reply
  13. G says

    July 24, 2014 at 2:45 pm

    hmm could it be because im deleting the email?

    i added this after the delete

    objEmail.Delete

    Set objEmail = Nothing

    and commented this after the for loop for now

    Set objEmail = Nothing

    Reply
    • Diane Poremsky says

      July 24, 2014 at 4:08 pm

      Possibly - but unless you call the objEmail later, it shouldn't matter that it's not released until the end - but if it works, I could be wrong.

      Reply
  14. G says

    July 24, 2014 at 2:05 pm

    here is the script in its entirety - thank you for your help - much much appreciated =)

    Option Explicit
    Private objNS As Outlook.NameSpace
    Private WithEvents objNewMailItems As Outlook.Items
    Private Sub Application_Startup()

    Dim objMyInbox As Outlook.MAPIFolder

    Set objNS = Application.GetNamespace("MAPI")
    Set objMyInbox = objNS.GetDefaultFolder(olFolderInbox)
    Set objNewMailItems = objMyInbox.Items
    Set objMyInbox = Nothing

    End Sub
    Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
    Dim objEmail As Outlook.MailItem
    Dim strIDs() As String
    Dim intX As Integer
    Dim Args As String

    strIDs = Split(EntryIDCollection, ",")
    For intX = 0 To UBound(strIDs)
    Set objEmail = objNS.GetItemFromID(strIDs(intX))

    If objEmail.SenderEmailType = "EX" Then
    If objEmail.SenderName = Application.GetNamespace("MAPI").CurrentUser Then
    If objEmail.Subject = "Magenta" Then
    objEmail.BodyFormat = olFormatPlain
    objEmail.Save

    Args = objEmail.Body
    objEmail.Delete
    Process_Args Args
    End If
    End If
    End If
    Next

    Set objEmail = Nothing

    End Sub
    Private Sub Process_Args(Args As String)

    Dim strPath As String
    Dim dash_count As Integer
    Dim WshShell As Object
    Dim sBody As Variant

    On Error GoTo ErrHandler:

    Set WshShell = CreateObject("WScript.Shell")
    strPath = WshShell.RegRead("HKLM\Software\Wow6432Node\Magenta\ScriptDir")

    strPath = strPath & "\Magenta.exe"

    If Dir(strPath) = "" Then
    SendMessage "File Path Does Not Exist:" & vbCrLf & strPath, False
    Exit Sub
    End If

    sBody = Split(Args, vbCrLf)
    Args = sBody(0)

    Args = Trim(Args)

    dash_count = Len(Args) - Len(Replace(Args, "/", ""))

    If dash_count 2 Then
    Shell strPath & " /help " & Args
    Exit Sub
    End If

    If InStr(Args, "/A") = 0 And InStr(Args, "/U") = 0 And InStr(Args, "/C") = 0 Then
    Shell strPath & " /help " & Args
    Exit Sub
    End If

    Shell strPath & " " & Args

    ErrHandler:
    'MsgBox (Err.Number)
    If Err.Number = -2147024894 Then
    SendMessage "Magenta has not been run on this PC:" & vbCrLf & Environ$("computername"), False
    End If

    End Sub
    Sub SendMessage(Message As String, DisplayMsg As Boolean, Optional AttachmentPath)

    Dim objOutlook As Outlook.Application
    Dim objOutlookMsg As Outlook.MailItem
    Dim objOutlookRecip As Outlook.Recipient
    Dim objOutlookAttach As Outlook.Attachment

    ' Create the Outlook session.
    Set objOutlook = CreateObject("Outlook.Application")

    ' Create the message.
    Set objOutlookMsg = objOutlook.CreateItem(olMailItem)

    With objOutlookMsg
    ' Add the To recipient(s) to the message.
    Set objOutlookRecip = .Recipients.Add(Application.GetNamespace("MAPI").CurrentUser)
    objOutlookRecip.Type = olTo

    ' Set the Subject, Body, and Importance of the message.
    .Subject = "Magenta Error"
    .Body = Message
    .Importance = olImportanceHigh 'High importance

    ' Add attachments to the message.
    If Not IsMissing(AttachmentPath) Then
    Set objOutlookAttach = .Attachments.Add(AttachmentPath)
    End If

    ' Resolve each Recipient's name.
    For Each objOutlookRecip In .Recipients
    objOutlookRecip.Resolve
    Next

    ' Should we display the message before sending?
    If DisplayMsg Then
    .Display
    Else
    .Save
    .Send
    End If
    End With
    Set objOutlook = Nothing

    End Sub

    Reply
  15. G says

    July 24, 2014 at 1:46 pm

    the one listed here

    https://www.slipstick.com/developer/processing-incoming-e-mails-with-macros

    Reply
    • Diane Poremsky says

      July 24, 2014 at 2:01 pm

      There are 3 there. :) The first sample has two Next statements but only 1 For line.

      Assuming the itemadd macro, you need three blocks of code (I know, its confusing the way the article is written) and they go into ThisOutlookSession. Click in Application_Startup and press the Run button then send a message to the account. It doesn't do anything useful as written - if it works, the subject, sender name and address are written to the immediate windows (View > Immediate window to see). Replace the debug.print with code that does something.

      Option Explicit
      Private objNS As Outlook.NameSpace
      Private WithEvents objNewMailItems As Outlook.Items

      Private Sub Application_Startup()

      Dim objMyInbox As Outlook.MAPIFolder

      Set objNS = Application.GetNamespace("MAPI")
      Set objMyInbox = objNS.GetDefaultFolder(olFolderInbox)
      Set objNewMailItems = objMyInbox.Items
      Set objMyInbox = Nothing
      End Sub

      Private Sub objNewMailItems_ItemAdd(ByVal Item As Object)

      Dim objEmail As Outlook.MailItem
      'Ensure we are only working with e-mail items
      If Item.Class<> OlItemType.olMailItem Then Exit Sub

      Debug.Print "Message subject: " & objEmail.Subject
      Debug.Print "Message sender: " & objEmail.SenderName &" (" & objEmail.SenderEmailAddress & ")";
      Set objEmail = Nothing
      End Sub

      Reply
  16. G says

    July 24, 2014 at 8:40 am

    actually to further add to my comment - the error i get is

    Object variable or With block variable not set (Error 91)

    Reply
    • Diane Poremsky says

      July 24, 2014 at 1:44 pm

      Which macro are you using?

      Reply
  17. G says

    July 24, 2014 at 8:39 am

    this works great thank you for posting =)

    however it crashes for me after a few emails have been received. if i restart outlook it works again but only to crash again after a few emails have been received.

    any ideas?

    thanks again for your help

    Reply

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Visit Slipstick Forums.
What's New at Slipstick.com

Latest EMO: Vol. 31 Issue 3

Subscribe to Exchange Messaging Outlook






Support Services

Do you need help setting up Outlook, moving your email to a new computer, migrating or configuring Office 365, or just need some one-on-one assistance?

Our Sponsors

CompanionLink
ReliefJet
  • Popular
  • Latest
  • Week Month All
  • Jetpack plugin with Stats module needs to be enabled.
  • Sync Issues and Errors with Gmail and Yahoo accounts
  • Error Opening iCloud Appointments in Classic Outlook
  • Opt out of Microsoft 365 Companion Apps
  • Mail Templates in Outlook for Windows (and Web)
  • Urban legend: Microsoft Deletes Old Outlook.com Messages
  • Buttons in the New Message Notifications
  • Move Deleted Items to Another Folder Automatically
  • Open Outlook Templates using PowerShell
  • Count and List Folders in Classic Outlook
  • Google Workspace and Outlook with POP Mail
Ajax spinner

Recent Bugs List

Microsoft keeps a running list of issues affecting recently released updates at Fixes or workarounds for recent issues in classic Outlook (Windows).

For new Outlook for Windows: Fixes or workarounds for recent issues in new Outlook for Windows .

Outlook for Mac Recent issues: Fixes or workarounds for recent issues in Outlook for Mac

Outlook.com Recent issues: Fixes or workarounds for recent issues on Outlook.com

Office Update History

Update history for supported Office versions is at Update history for Office

Outlook Suggestions and Feedback

Outlook Feedback covers Outlook as an email client, including Outlook Android, iOS, Mac, and Windows clients, as well as the browser extension (PWA) and Outlook on the web.

Outlook (new) Feedback. Use this for feedback and suggestions for Outlook (new).

Use Outlook.com Feedback for suggestions or feedback about Outlook.com accounts.

Other Microsoft 365 applications and services




New Outlook Articles

Sync Issues and Errors with Gmail and Yahoo accounts

Error Opening iCloud Appointments in Classic Outlook

Opt out of Microsoft 365 Companion Apps

Mail Templates in Outlook for Windows (and Web)

Urban legend: Microsoft Deletes Old Outlook.com Messages

Buttons in the New Message Notifications

Move Deleted Items to Another Folder Automatically

Open Outlook Templates using PowerShell

Count and List Folders in Classic Outlook

Google Workspace and Outlook with POP Mail

Newest Code Samples

Open Outlook Templates using PowerShell

Count and List Folders in Classic Outlook

Insert Word Document into Email using VBA

Warn Before Deleting a Contact

Use PowerShell to Delete Attachments

Remove RE:, FWD:, and Other Prefixes from Subject Line

Change the Mailing Address Using PowerShell

Categorize @Mentioned Messages

Send an Email When You Open Outlook

Delete Old Calendar Events using VBA

VBA Basics

How to use the VBA Editor

Work with open item or selected item

Working with All Items in a Folder or Selected Items

VBA and non-default Outlook Folders

Backup and save your Outlook VBA macros

Get text using Left, Right, Mid, Len, InStr

Using Arrays in Outlook macros

Use RegEx to extract message text

Paste clipboard contents

Windows Folder Picker

Custom Forms

Designing Microsoft Outlook Forms

Set a custom form as default

Developer Resources

Developer Resources

Developer Tools

VBOffice.net samples

SlovakTech.com

Outlook MVP David Lee

Repair PST

Convert an OST to PST

Repair damaged PST file

Repair large PST File

Remove password from PST

Merge Two Data Files

Sync & Share Outlook Data

  • Share Calendar & Contacts
  • Synchronize two computers
  • Sync Calendar and Contacts Using Outlook.com
  • Sync Outlook & Android Devices
  • Sync Google Calendar with Outlook
  • Access Folders in Other Users Mailboxes

Diane Poremsky [Outlook MVP]

Make a donation

Mail Tools

Sending and Retrieval Tools

Mass Mail Tools

Compose Tools

Duplicate Remover Tools

Mail Tools for Outlook

Online Services

Calendar Tools

Schedule Management

Calendar Printing Tools

Calendar Reminder Tools

Calendar Dates & Data

Time and Billing Tools

Meeting Productivity Tools

Duplicate Remover Tools

Productivity

Productivity Tools

Automatic Message Processing Tools

Special Function Automatic Processing Tools

Housekeeping and Message Management

Task Tools

Project and Business Management Tools

Choosing the Folder to Save a Sent Message In

Run Rules on messages after reading

Help & Suggestions

Submit Outlook Feature Requests

Slipstick Support Services

Buy Microsoft 365 Office Software and Services

Visit Slipstick Forums.

What's New at Slipstick.com

Home | Outlook User | Exchange Administrator | Office 365 | Outlook.com | Outlook Developer
Outlook for Mac | Common Problems | Utilities & Addins | Tutorials
Outlook & iCloud Issues | Outlook Apps
EMO Archives | About Slipstick | Slipstick Forums
Submit New or Updated Outlook and Exchange Server Utilities

Send comments using our Feedback page
Copyright © 2026 Slipstick Systems. All rights reserved.
Slipstick Systems is not affiliated with Microsoft Corporation.