Cómo buscar correos electrónicos con PowerShell
Un método excelente para buscar mensajes en los buzones de correo de Exchange Online es con PowerShell. Puede modificar los comandos a su gusto y obtener los resultados que necesita. Además, exportar los resultados a un archivo CSV es excelente, por lo que puedes filtrarlos allí. En este artículo, aprenderá cómo buscar correos electrónicos con PowerShell.
Instalar Microsoft Graph PowerShell
Ejecute Windows PowerShell como administrador e instale Microsoft Graph PowerShell.
Install-Module Microsoft.Graph -ForceInstall-Module Microsoft.Graph.Beta -AllowClobber -ForceImportante: Instale siempre los módulos Microsoft Graph PowerShell y Microsoft Graph Beta PowerShell. Esto se debe a que algunos cmdlets aún no están disponibles en la versión final y no funcionarán. Actualice ambos módulos a la última versión antes de ejecutar un cmdlet o script para evitar errores y resultados incorrectos.
Configurar el registro de aplicaciones en Microsoft Entra
Antes de poder ejecutar los comandos o scripts, primero debe crear un registro de aplicación con los permisos correctos y un secreto de cliente para autenticarse con Microsoft Graph PowerShell.
1. Registrar nueva aplicación
Registre una nueva aplicación en Microsoft Entra ID:
- Inicie sesión en el centro de administración de Microsoft Entra
- Haga clic en Identidad > Aplicación > Registros de aplicaciones.
- Haga clic en Nuevo registro
- Nombra la aplicación Buscar-Mail
- Seleccione Cuentas solo en este directorio organizacional (solo EXOIP - Inquilino único)
- Haga clic en Registrarse
La aplicación Search-Mail se ha creado correctamente. Copie los valores siguientes y péguelos en el Bloc de notas, ya que los necesitará más adelante cuando se conecte a Microsoft Graph PowerShell.
- Copie el ID de la aplicación (cliente)
- Copie el ID del directorio (inquilino)
2. Asignar permisos de API
Asigne permisos API para la aplicación que registró en el paso anterior:
- Haga clic en permiso de API.
- Haga clic en Agregar un permiso
- Haga clic en API de Microsoft.
- Haga clic en Microsoft Graph
- Haga clic en Permisos de la aplicación.
- Busque Usuario.Leer.Todo
- Seleccione Usuarios > Usuario.Leer.Todo
- Busque Mail.Read
- Seleccione Correo > Correo.Leer
- Haga clic en Agregar permisos
Los permisos de API se agregaron correctamente. El siguiente paso es otorgar el consentimiento del administrador.
3. Otorgar consentimiento del administrador
Debe otorgar consentimiento de administrador para los permisos que seleccionó en el paso anterior:
- Haga clic en Otorgar consentimiento de administrador para EXOIP.
- Haga clic en Sí
- La marca de verificación verde muestra que otorgaste el consentimiento del administrador correctamente.
4. Crear secreto de cliente
Después de registrar una nueva aplicación en Microsoft Entra, asignar permisos de API y otorgar consentimiento de administrador, debe crear un secreto de cliente.
Para crear un secreto de cliente para su aplicación en Microsoft Entra ID, siga estos pasos:
- Haga clic en Certificados y secretos
- Haga clic en Secretos de cliente > Nuevo secreto de cliente.
- Escriba Descripción
- Seleccione una Fecha de vencimiento
- Haga clic en Agregar
Nota: La fecha de vencimiento del Secreto de Cliente tiene un máximo de 24 meses (2 años). Siempre puede renovar el secreto del cliente en Microsoft Entra ID con PowerShell.
- Copie el valor del secreto del cliente y guárdelo en el Bloc de notas.
Conéctese a Microsoft Graph PowerShell con Client Secret
Debe cambiar los valores de los parámetros siguientes para conectarse a MS Graph PowerShell con Client Secret:
- Escriba el valor del ID del cliente de la aplicación en la línea 2.
- Escriba el valor del ID de inquilino del directorio en la línea 3.
- Escriba el valor del valor secreto del cliente en la línea 4.
Ejecute el siguiente script de PowerShell.
# Configuration
$ClientId = "c6787ff5-08ec-4e96-b4d2-1d1782303310"
$TenantId = "eb403171-a4ec-4d98-a08f-1876318c9deb"
$ClientSecret = "6_q8Q~X9e-fjwWhVVP_WWx~ua4JMI.BWkI7Q7b7B"
# Convert the client secret to a secure string
$ClientSecretPass = ConvertTo-SecureString -String $ClientSecret -AsPlainText -Force
# Create a credential object using the client ID and secure string
$ClientSecretCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $ClientId, $ClientSecretPass
# Connect to Microsoft Graph with Client Secret
Connect-MgGraph -TenantId $tenantId -ClientSecretCredential $ClientSecretCredentialBuscar correos electrónicos de un usuario específico
Recibe todos los mensajes de un usuario específico.
$User = "Amanda.Morgan@exoip.com"
Get-MgUserMessage -All -UserId "$User" |
Select-Object Subject, InternetMessageId, ReceivedDateTime,
@{Name = "Sender"; Expression = { $_.Sender.EmailAddress.Address } },
@{Name = "Recipients"; Expression = { $_.ToRecipients.EmailAddress.Address -join ', ' } } |
Out-GridView
Obtenga todos los mensajes de un usuario específico que se leen.
$User = "Amanda.Morgan@exoip.com"
Get-MgUserMessage -All -UserId "$User" -Filter "IsRead eq true" |
Select-Object Subject, InternetMessageId, ReceivedDateTime,
@{Name = "Sender"; Expression = { $_.Sender.EmailAddress.Address } },
@{Name = "Recipients"; Expression = { $_.ToRecipients.EmailAddress.Address -join ', ' } } |
Out-GridViewRecibe todos los mensajes de un usuario específico que no están leídos.
$User = "Amanda.Morgan@exoip.com"
Get-MgUserMessage -All -UserId "$User" -Filter "IsRead eq false" |
Select-Object Subject, InternetMessageId, ReceivedDateTime,
@{Name = "Sender"; Expression = { $_.Sender.EmailAddress.Address } },
@{Name = "Recipients"; Expression = { $_.ToRecipients.EmailAddress.Address -join ', ' } } |
Out-GridViewBuscar correos electrónicos por fecha
Busque correos electrónicos de un usuario específico después de una fecha específica.
$User = "Amanda.Morgan@exoip.com"
$Date = "2024-01-01"
Get-MgUserMessage -All -UserId "$User" -Filter "ReceivedDateTime gt $Date" |
Select-Object Subject, InternetMessageId, ReceivedDateTime,
@{Name = "Sender"; Expression = { $_.Sender.EmailAddress.Address } },
@{Name = "Recipients"; Expression = { $_.ToRecipients.EmailAddress.Address -join ', ' } } |
Out-GridViewBuscar correos electrónicos sobre el tema
Busque correos electrónicos que comiencen con un asunto específico.
$Subject = "The subject"
$user = "Amanda.Morgan@exoip.com"
Get-MgUserMessage -All -UserId "$User" -Filter "startswith(Subject,'$Subject')" |
Select-Object Subject, InternetMessageId, ReceivedDateTime,
@{Name = "Sender"; Expression = { $_.Sender.EmailAddress.Address } },
@{Name = "Recipients"; Expression = { $_.ToRecipients.EmailAddress.Address -join ', ' } } |
Out-GridViewBusque correos electrónicos que sean iguales al asunto.
$Subject = "The specific subject"
$user = "Amanda.Morgan@exoip.com"
Get-MgUserMessage -All -UserId "$user" -Filter "Subject eq '$Subject'" |
Select-Object Subject, InternetMessageId, ReceivedDateTime,
@{Name = "Sender"; Expression = { $_.Sender.EmailAddress.Address } },
@{Name = "Recipients"; Expression = { $_.ToRecipients.EmailAddress.Address -join ', ' } } |
Out-GridViewBuscar correos electrónicos de los últimos 30 días
Busquemos todos los correos electrónicos de la organización de los últimos 30 días, en el destinatario y en el remitente. Los resultados aparecerán en Out-GridView y se exportarán a un archivo CSV.
Busque todos los correos electrónicos de la organización de los últimos 30 días.
# Get all users
$users = Get-MgUser -All
# Create an empty array to store the data
$Data = @()
# Determine the date 30 days prior to today
$startDate = (Get-Date).AddDays(-30).ToString("yyyy-MM-dd")
# Loop through each user
foreach ($user in $users) {
# Ensure the user has an associated email address
if ($user.Mail) {
$messages = Get-MgUserMessage -UserId $user.Id -All -Filter "ReceivedDateTime ge $startDate" -ErrorAction SilentlyContinue
foreach ($message in $messages) {
$Data += [PSCustomObject]@{
ReceivedDateTime = $message.ReceivedDateTime
Subject = $message.Subject
Sender = $message.Sender.EmailAddress.Address -join ','
Recipient = $message.ToRecipients.EmailAddress.Address -join ','
InternetMessageId = $message.InternetMessageId
}
}
}
}
# Display and export the data
$Data | Out-GridView
$Data | Export-Csv -Path "C:\temp\All_emails.csv" -NoTypeInformation -Encoding utf8Busque todos los correos electrónicos de la organización que se hayan enviado a un destinatario específico en los últimos 30 días.
# Email address of the recipient you want to filter
$recipientEmailAddress = "amanda.morgan@exoip.com"
# Get all users
$users = Get-MgUser -All
# Create an empty array to store the data
$Data = @()
# Determine the date 30 days prior to today
$startDate = (Get-Date).AddDays(-30).ToString("yyyy-MM-dd")
# Loop through each user
foreach ($user in $users) {
# Ensure the user has an associated email address
if ($user.Mail) {
$messages = Get-MgUserMessage -UserId $user.Id -All -Filter "ReceivedDateTime ge $startDate" -ErrorAction SilentlyContinue
foreach ($message in $messages) {
# Check if the recipient matches the desired email address
if ($message.ToRecipients.EmailAddress.Address -eq $recipientEmailAddress) {
$Data += [PSCustomObject]@{
ReceivedDateTime = $message.ReceivedDateTime
Subject = $message.Subject
Sender = $message.Sender.EmailAddress.Address
Recipient = $message.ToRecipients.EmailAddress.Address
InternetMessageId = $message.InternetMessageId
}
}
}
}
}
# Display and export the data
$Data | Out-GridView
$Data | Export-Csv -Path "C:\temp\Recipient_emails.csv" -NoTypeInformation -Encoding utf8Busque todos los correos electrónicos de la organización que hayan sido enviados por un remitente específico en los últimos 30 días.
# Email address of the sender you want to filter
$senderEmailAddress = "john.doe@gmail.com"
# Get all users
$users = Get-MgUser -All
# Create an empty array to store the data
$Data = @()
# Determine the date 30 days prior to today
$startDate = (Get-Date).AddDays(-30).ToString("yyyy-MM-dd")
# Loop through each user
foreach ($user in $users) {
# Ensure the user has an associated email address
if ($user.Mail) {
$messages = Get-MgUserMessage -UserId $user.Id -All -Filter "ReceivedDateTime ge $startDate" -ErrorAction SilentlyContinue
foreach ($message in $messages) {
if ($message.Sender.EmailAddress.Address -eq $senderEmailAddress) {
$Data += [PSCustomObject]@{
ReceivedDateTime = $message.ReceivedDateTime
Subject = $message.Subject
Sender = $message.Sender.EmailAddress.Address
Recipient = ($message.ToRecipients.EmailAddress.Address -join ',')
InternetMessageId = $message.InternetMessageId
}
}
}
}
}
# Display and export the data
$Data | Out-GridView
$Data | Export-Csv -Path "C:\temp\Sender_emails.csv" -NoTypeInformation -Encoding utf8¡Eso es todo!
Leer más: Exportar registros de la aplicación Entra ID Informe de vencimiento de certificados y secretos »
Conclusión
Aprendiste a buscar correos electrónicos con PowerShell. Primero, configure una aplicación en Microsoft Entra con los permisos correctos. Después de eso, conéctese con Microsoft Graph PowerShell a la aplicación. Por último, ejecute los comandos para buscar correos electrónicos con PowerShell.
¿Disfrutaste este artículo? También te puede interesar Cómo bloquear el dominio de nivel superior (TLD) en Microsoft 365. No olvides seguirnos y compartir este artículo.










