Home » Exchange Server » Tracking Read Status of Email Messages in Exchange Server

Tracking Read Status of Email Messages in Exchange Server

Shiva asks whether there is a way to determine if the recipients of an email have read the email message or not.

Message tracking searches already gives us the ability to determine whether an email message was delivered, but not whether the item has been read yet. To find that out, we need to look at delivery reports.

Delivery reports are available in Exchange organizations, but read tracking is not enabled by default. You can check whether read tracking is enabled in your organization with the Get-OrganizationConfig cmdlet.

If read tracking isn’t already enabled, then you won’t be able to track the read status of messages that have already been sent. If you’d like to be able to track the messages in future, turn it on now.

There is also a per-mailbox setting. By default, read tracking is enabled for mailboxes, so once you have turned it on for the organization it will work for all of your mailboxes. But, some mailboxes might be sensitive and need to be excluded from these types of searches. In that case, you can use Set-Mailbox to disable read status tracking for those mailboxes.

Now let’s look at an example of reporting on the read status of an email. To start with, it helps to know the message ID. One of the ways you can retrieve this is with a message tracking log search. Consider a scenario in which the user Mike Nash has sent a company newsletter to all staff within the last 48 hours. We can search message tracking logs for that message, and return the message ID.

Next, we can perform a message tracking report search for Mike’s mailbox using Search-MessageTrackingReport. For convenience, capture the results into a variable.

As you can see, by searching for the message ID, we get one result, rather than needing to filter through multiple results. But we’re not there yet, so far the information that has been retrieved doesn’t provide the answer we want.

Next, retrieve a delivery report by running Get-MessageTrackingReport for that message tracking report ID that has been returned in the search results. Again, capture the results in a variable for ease of handling.

Now take a look at the report.

The recipient tracking events are what we can use to determine who has opened the email message. Here’s one of the results from that list.

So from a reporting perspective, the RecipientDisplayName and Status fields are of most interest.

Now, I know the results above are not correct, because I have read the message using OWA while logged on with at least one of those accounts. And in fact, we can check the read status for a single recipient, by appending the -RecipientFilterPath and -ReportTemplate parameters.

The recipient tracking events in that output show that Jim has read the message.

Now what about checking for all of the recipients? Well we can do that as well, by looping through the results with a bit of PowerShell. In my example, the variable $report already exists from when I ran Get-MessageTrackingReport earlier, so I can now run:

The output of those commands looks like this:

Success! Sort of… even though I have the result, it’s not all that convenient. So let’s wrap it all up into a short script, called Get-MessageReadStatusReport.ps1 (GitHub). Here’s how it looks:


So there you are, tracking the read status of messages in your organization. This assumes that you’ve turned on read status tracking for the organization, and that it isn’t disabled for one or more of the mailboxes you’re interested. There’s a few other caveats as well:

  • Opening a message and actioning a message are two different things. Someone might open your message, but it doesn’t mean they’ve done what you want them to do (e.g. replied, clicked a link, filled out a form, etc)
  • Outlook and OWA mark messages read when they are selected. So read status doesn’t always mean a human has looked at the message.
  • An unread message sitting in the inbox, and an unread message that has been deleted, will be indistinguishable from each other when you look at delivery reports
