title: Office 365 UnRead Email PowerShell admin report
body: <p>I develop a Powershell script to generate a report UnRead Email per user for Office 365.</p>
  
  <p>1.- this only work with Admin User Account
  2.- The Admin User need the following role in Exchange Server (Applicationimpersonate)</p>
  
  <pre><code># work with Office 365 exchange server to retrieve messages
  # Check Admin user have Applicationimpersonate Role
  
  Set-ExecutionPolicy RemoteSigned
  
  $UserCredential = Get-Credential
  $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection
  Import-PSSession $Session
  
  
  # load the assembly
  [void] [Reflection.Assembly]::LoadFile("C:\Program Files\Microsoft\Exchange\Web Services\2.0\Microsoft.Exchange.WebServices.dll")
  $s = New-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013_SP1)
  
  
  if ($UserCredential -ne $null) 
  {
      $s.Credentials = $UserCredential.GetNetworkCredential()
  }
  else 
  {
      # Credencial for Admin User
      $UserCredential = Get-Credential 
      $s.Credentials = $UserCredential.GetNetworkCredential()
  }
  
  
  # This URL is used for Office 365
  # You can use AutodiscoverUrl in case of don't have URL
  $s.Url= new-object Uri(“https://outlook.office365.com/EWS/Exchange.asmx”)
  
  # To use AutoDiscovery
  # discover the url from your email address
  # $TestUrlCallback = {
  #  param ([string] $url)
  #  if ($url -eq "https://autodiscover-s.outlook.com/autodiscover/autodiscover.xml") {$true} else {$false}
  # }
  #  $s.AutodiscoverUrl($email,$TestUrlCallback)
  
  
  # get a handle to the inbox, this function get all inbox, you can replace with a address file 
  # uncomment this line
  # For All Inbox
  
  Write-host "Name , Email , Toatl in Inbox, UnRead in Inbox , Sent "
  get-mailbox | foreach-object{
      $mbcomb = "" | select DisplayName,EmailAddress,Inbox_Number_Unread,Inbox_Unread_LastRecieved,Sent_Items_LastSent
      $mbcomb.DisplayName = $_.DisplayName.ToString()
      $mbcomb.EmailAddress = $_.WindowsEmailAddress.ToString()
      $email = $_.WindowsEmailAddress
      $folderId = New-Object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox, $email);
      $s.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress,$email)
      $inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($s,$folderId)
      $folderIdS = New-Object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::SentItems, $email);
      $Sent = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($s,$folderIdS)
      Write-host $mbcomb.DisplayName "," $email "," $inbox.TotalCount "," $inbox.UnreadCount ","  $Sent.TotalCount
  }
  
  
  
  # For email address in a File 
  #function GetUnreadInboxMails([string] $emailAddress) 
  #{
  #
  #    $folderId = New-Object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox, $emailAddress);
  #    $s.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress,$emailAddress)
  #    $inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($s,$folderId)
  #    $folderIdS = New-Object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::SentItems, $emailAddress);
  #    $Sent = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($s,$folderIdS)
  #    Write-host $emailAddress "," $inbox.UnreadCount "," $Sent.TotalCount "," $inbox.TotalCount 
  #}
  #$addresses = Import-Csv "c:\temp\email-list.txt"
  #$addresses | % {GetUnreadInboxMails($_.MailAddress)}  
  </code></pre>