Via PowerShell toegang krijgen tot Outlook om e-mails op te halen, te lezen en zelfs te bewerken is erg handig, maar ook een beetje lastig als je niet bekend bent met de werking van de COM-objecten van Outlook. De meeste mensen lopen vast omdat Outlook actief moet zijn en problemen met machtigingen of profielen voor verwarring kunnen zorgen. Bovendien heb je de juiste opdrachten nodig om door mappen en items te bladeren als je verschillende mappen wilt controleren of specifieke e-mails wilt filteren. Deze handleiding beschrijft wat je nodig hebt om het werkend te krijgen, enkele veelvoorkomende valkuilen en hoe je het kunt aanpassen aan jouw specifieke configuratie.
Hoe lees je e-mails uit Outlook met PowerShell?
Controleer of Outlook al actief is en start het zo nodig.
- Als Outlook niet geopend is, kan PowerShell uw mailbox niet zien. Controleer daarom eerst of Outlook is geopend en start het programma op de achtergrond. Dit is een veelgebruikte manier om dat te doen:
$OutlookProc = (Get-Process | Where-Object { $_. ProcessName -eq "OUTLOOK" })
Als er geen resultaten verschijnen, is Outlook waarschijnlijk niet actief. Je kunt het programma dus als volgt stilzwijgend starten:
if (-not $OutlookProc) { Start-Process outlook.exe -WindowStyle Hidden Start-Sleep -Seconds 5 # Wait a bit for Outlook to load }
Bij sommige systemen duurt het een paar seconden voordat Outlook volledig is geladen, dus die pauze is cruciaal. Het is een beetje vervelend, maar als Outlook niet actief is, kan PowerShell je e-mail niet zien tenzij je het eerst start.
Laad het Outlook COM-object en krijg toegang tot de mailbox.
- Dit is wat PowerShell vertelt om met de backend van Outlook te communiceren:
Add-Type -AssemblyName "Microsoft. Office. Interop. Outlook" $Outlook = New-Object -ComObject Outlook. Application
Nadat je het COM-object hebt gemaakt, kun je de naamruimte van je mailbox ophalen. Dit is eigenlijk gewoon de hoofdcontainer voor mappen en e-mails:
$namespace = $Outlook. GetNameSpace("MAPI")
Hier vind je alle e-mailgerelateerde informatie. Als je meerdere profielen of e-mailaccounts gebruikt, moet je mogelijk aangeven welke je wilt gebruiken, maar in de meeste gevallen werkt dit gewoon.
Toon alle mappen in je mailbox (zodat je weet wat erin zit)
- Soms weet je niet zeker of je e-mails in ‘Postvak IN’ of in een andere map staan. Om alle mappen te bekijken, voer je het volgende commando uit:
$namespace. Folders | ForEach-Object { $_. Name }
Als je submappen wilt bekijken, kun je als volgt inzoomen:
$namespace. Folders | ForEach-Object { $_. Folders | ForEach-Object { "$($_. FolderPath)" } }
Of, nog beter, geef ze recursief weer met een eenvoudige functie. Ik heb er al eens zo een gebruikt om een boomstructuur te krijgen van alle mappen en het aantal items daarin. Het helpt je te vinden waar je e-mails zich bevinden, zodat je de juiste map kunt selecteren in plaats van er altijd vanuit te gaan dat het ‘Postvak IN’ is.
De standaardmap voor inkomende e-mails ophalen
- Dit heet meestal “Inbox”, maar in verschillende talen of regionale instellingen kan de naam anders zijn.
$inbox = $namespace. GetDefaultFolder([Microsoft. Office. Interop. Outlook. OlDefaultFolders]::olFolderInbox)
Als je de map eenmaal hebt, is het eenvoudig om de e-mails erin weer te geven:
$inbox. Items | Select-Object SenderEmailAddress, To, Subject, Size, ReceivedTime | Format-Table -AutoSize
Dit geeft een snel overzicht, en je kunt verder filteren of zoeken met Where-Object, zoals hieronder:
$todaySender = "[email protected]" $today = Get-Date $inbox. Items | Where-Object { $_. ReceivedTime -ge $today. Date -and $_. SenderEmailAddress -eq $todaySender }
Ik weet niet precies waarom het werkt, maar filteren op datum en afzender helpt om die specifieke e-mails te vinden waarnaar je op zoek bent.
Lees de details in e-mails en verwerk bijlagen.
- Om de inhoud van een e-mail te bekijken, kunt u `Body` of `HTMLBody` gebruiken, afhankelijk van wat u nodig hebt. Bijvoorbeeld: pak de meest recente e-mail en bekijk de inhoud ervan:
$latest = $inbox. Items | Sort-Object ReceivedTime -Descending | Select-Object -First 1 $latest | Select-Object SenderEmailAddress, Subject, Body, HTMLBody
Als de e-mail bijlagen bevat en je die wilt bewaren, controleer dan eerst het aantal. Zo doe je dat:
$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 }
Zorg ervoor dat de map bestaat, anders geeft PowerShell een foutmelding. Als de e-mail meerdere bijlagen bevat, doorloop deze dan om ze allemaal op te slaan.
Een e-mail verwijderen of als gelezen markeren
- Soms wil je spam verwijderen of e-mails direct archiveren:
$latest | ForEach-Object { $_. Delete() }
Als alternatief kan het markeren als gelezen in plaats van verwijderd te worden gedaan door het attribuut ‘Niet gelezen’ in of uit te schakelen :
$latest. UnRead = $false $latest. Save()
Handig om te weten, vooral als je het opschonen automatiseert of e-mails in batches verwerkt.
Alles samenbrengen voor automatisering
Als je het eenmaal onder de knie hebt, kun je geplande taken instellen met PowerShell-scripts die periodiek je mailbox controleren op nieuwe e-mails, bijlagen verwerken of waarschuwingen activeren. Vergeet niet dat Outlook wel actief moet zijn, anders krijg je foutmeldingen dat er geen verbinding met de mailbox kan worden gemaakt.