Posted by: Anthony Drewery | October 27, 2006

VBScript to export SMTP proxy addresses

Part of the way my current employer has grown is through acquisitions and mergers. Consequently we’ve been supporting more than 10 legacy SMTP domains from various shipping lines. Now that we’re decommissioning our systems it’s time to do some housekeeping and discontinue these domains.

The first step was to check that all objects had their primary SMTP address set to the main domain name. This was done more than a year ago but needed to be reconfirmed. A custom LDAP query that included the syntax  (!mail=* sufficed.

Next I wrote a script that exported all SMTP proxy addresses for user objects. This was to be used as a reference in the unlikely event that problems arose down the line. The LDAP query can easily be modified for groups, contacts and public folders. It’s not the most exciting of scripts but it does the job. You can download it here: AllSMTPProxies.vbs.txt

As I wanted to be very specific and meticulous in the removal of legacy proxy addresses I wrote another script that targets a specific SMTP domain. In this script you can specify the domain by changing the strSMTPDomain value. The script will then only export the names and addresses for proxies that match the SMTP domain. You can download the script here: SpecificSMTPProxies.vbs.txt

In my next post I’ll be using PutEx in a script to remove proxy addresses from AD objects.


  1. Is there any way to have this script also export public folder and Distribution list addresses. It worked great for my users, but I also need a report of public folder and DL SMTP addresses…


  2. Just update the LDAP string for different object classes. For example:
    strLDAP = ";(&(mailnickname=*)(objectClass=publicfolder));adspath;subtree"
    strLDAP = ";(&(mailnickname=*)(objectClass=group));adspath;subtree"
  3. I use a script to upload a white list to our spam filter provider. My problem is that I can get all mail addresses and all DL addresses. I cannot get the secondary smtp addresses. Is this possible.

    primary = jim.gingrich
    James.gingrich is not returned in the query.
    Thanks in Advance

  4. The current script is looking for = “smtp:”, so the script only pulls the secondary addresses. Primary addresses are formatted in CAPS, so you can force all address to lower-case by using the LCase() function:

    For Each Address In arrProxyAddresses
    If LCase(left(Address,5))= “smtp:” Then
    objTextFile.writeLine(FoundObject.Displayname & vbTab & Address)

    That’s it! Nice and simple.

    Good Luck
    End if

  5. How would you go about modifying the script to connect to a different domain? We run a resource domain model and my machine is not a member of the domain that holds the Exchange Org.


  6. The script does not handle users with only one primary SMTP proxy address.

  7. When I modify your script to use the group or public folder object class the following is returned when the script executes: “(49, 2) Microsoft VBScript runtime error: Object not a collection”. No output is generated. Any idea what would cause this?


  8. Hi,
    I also recived the folllowinmg error, one txt file is created, but only with 3 to 4 names, the script gave the following error
    Line: 49
    Char: 2
    Error: Obejct not a collection
    Code : 800A01c3
    Source: Microsoft VBScript runtime error

  9. I had the same error…
    Line: 49
    Char: 2
    Error: Obejct not a collection
    Code : 800A01c3
    Source: Microsoft VBScript runtime error

    I found out that some users had no secondary address (proxyAddress) and the script failed because it can’t process it.
    To solve this I added the line:
    If IsArray(arrProxyAddresses) Then…
    before the line:
    For Each Address In arrProxyAddresses…
    to verify that arrProxyAddresses was an array (collection) before it gets processed as one.

  10. I edited the script to gather all mail enabled groups – and didn’t change “smtp:” – so it pulled all groups that had proxy addresses, and then bombed out when it got to one that didn’t have a “smtp:” lowercase. I simply changed the line to “SMTP:” and that grabbed and listed the primary SMTP address for each group. Simple enough.

    If left(Address,5)= “SMTP:” Then

  11. Wav… exactly what I needed


  12. Great blog, reading it through RSS feed as well

  13. What if you want to export non-SMTP types? Like CCMail or DIR? I tried updating the script to:

    If left(Address,5)= “DIR:” Then

    and it finds nothing. Works great for smtp: and SMTP:

    any thoughts?

  14. Is there any way to modify this script to import SMTP proxy addresses? Basically with the exported text file from this script I would like to do a find and replace with the new domain name and then import this back into Exchange.

  15. Don’t forget if you do follow Alex’s suggestion you need to put an END IF in after the NEXT so the whole code segment reads:

    Set FoundObject = GetObject (rs.Fields(0).Value)
    arrProxyAddresses = FoundObject.proxyAddresses
    If IsArray(arrProxyAddresses) then
    For Each Address In arrProxyAddresses
    If left(Address,5)= “smtp:” Then
    objTextFile.writeLine(FoundObject.Displayname & vbTab & Address)
    End if
    end if

  16. Is there anyway this script can output all publicfolders that have the “hide from address book” flag set

    if not does anybody know how to get a list of publicfolders that are email enabled and change the msExchHideFromAddressLists to false so that they do show in the addressbook.

    thanks in advance

    • Andy,

      If you just run a script to change the HideFromAddressLists field on all groups with the ‘On Error Resume Next’ in the script, it should work. It will fail on those with it already unchecked, but still continue. Let me know if this works.

  17. Wondering if there is a way to get this script to read a list of users from a txt file to process. Need to update the email addresses of groups of users after they ar migrated to the new domain. I already have it modified to make the change to the email addresses, just need to read users from a text file and add the line to update the users account.

    Thanks in advance

  18. Hi thanks for the response, however I’m not sure how to run the script over all objects. any clues

  19. Great script BUT, can the export NOT include the word smtp: before the addresses?

  20. jaysus, just edit the script and remove “smtp:”

  21. What a great little script! Vesatile and easy to show primary as well as secondary proxies.

  22. […] Export the X500 addresses from Exchange 2003 server (You can refer to this link on how to do […]

    • For the object not a collection, that means there wasn’t any addresses in the proxyAddresses list and the script is expecting a collection therefore failing. To ignore this error, add to the first line of code:

      On Error Resume Next

      also to capture both Primary(SMTP:) and Secondary(smtp:) change the line:

      If Left(Address,5)= “smtp:” then


      If Left(LCase(Address),5)= “smtp:” Then

      this will convert all strings in the address to lowercase prior to processing the line.

      To export x500 addresses, change the

      If Left(LCase(Address),5)= “smtp:” Then


      If Left(LCase(Address),5)= “x500:” Then

      and the same for x400.

  23. to remove the SMTP prior to exporting, you can change this line as well:

    objTextFile.writeLine(FoundObject.Displayname & vbTab & Address)


    objTextFile.writeLine(FoundObject.Displayname & vbTab & replace(replace(Address,”SMTP:”,””),”smtp:”,””)

    removing the SMTP from the search string will export all addresses, not just SMTP.

    Or you could just put the results in excel after and edit/replace.

  24. […] Export the X500 addresses from Exchange 2003 server (You can refer to this link on how to do […]

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s


%d bloggers like this: