Saltar al contenido

¿Cómo verificar un buzón de Exchange a través de PowerShell?

Después de de una prolongada recopilación de información resolvimos este contratiempo que tienen muchos de nuestros lectores. Te dejamos la solución y esperamos serte de mucha ayuda.

Solución:

En primer lugar, me disculpo porque esta respuesta es casi dos años después de la pregunta, pero también quería revisar el correo electrónico usando Powershell y encontré esta pregunta. Con suerte, mi código servirá como referencia / punto de partida para alguien más que busque la perspectiva mía de Powershell. Planeo mejorar esto yo mismo para que sea más útil.

Soy bastante nuevo en Powershell, por lo que mis scripts son predominantemente de Frankenstein de varios artículos, publicaciones de blog y preguntas y respuestas de StackOverflow, por supuesto, ¡el siguiente script no es una excepción!

Siguiendo la respuesta de Chris, investigué un poco más en Internet y improvisé algunos fragmentos de Powershell para permitirme mostrar algunos key piezas de información de correos electrónicos.

Lamentablemente, carece de un estilo “adecuado” y estoy seguro de que cualquier gurú de Powershell se avergonzará de esto. Pero lo que hace este código es

  • mostrar cómo usar EWS y Powershell para leer correos electrónicos
  • abordar la última pregunta de George con respecto a: el cuerpo está en blanco – el FindItems El método no devuelve el artículo de correo completo, debe realizar otro viaje de ida y vuelta para obtener la información adicional que necesita.
  • elimine el requisito de que use nombre de usuario / contraseña / dominio usando sus credenciales actuales
  • elimine el requisito de ‘instalar’ EWS, simplemente extraiga el MSI y haga referencia a la dll

Usar…

Descargue el EWS desde aquí y luego extráigalo en algún lugar, por ejemplo

msiexec /a C:PathToDownloadsEwsManagedApi.msi /qb TARGETDIR=C:ProgsEwsManagedApi

luego llame a este script usando dot-source, p. ej.

. C:PathToScriptOutlook_ReadInbox.ps1

que le permite hacer referencia a los objetos / variables del script después de que se haya ejecutado.

El código tiene comentarios limitados en todas partes, así como algunos enlaces al final, a los que hice referencia al ensamblar el guión.

Aquí está mi borrador alfa del código para leer en los primeros 5 correos electrónicos, mostrar si está leído / no leído y mostrar los primeros 100 caracteres del cuerpo del correo electrónico en una línea sin espacios en blanco.

# work with exchange server to retrieve messages
# see this SO answer: http://stackoverflow.com/a/4866894

# call this script using dot-source (see http://technet.microsoft.com/en-us/library/ee176949.aspx)
# to allow continued use of the objects, specifically, reading our inbox
# e.g...
# . C:PathToScriptOutlook_ReadInbox.ps1

# replace with your email address
$email    = "[email protected]"

# only need to populate these if you're impersonating...
$username = "YOUR_USER_NAME"
$password = "YOUR_LAN_PASSWORD"
$domain   = "YOUR_DOMAIN"

# to allow us to write multi-coloured lines
# see http://stackoverflow.com/a/2688572
# usage: Write-Color -Text Red,White,Blue -Color Red,White,Blue
# usage: Write-Color Red,White,Blue Red,White,Blue
function Write-Color([String[]]$Text, [ConsoleColor[]]$Color) 
    for ($i = 0; $i -lt $Text.Length; $i++) 
        Write-Host $Text[$i] -Foreground $Color[$i] -NoNewLine
    
    Write-Host


# load the assembly
[void] [Reflection.Assembly]::LoadFile("C:ProgsEwsManagedApiMicrosoft.Exchange.WebServices.dll")

# set ref to exchange, first references 2007, 2nd is 2010 (default)
$s = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2007_SP1)
#$s = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService

# use first option if you want to impersonate, otherwise, grab your own credentials
#$s.Credentials = New-Object Net.NetworkCredential($username, $password, $domain)
#$s.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials
$s.UseDefaultCredentials = $true

# discover the url from your email address
$s.AutodiscoverUrl($email)

# get a handle to the inbox
$inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($s,[Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox)

#create a property set (to let us access the body & other details not available from the FindItems call)
$psPropertySet = new-object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties)
$psPropertySet.RequestedBodyType = [Microsoft.Exchange.WebServices.Data.BodyType]::Text;

$items = $inbox.FindItems(5)

#set colours for Write-Color output
$colorsread = "Yellow","White"
$colorsunread = "Red","White"

# output unread count
Write-Color -Text "Unread count: ",$inbox.UnreadCount -Color $colorsread

foreach ($item in $items.Items)
 Measure-Object -Minimum).Minimum
  $bod = $bod.Substring(0,$bodCutOff)
  $bod = "$bod..."

  # output the results - first of all the From, Subject, References and Message ID
  write-host "====================================================================" -foregroundcolor White
  Write-Color "From:    ",$($item.From.Name) $colors
  Write-Color "Subject: ",$($item.Subject)   $colors
  Write-Color "Body:    ",$($bod)            $colors
  write-host "====================================================================" -foregroundcolor White
  ""



# display the newest 5 items
#$inbox.FindItems(5)
# display the unread items from the newest 5
#$inbox.FindItems(5) | ?$_.IsRead -eq $False | Select Subject, Sender, DateTimeSent | Format-Table -auto

# returns the number of unread items
# $inbox.UnreadCount


#see these URLs for more info
# EWS
# folder members: https://msdn.microsoft.com/en-us/library/microsoft.exchange.webservices.data.folder_members%28v=exchg.80%29.aspx
# exporting headers: http://www.stevieg.org/tag/how-to/
# read emails with EWS: https://social.technet.microsoft.com/Forums/en-US/3fbf8348-2945-43aa-a0bc-f3b1d34da27c/read-emails-with-ews?forum=exchangesvrdevelopment
# Powershell
# multi-color lines: http://stackoverflow.com/a/2688572



# download the Exchange Web Services Managed API 1.2.1 from
# http://www.microsoft.com/en-us/download/details.aspx?id=30141
# extract somewhere, e.g. ...
# msiexec /a C:UsersYourUsernameDownloadsEwsManagedApi.msi /qb TARGETDIR=C:ProgsEwsManagedApi

Deberá tener instalada la API de EWS y deberá verificar la ruta a la DLL en la parte de carga del Ensamblaje de Reflection.

Esto debería llevarlo al punto en el que pueda trabajar con la instrucción $ inbox.FindItems (5) y filtrar los resultados que desea de ahí.

[Reflection.Assembly]::LoadFile("C:Program FilesMicrosoftExchangeWeb Services1.0Microsoft.Exchange.WebServices.dll")
$s = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2007_SP1)
$s.Credentials = New-Object Net.NetworkCredential('user', 'pass', 'domain')
$s.AutodiscoverUrl("[email protected]")

$inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($s,[Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox)
$inbox.FindItems(5)

Te mostramos las reseñas y valoraciones de los usuarios

Eres capaz de añadir valor a nuestro contenido informacional tributando tu experiencia en las interpretaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *