Use Hashtables to Audit Proxy Addresses Prior to Exchange Online Migration

I've recently had a customer ask me if there was a way we could get an idea of what recipient domains within their organization are being used as proxy addresses on their mailboxes in Exchange. Determining recipient domains that were in use was critical to this customer, as they would not be able to migrate mailboxes with proxy addresses that were not added as Accepted Domains in Exchange Online, as you'll see an error similar to the one below:

You can't use the domain because it's not an accepted domain for your organization.

I wasn't aware of any built-in reporting in Exchange that would do this, so once I had the requirements of what they were looking for, I went to work in PowerShell. What I found was if we were able to gather the emailAddresses field from all of the mailboxes in the on-premises organization, we could get can accurate count of the various recipient domains are in use within the on-premises Exchange environment.

My approach:

  1. Pull all of the mailboxes within Exchange On-premises (this may take a while depending on how many mailboxes you have in your organization), and place in a variable.
  2. Create an empty hashtable.
  3. Declare an "addresses" variable, which will contain all addresses within the EmailAddresses variable on the mailbox.
  4. Create a foreach loop that goes through each value specified within the "addresses" variable.
  5. Create a "pos" (position) variable that will hold the position of the "@" symbol within the SMTP address passed through the loop.
  6. Create a "suffix" variable that will return a substring of the email address (everything after the "@" symbol in the SMTP address).
  7. Add the suffix to the hashtable (if it exists).
  8. Sort the hashtable in descending order, and export to a .txt file.

If all works as expected, a txt file should be created that looks something like this:





From there, we could look at the mailboxes that have these addresses stamped on them and remove as necessary:

 Get-Mailbox -ResultSize Unlimited | ? {$_.EmailAddresses -like **}

Below you will find the proof-of-concept for what is described above for this process. Please note that this script should be tested prior to running in any sort of production environment.


Feel free to leave a comment with any questions you may have. Happy migrating!