ℹ Actualização importante — Setembro 2025
A Microsoft deprecou os cmdlets Get-MessageTrace e Get-MessageTraceDetail a partir de Setembro de 2025. Este artigo cobre exclusivamente a nova interface do Message Trace no EAC e os novos cmdlets Get-MessageTraceV2 / Get-MessageTraceDetailV2 (requer módulo ExchangeOnlineManagement ≥ 3.7.0). Se ainda uses os cmdlets antigos nos teus scripts, migra antes de April de 2026.
O Message Trace é a ferramenta número um de diagnóstico de fluxo de email no Exchange Online. Permite seguir o percurso exacto de qualquer mensagem — do remetente ao destinatário — através de todos os filtros, regras de transporte e serviços de protecção. É o primeiro passo em qualquer ticket de email não entregue, e frequentemente o único passo necessário.
Com a nova interface GA (disponível desde Julho de 2025), o Message Trace suporta agora até 90 dias de histórico de dados (em janelas de 10 dias por pesquisa) e inclui melhorias significativas de performance e filtros. Este artigo cobre a interface web e os novos cmdlets PowerShell em detalhe.
Neste artigo
- Aceder ao Message Trace — interface web
- Pesquisa básica — os campos essenciais
- Filtros avançados e pesquisas guardadas
- Interpretar os resultados — statuses e eventos
- Detalhe de mensagem — ler a cadeia de eventos
- Pesquisa histórica — dados com mais de 10 dias
- PowerShell — Get-MessageTraceV2 e Get-MessageTraceDetailV2
- Casos práticos — exemplos reais de troubleshooting
- Limitações e quando usar alternativas
1. Aceder ao Message Trace — interface web
Existem dois caminhos para aceder ao Message Trace:
| Via menu EAC | admin.exchange.microsoft.com → Mail flow → Message trace |
| URL directo | admin.exchange.microsoft.com/#/messagetrace |
Permissões necessárias: A função mínima para usar o Message Trace é View-Only Recipients ou qualquer função que inclua permissões de leitura de mail flow. Administradores globais e Exchange Administrators têm acesso completo por defeito.
A página do Message Trace tem três separadores principais:
| Separador | Função |
|---|---|
| Default queries | Pesquisas pré-definidas pela Microsoft — úteis como ponto de partida rápido para cenários comuns |
| Custom queries | Pesquisas guardadas pelo administrador — permite guardar e reutilizar filtros frequentes |
| Downloadable reports | Resultados de pesquisas históricas (dados > 10 dias) para download em CSV |
2. Pesquisa básica — os campos essenciais
Ao clicar em Start a trace, abre um painel lateral com os campos de pesquisa. Para a maioria dos tickets de helpdesk, preencher apenas três campos é suficiente:
| Campo | O que preencher | Dicas |
|---|---|---|
| Senders | Endereço(s) do remetente — ex: [email protected] |
Aceita múltiplos endereços separados por vírgula. Deixar em branco para todos os remetentes |
| Recipients | Endereço(s) do destinatário | Múltiplos endereços possíveis. Para grupos de distribuição: pesquisar pelo endereço do grupo |
| Time range | Intervalo de tempo da pesquisa | Os horários são em UTC. Se o utilizador disse “às 10h” (hora PT/WET), pesquisa às 09:00–11:00 UTC no Inverno ou 08:00–10:00 UTC no Verão |
| Report type | Summary (padrão) ou Extended | Summary é mais rápido e suficiente para a maioria dos casos. Extended inclui mais campos e eventos mas demora mais |
⚠ Atenção ao fuso horário — o erro mais comum
Todos os horários no Message Trace são em UTC (Coordinated Universal Time). Portugal Continental (WET/WEST) está em UTC+0 no Inverno e UTC+1 no Verão. Se um utilizador diz que enviou um email às 14:30 e não pesquisas o intervalo correcto em UTC, não encontras o email. Converte sempre os horários antes de pesquisar.
3. Filtros avançados e pesquisas guardadas
Para troubleshooting mais específico, o painel de pesquisa tem campos adicionais que permitem filtrar com mais precisão:
| Filtro | Valores possíveis | Quando usar |
|---|---|---|
| Delivery status | All, Delivered, Failed, Pending, FilteredAsSpam, Quarantined, Expanded | Filtrar apenas por mensagens que falharam ou foram para quarentena |
| Message ID | O valor do header Message-ID do email | Rastrear uma mensagem específica com o ID fornecido pelo remetente |
| Direction | All, Inbound, Outbound | Filtrar apenas email a entrar (de externos) ou a sair (para externos) |
| Original client IP | Endereço IP de origem | Identificar email de um IP específico — útil para relay de sistemas e multifunções |
| Network Message ID | GUID gerado pelo Exchange Online para cada mensagem | Rastrear com precisão absoluta — obtido a partir de um resultado de pesquisa anterior |
Guardar pesquisas frequentes
Após configurar um conjunto de filtros úteis (ex: pesquisa de emails falhados nas últimas 48h), é possível guardar a pesquisa para reutilização futura:
- Configurar os filtros pretendidos no painel de pesquisa
- Clicar em Save this query antes de executar a pesquisa
- Dar um nome descritivo — ex: “Emails falhados últimas 48h”
- A pesquisa fica disponível no separador Custom queries para todos os administradores do tenant
4. Interpretar os resultados — statuses e eventos
A lista de resultados mostra uma linha por mensagem com as colunas: Date, Sender, Recipients, Subject, Status e Size. O campo Status é o mais importante:
| Status | Significado | Próxima acção |
|---|---|---|
| Delivered | Email entregue com sucesso na caixa de correio do destinatário | Verificar pasta Lixo, regras de inbox, pasta de Arquivo — o email chegou |
| Failed | Entrega falhou definitivamente — gerado NDR para o remetente | Abrir o detalhe da mensagem → identificar o código de erro NDR |
| Pending | Email ainda em fila de espera — entrega adiada (pode ainda ser entregue) | Aguardar; verificar se o servidor de destino tem problemas; verificar MX do destinatário |
| FilteredAsSpam | Marcado como spam pelo Exchange Online Protection — entregue mas na pasta Lixo | Verificar pasta Lixo do destinatário; se legítimo, ajustar política anti-spam ou adicionar remetente aos Safe Senders |
| Quarantined | Retido na quarentena por política anti-spam, anti-malware ou regra de transporte | EAC → Email & collaboration → Review → Quarantine → avaliar e libertar ou eliminar |
| Expanded | Mensagem expandida para múltiplos destinatários (grupo de distribuição) | Pesquisar por cada destinatário individualmente para verificar estado de entrega a cada um |
| GettingStatus | Status ainda a ser calculado — pode demorar 5–10 minutos após envio | Aguardar e repetir a pesquisa após 10 minutos |
ℹ Latência dos resultados: Pode existir um atraso de 5 a 10 minutos entre o estado real de entrega e o estado reportado no Message Trace. Para emails muito recentes (últimos 15 minutos), o status pode ainda estar a actualizar.
5. Detalhe de mensagem — ler a cadeia de eventos
Ao clicar numa mensagem nos resultados, abre o painel de detalhe com a cadeia completa de eventos que a mensagem atravessou. Esta cadeia é o elemento mais valioso para diagnóstico aprofundado — permite ver exactamente em que ponto o email foi retido, transformado ou rejeitado.
Campos de cabeçalho do detalhe
| Campo | O que mostra |
|---|---|
| Message ID | ID da mensagem do header de email — útil para correlacionar com logs do remetente |
| Network Message ID | GUID interno do Exchange Online — usar este ID para pesquisas PowerShell precisas |
| From IP / To IP | IP de origem e destino — útil para identificar relay de terceiros ou dispositivos |
| Size | Tamanho da mensagem em bytes — se muito grande pode explicar rejeição por limite de tamanho |
Eventos mais comuns na cadeia de eventos
| Evento | Significado |
|---|---|
| RECEIVE | O Exchange Online recebeu a mensagem do remetente — ponto de entrada no serviço |
| DELIVER | Mensagem entregue na caixa de correio do destinatário — entrega bem-sucedida |
| AGENTINFO | Uma regra de transporte ou agente processou a mensagem — ler o detalhe para ver qual regra |
| FAIL | Entrega falhou — o detalhe do evento contém o código de erro NDR |
| SPAM | EOP (Exchange Online Protection) classificou a mensagem como spam |
| QUARANTINE | Mensagem retida na quarentena — ver motivo no detalhe |
| SEND | Exchange Online enviou a mensagem para o servidor de destino externo |
| EXPAND | Mensagem expandida para múltiplos destinatários (grupo de distribuição processado) |
6. Pesquisa histórica — dados com mais de 10 dias
A pesquisa em tempo real (near-real-time) cobre os últimos 10 dias. Para dados mais antigos — até 90 dias — é necessário usar o relatório histórico, que é processado de forma assíncrona e entregue em CSV.
| Tipo | Intervalo máximo | Resultado | Limite por tenant |
|---|---|---|---|
| Near-real-time (EAC) | Últimos 10 dias | Imediato — max. 1 000 resultados | Sem limite relevante |
| Historical search | Até 90 dias (10 dias por query) | CSV disponível em horas (separador Downloadable reports) | 250 pesquisas por 24 horas por tenant |
Iniciar pesquisa histórica via PowerShell
# Iniciar pesquisa histórica (para dados > 10 dias) Start-HistoricalSearch -ReportTitle "Email Falhado - Janeiro 2026" ` -StartDate "01/01/2026" ` -EndDate "10/01/2026" ` -ReportType MessageTrace ` -SenderAddress "[email protected]" ` -RecipientAddress "[email protected]" ` -NotifyAddress "[email protected]" # Verificar estado das pesquisas históricas activas Get-HistoricalSearch | Select-Object JobId, ReportTitle, Status, StartDate, EndDate, SubmitDate
7. PowerShell — Get-MessageTraceV2 e Get-MessageTraceDetailV2
⚠ Versão do módulo obrigatória: Os novos cmdlets Get-MessageTraceV2 e Get-MessageTraceDetailV2 requerem ExchangeOnlineManagement ≥ 3.7.0. Para actualizar: Update-Module ExchangeOnlineManagement
Pesquisas básicas com Get-MessageTraceV2
Connect-ExchangeOnline -UserPrincipalName [email protected] # Pesquisa básica: últimas 48h para um utilizador Get-MessageTraceV2 -RecipientAddress "[email protected]" ` -StartDate (Get-Date).AddDays(-2) -EndDate (Get-Date) | Select-Object Received, SenderAddress, RecipientAddress, Subject, Status | Format-Table -AutoSize # Apenas mensagens com falha nas últimas 24h (todos os utilizadores) Get-MessageTraceV2 -StartDate (Get-Date).AddDays(-1) -EndDate (Get-Date) -Status Failed | Select-Object Received, SenderAddress, RecipientAddress, Subject | Format-Table -AutoSize # Mensagens para a quarentena nas últimas 48h Get-MessageTraceV2 -StartDate (Get-Date).AddDays(-2) -EndDate (Get-Date) -Status Quarantined | Select-Object Received, SenderAddress, RecipientAddress, Subject | Sort-Object Received -Descending
Obter detalhe de uma mensagem específica
# Passo 1: Obter o MessageTraceId (Network Message ID) da mensagem $trace = Get-MessageTraceV2 -SenderAddress "[email protected]" ` -RecipientAddress "[email protected]" ` -StartDate (Get-Date).AddHours(-4) ` -EndDate (Get-Date) # Ver os resultados $trace | Select-Object Received, Subject, Status, MessageTraceId # Passo 2: Obter o detalhe completo da mensagem (cadeia de eventos) Get-MessageTraceDetailV2 -MessageTraceId $trace[0].MessageTraceId ` -RecipientAddress "[email protected]" ` -StartDate (Get-Date).AddHours(-4) ` -EndDate (Get-Date) | Select-Object Date, Event, Action, Detail | Format-Table -AutoSize
Exportar resultados para CSV
# Exportar todos os emails falhados da última semana para CSV Get-MessageTraceV2 -StartDate (Get-Date).AddDays(-7) -EndDate (Get-Date) -Status Failed | Select-Object Received, SenderAddress, RecipientAddress, Subject, Status, MessageTraceId | Export-Csv "C:\temp\emails_falhados_$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation -Encoding UTF8 Write-Host "Exportado para emails_falhados_$(Get-Date -Format 'yyyyMMdd').csv"
8. Casos práticos — exemplos reais de troubleshooting
Caso A — “Não recebi o email que o cliente disse que enviou”
- Message Trace: Senders = endereço do cliente, Recipients = caixa de correio do utilizador, Time range = período reportado (+/- 2h, convertido para UTC
- Se Delivered: verificar pasta Lixo, regras de inbox, arquivo automático do Outlook
- Se FilteredAsSpam: verificar pasta Lixo → se email legítimo, adicionar domínio do cliente aos Safe Senders na política anti-spam
- Se Quarantined: ir à quarentena e libertar o email se legítimo
- Se não aparece nada: o cliente pode não ter enviado — pedir header do email para confirmar que passou pelo Exchange Online
Caso B — “O multifunções está a dar erro ao enviar email”
- Message Trace: Senders = endereço configurado no multifunções, Time range = hora da tentativa
- Se status Failed com código 5.7.57: o dispositivo não está autenticado — configurar SMTP relay via conector no EAC com IP autorizado
- Se não aparece nada: o email nem chegou ao Exchange Online — verificar configuração SMTP no dispositivo (servidor, porta, TLS)
- Verificar no EAC → Mail flow → Connectors se existe conector para o IP do multifunções
Caso C — “Emails para um domínio externo estão a falhar”
- Message Trace: Senders = qualquer utilizador interno, Recipients = *@dominiodestino.com, Status = Failed
- Abrir o detalhe da mensagem → identificar o código de erro e o IP de destino
- Verificar o MX do domínio de destino com MXToolbox — está a resolver? O servidor de destino está online?
- Se o erro inclui “550 5.7.1” ou similar: o servidor de destino está a rejeitar o email — pode ser reputação do IP ou problema SPF do remetente
- Verificar se o IP do Exchange Online está em blacklist: usar MXToolbox Blacklist Check com os IPs de saída do tenant
9. Limitações e quando usar alternativas
| Limitação | Alternativa |
|---|---|
| Dados de apenas 90 dias no máximo | Para dados mais antigos: eDiscovery / Content Search no Purview (pesquisa nas caixas de correio, não no log de transporte) |
| Máximo 1 000 resultados por pesquisa near-real-time | Usar filtros mais específicos ou Historical Search para obter o CSV completo |
| Mensagens com > 1 000 destinatários — resultados incompletos | Incluir o Network Message ID na pesquisa para obter resultados completos |
| Throttling: 100 queries por 5 minutos (PowerShell V2) | Espaçar as queries em scripts de monitorização; usar Historical Search para volumes grandes |
| Não mostra o conteúdo do email (body, anexos) | Para ver conteúdo: eDiscovery no Microsoft Purview (requer permissões adicionais) |
