Cómo leer correos electrónicos de Outlook con PowerShell

Acceder a Outlook mediante PowerShell para recuperar, leer e incluso manipular correos electrónicos es bastante práctico, pero también un poco complicado si no estás familiarizado con el funcionamiento de los objetos COM de Outlook. Generalmente, los usuarios tienen dificultades porque Outlook debe estar ejecutándose, y los problemas de permisos o perfiles pueden causar confusión. Además, si quieres revisar diferentes carpetas o filtrar correos electrónicos específicos, necesitas los comandos adecuados para explorar carpetas y elementos. Esta guía explica lo necesario para que funcione, algunos problemas comunes y cómo ajustarlo a tu configuración.

Cómo leer correos electrónicos de Outlook con PowerShell

Compruebe si Outlook ya se está ejecutando e inícielo si no es así

  • Si Outlook no está abierto, PowerShell no podrá ver tu buzón. Por lo tanto, empieza por comprobarlo e iniciarlo en segundo plano. Esta es una forma habitual de hacerlo:
$OutlookProc = (Get-Process | Where-Object { $_. ProcessName -eq "OUTLOOK" })

Si no devuelve nada, probablemente Outlook no se esté ejecutando. Por lo tanto, puedes iniciarlo silenciosamente así:

if (-not $OutlookProc) { Start-Process outlook.exe -WindowStyle Hidden Start-Sleep -Seconds 5 # Wait a bit for Outlook to load } 

En algunas configuraciones, Outlook tarda unos segundos en cargarse por completo, por lo que esa pausa es clave. Es un poco molesto, pero si Outlook no se está ejecutando, PowerShell no detectará tu correo a menos que lo inicies primero.

Cargar el objeto COM de Outlook y obtener acceso al buzón

  • Esto es lo que le dice a PowerShell que hable con el backend de Outlook:
Add-Type -AssemblyName "Microsoft. Office. Interop. Outlook" $Outlook = New-Object -ComObject Outlook. Application

Una vez que haya creado el objeto COM, puede obtener el espacio de nombres de su buzón, que es simplemente una forma elegante de referirse al contenedor principal de carpetas y correos electrónicos:

$namespace = $Outlook. GetNameSpace("MAPI")

Aquí se encuentra toda la información del buzón. Si usa varios perfiles o cuentas de correo, es posible que deba especificar cuál, pero en la mayoría de los casos, esto funciona.

Enumera todas las carpetas de tu buzón (para que sepas qué hay allí)

  • A veces, no estás seguro de si tus correos están en la «Bandeja de entrada» o en otra carpeta. Para ver todas las carpetas, ejecuta:
$namespace. Folders | ForEach-Object { $_. Name }

Si desea ver subcarpetas, puede explorarlas en profundidad de la siguiente manera:

$namespace. Folders | ForEach-Object { $_. Folders | ForEach-Object { "$($_. FolderPath)" } }

O, mejor aún, enlístalos recursivamente con una función sencilla. He usado una similar para obtener una vista de árbol de todas las carpetas y su número de elementos. Ayuda a encontrar dónde se almacenan tus correos, para que puedas dirigirte a la carpeta correcta en lugar de asumir que siempre es «Bandeja de entrada».

Obtener la carpeta predeterminada para los correos entrantes

  • Generalmente es «Bandeja de entrada», pero en diferentes idiomas o configuraciones regionales puede tener un nombre diferente.
$inbox = $namespace. GetDefaultFolder([Microsoft. Office. Interop. Outlook. OlDefaultFolders]::olFolderInbox)

Una vez que tengas la carpeta, enumerar los correos electrónicos en ella es sencillo:

$inbox. Items | Select-Object SenderEmailAddress, To, Subject, Size, ReceivedTime | Format-Table -AutoSize

Esto le permite obtener una vista rápida y puede filtrar o buscar más con Where-Object, de la siguiente manera:

$todaySender = "[email protected]" $today = Get-Date $inbox. Items | Where-Object { $_. ReceivedTime -ge $today. Date -and $_. SenderEmailAddress -eq $todaySender }

No estoy seguro de por qué funciona, pero filtrar por fecha y remitente ayuda a encontrar los correos electrónicos específicos que buscas.

Leer detalles de correo electrónico y manejar archivos adjuntos

  • Para ver el cuerpo del correo electrónico, puede acceder a «Body» o «HTMLBody», según sus necesidades. Por ejemplo, tome el correo electrónico más reciente y vea su contenido:
$latest = $inbox. Items | Sort-Object ReceivedTime -Descending | Select-Object -First 1 $latest | Select-Object SenderEmailAddress, Subject, Body, HTMLBody

Si el correo electrónico tiene archivos adjuntos y desea guardarlos, verifique primero el recuento. A continuación, le explicamos cómo:

$email = $latest if ($email. Attachments. Count -gt 0) { $attachment = $email. Attachments. Item(1) $savePath = "C:\\Downloads\\$($attachment. FileName)" $attachment. SaveAsFile($savePath) # This saves the first attachment to C:\Downloads }

Asegúrese de que la carpeta exista o PowerShell emitirá un error. Además, si el correo electrónico tiene varios archivos adjuntos, revíselos para que se guarden todos.

Eliminar un correo electrónico o marcarlo como leído

  • A veces, deseas eliminar el spam o archivar correos directamente:
$latest | ForEach-Object { $_. Delete() }

Alternativamente, marcar como leído en lugar de eliminar se puede hacer activando y desactivando el atributo No leído :

$latest. UnRead = $false $latest. Save()

Es bueno saberlo, especialmente si está automatizando la limpieza o procesando correos electrónicos en lotes.

Envuélvalo todo junto para la automatización

Una vez que le pilles el truco, puedes configurar tareas programadas con scripts de PowerShell que revisen periódicamente tu buzón para ver si hay nuevos correos, procesen archivos adjuntos o activen alertas. Recuerda que Outlook debe estar ejecutándose; de ​​lo contrario, recibirás errores indicando que no puedes conectarte al buzón.

Ah, y si tienes problemas, revisa tu perfil y permisos de Outlook. A veces, ejecutar PowerShell como administrador ayuda si tienes problemas de acceso. Además, asegúrate de que la configuración de seguridad de Outlook permita el acceso programático; algunas configuraciones corporativas lo bloquean por defecto.