.net - seguimiento - ¿Cómo revisar un buzón de correo electrónico a través de powershell?
ver correos enviados exchange 2010 (2)
En primer lugar, me disculpo por esta respuesta casi dos años después de la pregunta, pero también quería consultar el correo electrónico utilizando Powershell y encontré esta pregunta. Espero que mi código sirva como referencia / punto de partida para alguien más que esté buscando la perspectiva de Powershell. Planeo mejorar esto yo mismo para hacerlo más útil.
Soy bastante nuevo en Powershell, por lo que mis guiones son predominantemente de Frankenstein-ed de varios artículos, publicaciones de blog y preguntas y respuestas de StackOverflow, por supuesto, ¡el guión a continuación no es una excepción!
A raíz de la respuesta de Chris, investigué un poco más en Internet y armé algunos fragmentos de Powershell para poder mostrar algunos datos clave de los correos electrónicos.
Lamentablemente, carece de un estilo "apropiado" y estoy seguro de que cualquier gurú de Powershell se estremecerá ante esto. Pero lo que hace este código 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étodoFindItems
no devuelve el elemento de correo completo, tiene que hacer otro viaje de ida y vuelta para obtener la información adicional que necesita. - elimine el requisito para 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 a la dll
Usar...
Descargue el EWS desde aquí y luego extráigalo en algún lugar, por ej.
msiexec /a C:/Path/To/Downloads/EwsManagedApi.msi /qb TARGETDIR=C:/Progs/EwsManagedApi
a continuación, llame a este script utilizando el código fuente, por ejemplo
. C:/Path/To/Script/Outlook_ReadInbox.ps1
lo que le permite hacer referencia a los objetos / variables de la secuencia de comandos después de que se haya ejecutado.
El código tiene un número limitado de comentarios, así como algunos enlaces al final, a los que hice referencia cuando se mezclaban el script.
Aquí está mi borrador alfa de código para leer en los primeros 5 correos electrónicos, mostrar si 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:/Path/To/Script/Outlook_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:/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, e.g. ...
# msiexec /a C:/Users/YourUsername/Downloads/EwsManagedApi.msi /qb TARGETDIR=C:/Progs/EwsManagedApi
¿Cómo utilizaría 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 forma simple / biblioteca para 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 de EWS , y deberá verificar la ruta a la DLL en la parte de carga de Reflection Assembly.
Esto debería llevarlo al punto en el que puede trabajar con la instrucción $ inbox.FindItems (5) y filtrar los resultados que desea obtener 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 protected]")
$inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($s,[Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox)
$inbox.FindItems(5)