I hear from a lot of user's who don't like how Outlook handles sent items with an IMAP accounts. In older versions of Outlook, IMAP sent items use the local Sent Items folder. While Outlook 2007 and 2010 can be configured to use the IMAP sent folder, when you use a Send by email command in other applications, the sent item goes into the local data file, ignoring the account configuration. Outlook 2013 uses XLIST to determine the sent items folder, but if the IMAP server doesn't support XLIST, the sent item is saved locally.
This macro solves the problem by monitoring the sent items folder and moving sent messages to the desired folder.
Outlook 2013 users who want to move IMAP messages to a local pst file can use this macro too, however, it will not move the messages immediately. They need to sync down from the IMAP server first.
To use this macro, you need to use the GetFolderPath macro from GetFolderPath.
You'll also need to set macro security to low to test the macro.
Press Alt+F11 to open the VBA editor. Expand Project1 and Microsoft Outlook Objects then double click on ThisOutlookSession. Paste the code into ThisOutlookSession. GetFolderPath can be pasted below this macro or in a new module.
To use this with multiple accounts, copy the IF... End IF block and change the account name and folder path for each account.
The account name and the data file name are usually the same - in Outlook 2010, both are the email address by default.
You need to use the account name as seen in File, Account Settings (or in the From field if you have multiple accounts) and the data file name (and path to the Sent folder) as seen in the folder list.
You can get the path to the sent folder from folder properties. Right click on the sent folder, choose Properties. Select the path from the Location field (without the \\) and the folder name from the name field.
Note: this macro will work with any account type.
These macros start when Outlook starts. To test it without restarting Outlook, click in the Application_Startup macro and click the Run button (or press F5).
Only move sent mail from one account
This macro checks the sender address and only moves mail sent from that address.
Private WithEvents Items As Outlook.Items Private Sub Application_Startup() Set Items = Session.GetDefaultFolder(olFolderSentMail).Items End Sub Private Sub Items_ItemAdd(ByVal Item As Object) If Item.SendUsingAccount = "alias@domain.com" Then ' Get the GetFolderPath function from http://slipstick.me/getfolderpath Set MovePst = GetFolderPath("data file name\Inbox\Sent") Item.Move MovePst End If End Sub
Using Multiple IMAP accounts in Outlook 2013 and newer
Beginning with Outlook 2013, IMAP sent messages are stored in the IMAP account's sent folder and you'll need to watch each sent folder for new items.
Because each account in this example is moving sent items to the same data file, we can set the MovePst as a global variable.
This macro will also work with Exchange accounts and POP accounts that have their own pst files for incoming mail.
Private WithEvents Items As Outlook.Items Private WithEvents GmailItems As Outlook.Items Private WithEvents AliasItems As Outlook.Items Dim MovePst As Outlook.Folder Private Sub Application_Startup() 'watch default account sent folder Set Items = Session.GetDefaultFolder(olFolderSentMail).Items ' Use the GetFolderPath function from http://slipstick.me/getfolderpath 'watch other sent folders Set GmailItems = GetFolderPath("me@gmail.com\[Gmail]\Sent Mail").Items Set AliasItems = GetFolderPath("diane@domain.com\Sent Items").Items ' set move pst Set MovePst = GetFolderPath("Outlook Data File\Sent Items") End Sub Private Sub Items_ItemAdd(ByVal Item As Object) Item.Move MovePst End Sub Private Sub GmailItems_ItemAdd(ByVal Item As Object) Item.Move MovePst End Sub Private Sub AliasItems_ItemAdd(ByVal Item As Object) Item.Move MovePst End Sub
Multiple IMAP accounts in Outlook 2010 and older
If you are using multiple accounts, you can use IF statements to selectively move messages. This works with Outlook 2010 and older only, because Sent items are moved into the default pst.
Private WithEvents Items As Outlook.Items Private Sub Application_Startup() Set Items = Session.GetDefaultFolder(olFolderSentMail).Items End Sub Private Sub Items_ItemAdd(ByVal Item As Object) ' Get the GetFolderPath function from http://slipstick.me/getfolderpath If Item.SendUsingAccount = "alias@domain.com" Then Set MovePst = GetFolderPath("data file name\Inbox\Sent") ElseIf Item.SendUsingAccount = "alias@domain1.com" Then Set MovePst = GetFolderPath("data file name1\Inbox\Sent") ElseIf Item.SendUsingAccount = "alias@domain2.com" Then Set MovePst = GetFolderPath("data file name2\Inbox\Sent") Else Exit Sub ' Item.UnRead = False Item.Move MovePst End If End Sub
You could also use Case statements to set the correct Move path.
Move all sent messages
This macro assumes you have only one IMAP account in Outlook 2013 (and it's set as default data file) or one or more POP accounts in Outlook using the same data file and want to move the mail sent from all accounts to a different folder.
Outlook 2013 (and newer) users who want to move IMAP messages to a local pst file can use this macro too, however, it may not move the messages immediately. Sent messages need to sync down from the IMAP server first.
Private WithEvents Items As Outlook.Items Private Sub Application_Startup() Set Items = Session.GetDefaultFolder(olFolderSentMail).Items End Sub Private Sub Items_ItemAdd(ByVal Item As Object) ' You need the GetFolderPath function from http://slipstick.me/getfolderpath Set MovePst = GetFolderPath("data file name\Inbox\Sent") Item.UnRead = False Item.Move MovePst 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.
The macros on this page need to go into ThisOutlookSession.
Open the VBA Editor by pressing Alt+F11 on your keyboard.
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 How to use the VBA Editor
Dear Diane,
ı hope you are well, I would like when ı try to modified your code in outlook ,outlook cant find recipient or To . would you help me.
Private WithEvents Items As Outlook.Items
Private Sub Application_Startup()
Set Items = Session.GetDefaultFolder(olFolderSentMail).Items
End Sub
Private Sub Items_ItemAdd(ByVal Item As Object)
Dim RecipientAddress As Variant
If RecipientAddress = " John, Smith (Canada) " or " john.smith@example.com"
' Get the GetFolderPath function from http://slipstick.me/getfolderpath
Set MovePst = Outlook.Session.Folders("2020").Folders("sent").Folders("ABC")
Item.Move MovePst
'End If
End Sub
when I made If statement with recipient / To doesnt check and move correct destionation.
what is my mistake ?
best Regards
Tumer
Hi
I have macro that macro send emails with attachment but 500 emails to send so i can not add those in sent item folder
from setting i remove this add after sending email to sent item folder
problem is some emails send without attachments so i want identify which emails sent with & without attachments so please tell me any macro that copy paste emails from sent item folder paste in particular folder (Folder is created on Desktop) & then delete that permanently
Please help me
Please help me! I want save sent item as .msg to disk outlook use IMAP protocol
You want to do this using macros? See https://www.slipstick.com/developer/code-samples/save-selected-message-file/ - there is one for sent messages. If you just want to save one or two now and again, you can drag the message from sent items to the hard drive. or open it and use the same command.
Thanks for the tutorial. I would like to use this script for a slightly different function: I need to save the emails added to the "Sent" folder in a local archive, without removing them from "Sent" folder.
I tried this:
Private Sub Items_ItemAdd(ByVal Item As Object)
If Item.SendUsingAccount = "name.surname@domain.com" Then
Set MovePst = GetFolderPath("abcd\Fold")
Dim Copied As Object
Set Copied= Item.copy
Copied.Move MovePst
End If
End Sub
But it returns "Run-time error '-2147221233 (8004010f)'"
Can you help with this? Thank you in advance.
I was finding IMAP way too complicated...I decided to go back to all pop accounts but I still would like to try something else. What are your thoughts on Google Apps Sync for Outlook?
I'm wondering if this would work for Aliases...I decided to switch from POP3 to IMAP (Google Apps) because I wanted to be able to sync with another computer, but I had 3 other aliases configured as additional email addresses with their own pop/smtp settings....I just disabled the ability to retrieve email and used them for sending purposes. I tried doing that with IMAP, but it seems to create a separate set of folders for each alias...somehow I think this configuration doesn't really work with aliases at least this macro might be able to move between IMAP accounts.
The method you tried *should* work, but like you said, imap creates more folders. Setting it up as a pop3 account would work.
https://www.slipstick.com/outlook/config/how-to-create-a-fake-pop3-account/
The macro can move the sent mail into the gmail imap folder.
Using VBA and Outlook for the first time (2010 Version) I get an error with MovePST variable not defined. I have copied your code verbatim and annotated as necessary.
That usually means something was not declared and you are using option explicit. Add this as the first line under
Private Sub Items_ItemAdd(ByVal Item As Object):
Dim MovePst as Outlook.folder
if that errors, use just
Dim MovePst
Many thanks, Diane - this is now working perfectly. Thank you so much for your help - much appreciated.