¿Cómo verificar un buzón de intercambio a través de Powershell?

¿Cómo utilizaré PowerShell para devolver el texto y los encabezados de los últimos 5 mensajes recibidos a mi cuenta de correo electrónico de intercambio? ¿Hay una manera / biblioteca simple de hacer esto?

Esto está relacionado con mi pregunta sobre no usar Outlook en superusuario . Excepto que al no haber encontrado ninguna buena alternativa, creo que también podría escribir mi propio cliente simple de powershell.

Necesitará tener instalada la API EWS , y deberá verificar la ruta a la DLL en la porción de carga de Reflection Assembly.

Esto debería llevarlo al punto en el que puede trabajar con la statement $ inbox.FindItems (5) y filtrar los resultados que desee de eso.

[Reflection.Assembly]::LoadFile("C:\Program Files\Microsoft\Exchange\Web Services\1.0\Microsoft.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@address.com") $inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($s,[Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox) $inbox.FindItems(5) 

En primer lugar, me disculpo porque esta respuesta es casi dos años después de la pregunta, pero también quise consultar el correo electrónico usando Powershell y encontré esta pregunta. Espero que mi código sirva como referencia / punto de partida para otra persona que mire las perspectivas de Mineershell. Planeo mejorar esto para que sea más útil.

Soy bastante nuevo en Powershell, por lo que mis guiones son en su mayoría escritos de Frankenstein de varios artículos, publicaciones en blogs y Q & A de StackOverflow, ¡y el guión a continuación 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 datos clave de los correos electrónicos.

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

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

Usar…

Descargue el EWS desde aquí y luego extraiga en alguna parte, por ej.

msiexec /a C:\Path\To\Downloads\EwsManagedApi.msi /qb TARGETDIR=C:\Progs\EwsManagedApi

luego llama a este script usando dot-source, por ejemplo

. C:\Path\To\Script\Outlook_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 todo momento, así como algunos enlaces al final, a los que hice referencia cuando redacté el guión.

Aquí está mi borrador alfa de 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 con espacio en blanco eliminado.

 # 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 # eg.. # . C:\Path\To\Script\Outlook_ReadInbox.ps1 # replace with your email address $email = "your.name@yourdomain.com" # 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:\Progs\EwsManagedApi\Microsoft.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) { # load the property set to allow us to get to the body $item.load($psPropertySet) # colour our output If ($item.IsRead) { $colors = $colorsread } Else { $colors = $colorsunread } #format our body #replace any whitespace with a single space then get the 1st 100 chars $bod = $item.Body.Text -replace '\s+', ' ' $bodCutOff = (100,$bod.Length | 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, eg ... # msiexec /a C:\Users\YourUsername\Downloads\EwsManagedApi.msi /qb TARGETDIR=C:\Progs\EwsManagedApi