Improve company productivity with a Business Account.Sign Up


Display Sending Server IP from the Header in Outlook Field

Posted on 2009-04-08
Medium Priority
Last Modified: 2012-05-06
Is it possible to add a field in Outlook that will display the sending servers IP address? I am using the SPF check field from Microsoft already. I am looking for something similar. Here's what I want to accomplish:

Emails tagged as spam by GFI on the Exchange Server are forwarded to a designated "SPAM" mailbox to catch any legit emails for fallback purposes. I'd like to sort all emails in this box by the sending servers IP address.
Question by:lewisig
  • 5
  • 4
LVL 76

Expert Comment

by:David Lee
ID: 24097327
Hi, lewisig.

From an Outlook client perspective "yes" that is possible, but it will require some scripting.  A script will have to retrieve the header, parse it for the sending server's IP address, create a user-defined property in the Outlook item, insert the IP address in the property, and save the item.  The script will have to run at the client.  I can help with the script and instructions for using it if you want to go this route.

Author Comment

ID: 24097457
Sounds appropriate. Unfortunately, I do not know scripting well so any help would be appreciated.
LVL 76

Expert Comment

by:David Lee
ID: 24098245
No problem.  What version of Outlook do you use?
Problems using Powershell and Active Directory?

Managing Active Directory does not always have to be complicated.  If you are spending more time trying instead of doing, then it's time to look at something else. For nearly 20 years, AD admins around the world have used one tool for day-to-day AD management: Hyena. Discover why


Author Comment

ID: 24098362
2003 and 2007.  If it has to be one, let's go with 2003
LVL 76

Accepted Solution

David Lee earned 250 total points
ID: 24120318
Here's the code for doing this.  Follow these instructions to use it.

1.  Start Outlook
2.  Click Tools > Macro > Visual Basic Editor
3.  If not already expanded, expand Microsoft Office Outlook Objects
4.  If not already expanded, expand Modules
5.  Select an existing module (e.g. Module1) by double-clicking on it or create a new module by right-clicking Modules and selecting Insert > Module.
6.  Copy the code from the Code Snippet box and paste it into the right-hand pane of Outlook's VB Editor window
7.  Edit the code as needed.  I included comments wherever something needs to or can change
8.  Click the diskette icon on the toolbar to save the changes
9.  Close the VB Editor
10. Select one or more messages.
11. Run the macro GetSIP

The macro will get the sending server's IP, or at least attempt to (I'll explain that below), and store it in an Outlook user property.  All you'll need to do is modify a view by adding the field to it.  The field name is SendingServer.

I cannot guarantee that the code will get the sending server's IP.  There's nothing unique that marks that IP.  If the header has multiple entries, then it's possible that the code will return the wrong one.
Sub GetSIP()
    Dim olkItem As Outlook.MailItem, olkProp As Outlook.UserProperty
    For Each olkItem In Outlook.Application.ActiveExplorer.Selection
        Set olkProp = olkItem.UserProperties.Find("SendingServer", True)
        If TypeName(olkProp) = "Nothing" Then
            Set olkProp = olkItem.UserProperties.Add("SendingServer", olText, True)
        End If
    olkProp.Value = GetSenderIP(Outlook.Application.ActiveExplorer.Selection(1))
    Set olkProp = Nothing
    Set olkItem = Nothing
End Sub
Function GetSenderIP(olkItem As Outlook.MailItem)
    'Set the error handler to allow us to handle errors in code
    On Error Resume Next
    'Declare a constant
    'Declare a few variables
    Dim mapSession As Object, _
        mapMessage As Object, _
        mapFields As Object, _
        strHeader As String, _
        arrHeaders As Variant, _
        varHeader As Variant, _
        intLeftBracket As Integer, _
        intRightBracket As Integer, _
        strIP As String
    'Create a CDO session and login to it using the existing Outlook session
    Set mapSession = CreateObject("MAPI.Session")
    mapSession.Logon , , False, False, 0
    'Get the selected message's ID
    Set mapMessage = mapSession.GetMessage(olkItem.EntryID, olkItem.Parent.StoreID)
    'Get message fields
    Set mapFields = mapMessage.Fields
    'Get the Internet header
    strHeader = mapFields.Item(CdoPR_TRANSPORT_MESSAGE_HEADERS).Value
    If Err.Number = 0 Then
        arrHeaders = Split(strHeader, vbCrLf)
        For Each varHeader In arrHeaders
            If Left(varHeader, 9) = "Received:" Then
                intLeftBracket = InStr(1, varHeader, "[")
                intRightBracket = InStr(1, varHeader, "]")
                If (intLeftBracket > 0) And (intRightBracket > 0) Then
                    If intRightBracket > intLeftBracket Then
                        strIP = Mid(varHeader, intLeftBracket + 1, intRightBracket - intLeftBracket - 1)
                        If strIP <> "" Then
                            GetSenderIP = strIP
                        End If
                    End If
                End If
            End If
    End If
    'Logout of the CDO sesison
    'Clean up
    Set mapSession = Nothing
    Set mapMessage = Nothing
    Set mapFields = Nothing
End Function

Open in new window


Author Comment

ID: 24147347
Instead of running a macro on selected messages, is there a method to extract the unique header information to a column for sorting? Can the unigue mark to identify the sending mail server in the message header be the combination of "Received: from" and "by"?


Received: from JSTQIDTOA ([] RDNS failed) by
Received: from ([]) by
LVL 76

Expert Comment

by:David Lee
ID: 24153015
"is there a method to extract the unique header information to a column for sorting"
That's exactly what the code is doing.  A column is composed of the values of a given property for each item.  The information you want from the header isn't part of Outlook's object model, i.e. it's not a property.  So the first step is to read each message (each selected message), pull that information from the header, and put it into a user-defined property.  That's what allows you to add a column showing the information.  

"Can the unigue mark to identify the sending mail server in the message header be the combination of "Received: from" and "by"?"
Sure.  But how does that help if the message passed through 4 or 5 servers on its way to you?  So long as the server names are all in order and all messages headers are formatted in exactly the same way, then the code should work without any problem.  My point was that none of the servers listed in the header are uniquely marked or tagged as being the server of origin.  

Author Comment

ID: 24487672
Never got around to this, sorry. Found a work around.
LVL 76

Expert Comment

by:David Lee
ID: 24487781
I don't mind that you found a workaround, but why give me the lowest grade possible for putting in the effort to help out?

Featured Post

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Though there are a few manual ways to import PST files to Office 365 , third-party PST to Office 365 import tools are preferred over them due to various reasons.  Consequently, many tools or services are available for the same. Here, we pick the to…
You can use the network upload option and the Office 365 Import service to bulk-import PST files to user mailboxes. Network upload means that you upload the PST files a temporary storage area in the Microsoft cloud.
This video shows how to quickly and easily deploy an email signature for all users in Office 365 and prevent it from being added to replies and forwards. (the resulting signature is applied on the server level in Exchange Online) The email signat…
Whether it be Exchange Server Crash Issues, Dirty Shutdown Errors or Failed to mount error, Stellar Phoenix Mailbox Exchange Recovery has always got your back. With the help of its easy to understand user interface and 3 simple steps recovery proced…

607 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question