Paul is a Microsoft MVP for Office Servers and Services. He works as a consultant, writer, and trainer specializing in Office 365 and Exchange Server. Paul is a co-author of Office 365 for IT Pros and several other books, and is also a Pluralsight author.
Category: Exchange Server


  1. Vinod says:

    Hi Paul,

    Thanks for the information however we are in dedicated environment and for analysis I would like to know is there a way to find the below information for list of mailboxes for last 30days.

    Number of emails received
    Number of emails sent
    Last email received – Date
    Last email sent – Date

    Have tried many scripts and am going no where. Kindly advise.


  2. John says:

    Thanks for the information, Paul. Where are the logs being stored? is it the same location as Message Tracking Logs?

  3. Ahnaf says:

    Thanks for the info Paul, I am getting below error while trying to track for external sender. Please help.

    + throw “$($msg).count messages found with that ID. Something is wrong.”
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : OperationStopped: (.count messages…thing is wrong.:String) [], RuntimeException
    + FullyQualifiedErrorId : .count messages found with that ID. Something is wrong.

  4. Yogi says:

    Hi Paul,

    Hope you are doing great !!

    how we can get Tracking Read Status of Email Messages in Office 365

    i have tried the same code but did not work for me getting below error . Please help

  5. markus says:

    I have run into the issue of maximum results of 1000 I have tried to add ResultSize Unlimited with no luck to your script “Get-MessageReadStatusReport.ps1 script “.

  6. Hussain says:

    Hello Paul,

    Thank you for the script.

    This script works for those email sent by normal Outlook user, but other emails which are sent by applications such as SAP or other open-source in-house hosted survey email system, which has different messageID for example ends with @server-name.FQDN, then such emails are not able to be search by “Get-MessageReadStatusReport”.

    We tried to search emails based on subject but it takes very long time, and while with specifying sender and subject then nothing returns.

    Could you share some thoughts on how we can achieve this. Thank you,

  7. Terence says:

    Hi Paul

    does this work with exchange 2010? I keep getting the error below even though the message ID is correct.

    Microsoft.Exchange.Management.Tracking.MessageTrackingSearchResult.count messages found with that ID. Something is wrong

    At C:scriptsGet-MessageReadStatusReport.ps1:61 char:6
    + throw <<<< "$($msg).count messages found with that ID. Something is wrong."
    + CategoryInfo : OperationStopped: (Microsoft.Excha…thing is wrong.:String) [], RuntimeException
    + FullyQualifiedErrorId : Microsoft.Exchange.Management.Tracking.MessageTrackingSearchResult.count messages found
    with that ID. Something is wrong.

  8. Terence says:

    tested the same script on my exchange 2016 lab with success, just having this deviation above on exchange 2010

    exchange 2016 results

    [PS] C:Scripts>.Get-MessageReadStatusReport.ps1 -Mailbox terences@mrc… -MessageId 77b113f46ca344aa9a2bfae67e65539

    RecipientAddress Status EventDescription
    —————- —— —————-
    Marc.Crowther@mrc… Delivered Unread – The message is marked as Un…
    terences@mrc… Delivered Read – The message is marked as Read…

  9. Dennnis says:

    “The recipient tracking events in that output show that Jim has read the message.”
    What am I looking at on the results that tells me it was read?..I’m sorry but I am obviously missing something here…

    Thanks for all that you do!.

  10. Eduardo Carvalho says:

    Hello Paul, first, great article.
    I tried to get the read message event from Mailbox Audit in Exchange 2010 (my messaging platform) but unfortunately it’s not supported for Delegate and Owner, so I arrived at your article and I’m developing a way to get all daily message read events in an Exchange Organization based on what is written here.
    Is there a better way OR based on what we have this is what we have for now in Exchange 2010?
    Your inputs will be very appreciated.
    Regards, EEOC

  11. Kodi says:

    Hi Paul,

    This was a great read! We ran into an issue where the Search-MessageTrackingReport was giving a null result on a message.

    We figured out the problem and wanted to make sure we listed it here incase anyone had the same problem. If you are not the owner of a mailbox but have send as permissions and you send the message then you must use your own information for the -Identity parameter and not the mailbox you are sending as. If you don’t then the Search-MessageTrackingReport will provide no information.

  12. xmdofp says:

    Does this turn on read receipts for users or is it only tracking E-Mail status? I don’t want popups requesting read receipts every time a user from my company sends an E-Mail, but we’ve had requests to see if E-Mails have been read.

    Also, can this be turned on individually per mailbox?

  13. Deepak says:

    Hi Paul,
    is there any consequences like storage or performance issue after enabling Read tracking in organization level.

Leave a Reply

Your email address will not be published. Required fields are marked *