Der Zugriff auf Outlook über PowerShell zum Abrufen, Lesen und Bearbeiten von E-Mails ist praktisch, kann aber etwas knifflig sein, wenn man mit den COM-Objekten von Outlook nicht vertraut ist. Häufig scheitert man daran, dass Outlook ausgeführt werden muss und Berechtigungs- oder Profilprobleme zu Verwirrung führen können. Um verschiedene Ordner zu überprüfen oder bestimmte E-Mails zu filtern, benötigt man außerdem die richtigen Befehle zum Durchsuchen von Ordnern und Elementen. Diese Anleitung erklärt, was Sie für die Einrichtung benötigen, welche häufigen Fehlerquellen es gibt und wie Sie die Konfiguration an Ihre Bedürfnisse anpassen.
Wie man E-Mails aus Outlook mit PowerShell liest
Prüfen Sie, ob Outlook bereits ausgeführt wird, und starten Sie es gegebenenfalls.
- Wenn Outlook nicht geöffnet ist, kann PowerShell nicht auf Ihr Postfach zugreifen.Überprüfen Sie daher zunächst, ob Outlook geöffnet ist, und starten Sie es gegebenenfalls im Hintergrund. Hier ist eine gängige Vorgehensweise:
$OutlookProc = (Get-Process | Where-Object { $_. ProcessName -eq "OUTLOOK" })
Wenn keine Ausgabe erfolgt, ist Outlook wahrscheinlich nicht aktiv. Sie können es daher wie folgt im Hintergrund starten:
if (-not $OutlookProc) { Start-Process outlook.exe -WindowStyle Hidden Start-Sleep -Seconds 5 # Wait a bit for Outlook to load }
Bei manchen Systemen benötigt Outlook einige Sekunden zum vollständigen Laden, daher ist diese kurze Pause wichtig. Es ist zwar etwas ärgerlich, aber wenn Outlook nicht ausgeführt wird, kann PowerShell Ihre E-Mails nicht empfangen, es sei denn, Sie starten Outlook zuerst.
Outlook-COM-Objekt laden und auf das Postfach zugreifen
- Dies ist der Befehl, mit dem Outlook-Backend zu kommunizieren:
Add-Type -AssemblyName "Microsoft. Office. Interop. Outlook" $Outlook = New-Object -ComObject Outlook. Application
Sobald Sie das COM-Objekt erstellt haben, können Sie Ihren Postfach-Namespace abrufen, was im Grunde nur eine elegante Bezeichnung für den Hauptcontainer für Ordner und E-Mails ist:
$namespace = $Outlook. GetNameSpace("MAPI")
Hier befinden sich alle Ihre E-Mail-Daten. Wenn Sie mehrere Profile oder E-Mail-Konten verwenden, müssen Sie möglicherweise das gewünschte Profil oder Konto angeben, aber für die meisten funktioniert dies so.
Erstellen Sie eine Liste aller Ordner in Ihrem Postfach (damit Sie wissen, was sich darin befindet).
- Manchmal ist man sich nicht sicher, ob sich die E-Mails im „Posteingang“ oder in einem anderen Ordner befinden. Um alle Ordner anzuzeigen, führen Sie folgenden Befehl aus:
$namespace. Folders | ForEach-Object { $_. Name }
Um Unterordner anzuzeigen, können Sie folgendermaßen vorgehen:
$namespace. Folders | ForEach-Object { $_. Folders | ForEach-Object { "$($_. FolderPath)" } }
Oder, noch besser, listen Sie sie rekursiv mit einer einfachen Funktion auf. Ich habe so etwas schon einmal verwendet, um eine Baumansicht aller Ordner und ihrer Elementanzahl zu erhalten. Das hilft dabei, herauszufinden, wo sich Ihre E-Mails befinden, sodass Sie den richtigen Ordner anvisieren können, anstatt immer vom Posteingang auszugehen.
Den Standardordner für eingehende E-Mails abrufen
- Dies ist üblicherweise der „Posteingang“, aber in anderen Sprachen oder regionalen Einstellungen kann er anders benannt sein.
$inbox = $namespace. GetDefaultFolder([Microsoft. Office. Interop. Outlook. OlDefaultFolders]::olFolderInbox)
Sobald Sie den Ordner haben, ist das Auflisten der darin enthaltenen E-Mails unkompliziert:
$inbox. Items | Select-Object SenderEmailAddress, To, Subject, Size, ReceivedTime | Format-Table -AutoSize
Dies ermöglicht einen schnellen Überblick, und Sie können mit Where-Object weiter filtern oder suchen, zum Beispiel so:
$todaySender = "[email protected]" $today = Get-Date $inbox. Items | Where-Object { $_. ReceivedTime -ge $today. Date -and $_. SenderEmailAddress -eq $todaySender }
Ich bin mir nicht sicher, warum es funktioniert, aber das Filtern nach Datum und Absender hilft dabei, genau die E-Mails zu finden, die man sucht.
E-Mail-Details lesen und Anhänge bearbeiten
- Um den Inhalt einer E-Mail einzusehen, können Sie je nach Bedarf auf `Body` oder `HTMLBody` zugreifen. Beispiel: Die neueste E-Mail abrufen und deren Inhalt extrahieren:
$latest = $inbox. Items | Sort-Object ReceivedTime -Descending | Select-Object -First 1 $latest | Select-Object SenderEmailAddress, Subject, Body, HTMLBody
Wenn die E-Mail Anhänge enthält und Sie diese speichern möchten, überprüfen Sie zuerst deren Anzahl. So geht’s:
$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 }
Stellen Sie sicher, dass der Ordner existiert, sonst gibt PowerShell eine Fehlermeldung aus. Falls die E-Mail mehrere Anhänge enthält, müssen diese nacheinander gespeichert werden.
Eine E-Mail löschen oder als gelesen markieren
- Manchmal möchte man Spam löschen oder E-Mails direkt archivieren:
$latest | ForEach-Object { $_. Delete() }
Alternativ kann das Markieren als gelesen anstatt des Löschens durch Umschalten des Attributs „Ungelesen“ erfolgen:
$latest. UnRead = $false $latest. Save()
Gut zu wissen, insbesondere wenn Sie die Bereinigung automatisieren oder E-Mails in Stapeln verarbeiten.
Alles zusammenfassen für die Automatisierung
Sobald Sie sich damit vertraut gemacht haben, können Sie mithilfe von PowerShell-Skripten geplante Aufgaben einrichten, die Ihr Postfach regelmäßig auf neue E-Mails überprüfen, Anhänge verarbeiten oder Benachrichtigungen auslösen. Beachten Sie jedoch, dass Outlook ausgeführt werden muss, da sonst Fehlermeldungen bezüglich einer fehlenden Verbindung zum Postfach auftreten.