I hear from a lot of users who don't like how Outlook handles sent items with an IMAP account. 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 from the IMAP server to determine the sent items folder, but if the IMAP server doesn't support XLIST, the sent item might be saved locally. Outlook 2016 and newer handles it better, using the folder the server uses or one named Sent Items.
For Exchange users, Sent Items are stored in the account's mailbox (and have an option use the option to Save sent items with the original, if not in the Inbox). But Shared mailboxes save a copy in the users own Sent Items folder by default, but the shared mailbox may be configured save a copy in the shared mailbox sent folder too.
You can solve this 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 the macros on this page, 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 and newer, 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
Move Sent mail from Shared Mailbox
This version of the macro works with Exchange Server shared mailboxes. It can either use the GetfolderPath function or resolve the shared mailbox. The Exchange server needs to be configured to save sent items in the shared mailbox.
Private WithEvents olSentItems As Items Dim olSent As folder Dim olInbox As folder Private Sub Application_Startup() Dim objNS As NameSpace Set objNS = Application.Session ' Uses GetFolderPath Function ' Set olSentItems = GetFolderPath("Outlook Sales\Sent Items").Items ' Set olInbox = GetFolderPath("Outlook Sales\Inbox") ' looks up shared mailbox name Dim objOwner As Outlook.Recipient Set NS = Application.GetNamespace("MAPI") Set objOwner = NS.CreateRecipient("olsales") objOwner.Resolve If objOwner.Resolved Then ' MsgBox objOwner.Name Set olInbox = objNS.GetSharedDefaultFolder(objOwner, olFolderInbox) ' Because using objNS.GetSharedDefaultFolder(objOwner, olFolderSentMail) triggers an error Set olSentFolder = olInbox.Parent.Folders("Sent Items") Set olSentItems = olSentFolder.Items End If Set objNS = Nothing End Sub Private Sub olSentItems_ItemAdd(ByVal Item As Object) MsgBox "New Item" Item.Move olInbox 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 (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
Hi
What is the code for macro to archive sent emails from a specific shared mailbox to the shared sent folder?Now the sent email is archived in the sent personal folder
This part of the shared mailbox code gets the sent folder -
Set olInbox = objNS.GetSharedDefaultFolder(objOwner, olFolderInbox)
Set olSentFolder = olInbox.Parent.Folders("Sent Items")
Where should it be archived?
This line moves it to the Inbox -
Item.Move olInbox
If you want mail your send from the shared mailbox to go into the shared mailbox sent folder, that can be done using a registry key or the admin can configure exchange to do it.
Save Sent Items in Shared Mailbox Sent Items folder (slipstick.com)
Hi
Dear Diane,
Can you explain in a short video?
I need move all messages from IMAP sent folder to a PST outlook 2019 folder every time.
Hi, I have multiple POP3 inboxes in Outlook and a single IMAP account. Can you provide the complete VBA code I can use to ensure that any Sent emails from any of the POP3 accounts (wildcard ideally rather than having to specify each account) also get copied/moved to the sent folder of the IMAP account?
A wild card won't work - you need to watch each Sent folder.
Private WithEvents olSentItemsA As Items
Private WithEvents olSentItemsB As Items
Private WithEvents olSentItemsC As Items
Set olSentItemsA = GetFolderPath("AcctA\Sent Items").Items
Set olSentItemsB = GetFolderPath("AcctB\Sent Items").Items
Set olSentItemsC = GetFolderPath("AcctC\Sent Items").Items
And you need an ItemAdd for each -
Private Sub olSentItemsA_ItemAdd(ByVal Item As Object)
Item.Move olInbox
End Sub
Private Sub olSentItemsB_ItemAdd(ByVal Item As Object)
Item.Move olInbox
End Sub
Private Sub olSentItemsC_ItemAdd(ByVal Item As Object)
Item.Move olInbox
End Sub
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?