Skywalker2 has a problem:
I exported my email from Outlook Express to Outlook 2007 as per your Article "Moving from Outlook Express to Outlook". I have 2 pop3 email accounts setup. The emails in all the exported folders display the same account (only one account). I would like to be able to see which email account each email was sent to, without having to open the email and read the header.

The macro below will change the account shown in the Email Account field and replies will use that account AFTER you refresh the folder. (Switch to another folder then come back). This will work on POP3 and IMAP messages provided the IMAP messages are in a local pst. It won't work on Exchange mailboxes. The macro runs on selected messages so you easily test it on a small number of messages before running it on all of your messages.
I tested this code in Outlook 2013 and it should work with at least Outlook 2007 and Outlook 2010. It may work with older versions.
You need to install Redemption and set it as a reference in Outlook's VB Editor (Tools, References).
- Open the VB Editor using Alt+F11.
- Right click on Project1 and choose Insert > Module.
- Copy the code below and paste into the new module.
- Set the reference to Redemption in Tools, References.
- Change the email address and account name in the code before running the ChangeAccount macro.
Select the messages you want to check then run the macro.
Option Explicit
Private Const PR_HEADERS = &H7D001E
Private Const PR_ACCOUNT = &H80F8001E
Sub ChangeAccount()
On Error Resume Next
Dim objItem As Outlook.MailItem
For Each objItem In Application.ActiveExplorer.Selection
' Check if this was sent to a specific address
If CheckMessageRecipient(objItem, "alias@domain.com", False) Then
' If yes, change the account
Call SetMessageAccount(objItem, "Account name as shown in Account settings", True)
End If
Next
Set objItem = Nothing
End Sub
Public Function CheckMessageRecipient( _
ByRef oItem As MailItem, _
ByVal strMatch As String, _
Optional ByVal blnExact As Boolean = False) As Boolean
' Check if the supplied string matches the recipient of the email. We use the internet headers and check
' the first part of the string if we can. The match can be made exact or not
Const TC_HEADER_START As String = "Delivered-To:"
Const TC_HEADER_END As String = "Received:"
Dim strHeader As String
Dim intStart As Integer
Dim intEnd As Integer
Dim strRecipient As String
' First get the header and see if it makes sense
strHeader = GetInternetHeaders(oItem)
intStart = InStr(1, strHeader, TC_HEADER_START, vbTextCompare)
If intStart = 0 Then intStart = 1
intEnd = InStr(intStart, strHeader, vbCrLf & TC_HEADER_END, vbTextCompare)
If intEnd = 0 Then
' The headers are unreliable so just check the whole string
strRecipient = strHeader
Else
' Found headers so grab the recipient data
strRecipient = Trim$(Mid$(strHeader, intStart + Len(TC_HEADER_START), _
intEnd - (intStart + Len(TC_HEADER_START))))
End If
' Now undertake the check
If blnExact Then
CheckMessageRecipient = (strRecipient = strMatch)
Else
CheckMessageRecipient = (InStr(1, strRecipient, strMatch, vbTextCompare) > 0)
End If
End Function
Public Sub SetMessageAccount(ByRef oItem As MailItem, _
ByVal strAccount As String, _
Optional blnSave As Boolean = True)
Dim rMailItem As Redemption.RDOMail
Dim rSession As Redemption.RDOSession
Dim rAccount As Redemption.RDOAccount
' Use a RDO Session object to locate the account that we are interested in
Set rSession = New Redemption.RDOSession
rSession.MAPIOBJECT = Application.Session.MAPIOBJECT
Set rAccount = rSession.Accounts(strAccount)
' Now use the RDO Mail object to change the account to the one we require
Set rMailItem = rSession.GetMessageFromID(oItem.EntryID)
rMailItem.Account = rAccount
If blnSave Then
' Force a save to the mail object
rMailItem.Subject = rMailItem.Subject
rMailItem.Save
End If
Set rMailItem = Nothing
Set rAccount = Nothing
Set rSession = Nothing
End Sub
Public Function GetInternetHeaders(ByRef oItem As MailItem) As String
Dim rUtils As Redemption.MAPIUtils
' Return the internet header of a message
Set rUtils = New Redemption.MAPIUtils
GetInternetHeaders = rUtils.HrGetOneProp(oItem.MAPIOBJECT, PR_HEADERS)
Set rUtils = Nothing
End Function
More Information
If you want to set the account when you download email, see VBA Adventures: Automatic Email Account Assignment in Outlook
If you don't care about the account name but want the message to be sent using the correct account, see Reply using the address a message was sent to