2010-12-15 2 views
16

Wie würde ich Powershell verwenden, um den Text und die Header der letzten 5 empfangenen Nachrichten an mein Exchange-E-Mail-Konto zurückzugeben? Gibt es einen einfachen Weg/Bibliothek, um dies zu tun?Wie überprüfe ich ein Exchange-Postfach über die Powershell?

Dies steht im Zusammenhang mit my question about not using outlook on superuser. Abgesehen davon, dass ich keine guten Alternativen gefunden habe, könnte ich meinen eigenen einfachen Powershell-Client schreiben.

+0

eh? Warum eine Stimme für das Schließen? –

+0

Wo müssen Sie dies auf einem lokalen Computer überprüfen, auf dem der Oulook-Client installiert ist, oder auf dem Exchange-Server (der wahrscheinlich nicht über den Client verfügt)? Muss es eine freie Lösung sein? –

+0

Ich möchte eine Alternative zu Outlook öffnen nur um einen Link aus einer E-Mail zu bekommen. Nehmen wir an, Outlook ist nicht installiert und ja, ich möchte, dass es kostenlos ist, da ich es gerne auf PoshCode setzen würde. Ich habe graben und wirklich Pop3 würde wahrscheinlich gut funktionieren. –

Antwort

14

Sie werden die EWS API installiert haben müssen, und Sie werden den Pfad der DLL in der Reflexion Assembly Lastabschnitt überprüfen müssen.

Dies sollte Sie zu dem Punkt, wo Sie in der Lage sind, mit der $ inbox.FindItems (5) Anweisung zu arbeiten und die Ergebnisse filtern Sie aus, dass wollen.

[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) 
+0

Danke Chris, Große Antwort, keine Ahnung, warum die Body-Eigenschaft immer leer ist? –

+0

Hier ist auch ein [alternatives Skript] (http://poshcode.org/2520) – jpaugh

21

Zunächst entschuldigt, dass diese Antwort fast zwei Jahre nach der Frage, aber ich wollte auch E-Mail überprüfen Powershell verwenden und diese Frage gefunden. Hoffentlich dient mein Code als Referenz/Startpunkt für jemand anderen, der von PowerShell aus auf meinen Outlook schaut. Ich plane, dies selbst zu verbessern, um es brauchbarer zu machen.

Ich bin ziemlich neu in Powershell, also meine Skripte sind überwiegend Frankenstein-ed aus verschiedenen Artikeln, Blog-Posts und StackOverflow Q & A ist natürlich das Skript unten keine Ausnahme!

Nach der Antwort von Chris habe ich ein wenig weiter im Internet geforscht und ein paar Powershell-Ausschnitte zusammengetragen, damit ich einige wichtige Informationen aus E-Mails anzeigen konnte.

Es fehlen leider in jedem ‚richtigen‘ Stil und ich bin sicher, dass alle Powershell-Gurus in diesem erschaudern wird. Aber was dieser Code tut, ist

  • zeigen, wie EWS & Powershell verwenden, E-Mails lesen
  • Adresse Georges letzte Frage Re: Der Körper ist leer - die FindItems Methode gibt nicht die vollständige Postsendung, Sie müssen Sie einen weiteren Rundgang machen, um die zusätzlichen Informationen zu erhalten, die Sie benötigen.
  • die Anforderung entfernen Sie Benutzername/Passwort/Domain verwenden, indem Sie Ihre aktuellen Anmeldeinformationen
  • entfernen Sie die Anforderung unter Verwendung von EWS zu ‚installieren‘, einfach die MSI extrahieren und die dll

nutzen zu können, verweisen .. das EWS

Herunterladen

. from here dann irgendwo extrahieren, zB

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

dann rufen dieses Skript Punktquelle verwendet wird, z.B.

. C:\Path\To\Script\Outlook_ReadInbox.ps1

, die Sie die Objekte/Variablen aus dem Skript verweisen können, nachdem sie ausgeführt hat.

Der Code hat einen begrenzten Kommentar im gesamten Gebäude, sowie einige Links am Ende, die ich verweisen, wenn sie zusammen das Skript cobbling.

Hier ist mein Alpha-Entwurf des Codes in den ersten 5 E-Mails lesen, anzeigen, ob gelesen/ungelesen und zeigen die ersten 100 Zeichen des E-Mail-Körpers in einer Zeile mit Leerraum entfernt.

# 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 
+0

Du bist mein Held. – ledgeJumper

+0

Meister !!!!!!! –

+0

Es ist so hässlich, wie du gewarnt hast, aber genau das, was ich brauchte. Gutes Zeug! :-) –

Verwandte Themen