functions/reports/Get-EXRMessageTrace.ps1

function Get-EXRMessageTrace
{
    [CmdletBinding()]
    param (
        
        [Parameter(Position = 1, Mandatory = $true)]
        [String]
        $MailboxName,        
        
        [Parameter(Position = 6, Mandatory = $true)]
        [System.Management.Automation.PSCredential]$Credentials,
        
        [Parameter(Position = 7, Mandatory = $false)]
        [datetime]$Start,

        [Parameter(Position = 8, Mandatory = $false)]
        [datetime]$End,

        [Parameter(Position = 9, Mandatory = $false)]
        [String]$ToAddress,

        [Parameter(Position = 10, Mandatory = $false)]
        [String]$SenderAddress,

        [Parameter(Position = 11, Mandatory = $false)]
        [String]$Status,

        [Parameter(Position = 12, Mandatory = $false)]
        [switch]$TraceDetail
    )
    process
    {
        if($Start -eq $null){$Start = (Get-Date).AddDays(-7)}
        if($End -eq $null){$End = (Get-Date)}
        $HttpClient = Get-HTTPClient -MailboxName $MailboxName
        $OdataOptions = "";
        $OdataOptions = "?`$filter=StartDate eq datetime'" + ($Start.ToString("s") + "Z") + "' and EndDate eq datetime'" + ($End.ToString("s") + "Z") + "'";
        if(![String]::IsNullOrEmpty($ToAddress)){
                $OdataOptions += " and RecipientAddress eq '" + $ToAddress + "'"
        }
        if(![String]::IsNullOrEmpty($SenderAddress)){
                $OdataOptions += " and SenderAddress eq '" + $SenderAddress + "'"
        }
        if(![String]::IsNullOrEmpty($Status)){
                $OdataOptions += " and Status eq '" + $Status + "'"
        }
        $ReportingURI = ("https://reports.office365.com/ecp/reportingwebservice/reporting.svc/MessageTrace" + $OdataOptions);
        do{
            $RequestURI = $ReportingURI.Replace("../../","https://reports.office365.com/ecp/")
            $ReportingURI = ""
            $JSONOutput =  Invoke-RestGet -RequestURL $RequestURI -HttpClient $HttpClient -BasicAuthentication -Credentials $Credentials -MailboxName $MailboxName
            $ReportingURI = $JSONOutput.'odata.nextLink'
            foreach($Message in $JSONOutput.Value){
                if($TraceDetail.IsPresent){
                   $Details =  Get-EXRMessageTraceDetail -MailboxName $MailboxName -MessageTraceId $Message.MessageTraceId -SenderAddress $Message.SenderAddress -ToAddress $Message.RecipientAddress -Start $Start -End $End -Credentials $Credentials
                   Add-Member -InputObject $Message -NotePropertyName TraceDetails -NotePropertyValue $Details
                }
                Write-Output $Message
            }
        }while(![String]::IsNullOrEmpty($ReportingURI))

    }
}