Challenge Accepted
onderstaande heb ik in 25 minuten in elkaar gezet (kinderen zijn druk dus duurde het wat langer)
PowerShell:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| <#
Simpel scriptje om mails vanaf een Exchange server (en Exchange Online)
te downloaden en de mime data op te slaan als .eml file.
de Microsoft.Exchange.WebServices assembly is hiervoor vereist.
Deze is via Install-Package binnen te halen via Nuget en anders op
de Microsoft website en Github terug te vinden.
Script is gemaakt voor PS versie 5+ en zal niet werken in PS 3 en 4
#>
# laad de EWS assembly
Add-Type -Path "C:\Assemblies\Microsoft.Exchange.WebServices.2.2\lib\40\Microsoft.Exchange.WebServices.dll"
# vraag je credentials op en sla ze op in een variable
$ExchangeCredentials = Get-Credential
# Maak een Exchange Service object aan.
$EX = [Microsoft.Exchange.WebServices.Data.ExchangeService]::new()
# stel de credentials in : aangezien de credentials property een iCredentials object verwacht doe ik een cast.
$EX.Credentials = [System.Net.ICredentials]$ExchangeCredentials
# Doe een autodiscover.. De {$true} is om eventuele certificaat issues te onderdrukken
$EX.AutodiscoverUrl($ExchangeCredentials.UserName,{$true})
# De ItemView bepaalt hoeveel items je terug krijgt bij een FindItems
$ItemView = [Microsoft.Exchange.WebServices.Data.ItemView]::new(10)
# vraag de items op. Ik kies in dit voorbeeld voor de "wellknownfolder" genaamd Inbox
$Items = $EX.FindItems([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox,$ItemView)
# Maak de propertySet aan waarmee de Mime contents ingeladen kunnen worden.
$PropertySet = [Microsoft.Exchange.WebServices.Data.PropertySet]::new([Microsoft.Exchange.WebServices.Data.ItemSchema]::MimeContent)
$PropertySet.Add([Microsoft.Exchange.WebServices.Data.ItemSchema]::DateTimeSent) # Ivm het samenstellen van de filename vraag ik ook de sendDate op
# Loop nu door de items heen...
foreach ($Mail in $Items.Items)
{
# Laad de mime properties..
$Mail.Load($PropertySet)
# Stel de filename samen - in dit voorbeeld : c:\test\DagMaandJaar-UurMinuutSeconde.eml
$FileName = [string]::Format('c:\test\{0}.eml',$Mail.DateTimeSent.ToString("ddMMyyyy-hhmmss"))
# en sla het bestand op...
[System.IO.File]::WriteAllBytes($FileName,$Mail.MimeContent.Content)
} |
Dit is een simpel voorbeeld : het doet een autodiscover, trekt de laatste 10 mails uit de inbox, laad de mime properties en slaat ze vervolgens op als .eml file.
Een aantal van de mogelijkheden van EWS (welke ik niet in dit script geïmplementeerd heb maar wat ook niet zo lastig is) :
- verbinden met een andere mailbox waar je rechten op hebt
- event subscription aanmaken welke reageert op een NewMail event (dus zodra er een nieuwe mail binnenkomt kun je automatisch een handeling uit laten voeren zoals de mail opslaan).
[
Voor 82% gewijzigd door
Killah_Priest op 19-12-2018 19:23
]