Here is a script that lets you download mail objects with attachments from an Exchange mailbox (works with Office 365). First, install Exchange Web Services Managed API 2.2.
# Destination folder
$destinationFolder = "C:\Users\marius\Downloads\Attachment Downloader"
# replace with your email address
$email = "username@mytenant.onmicrosoft.com"
$username = "username@mytenant.onmicrosoft.com"
$password = "Password123!"
# File extensions to download
$extensions = "pdf","pdfa","doc","docx","dot","dotx","xls","xlsx","ppt","pptx"
# load the assembly
Add-Type -Path "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"
# Create Exchange Service object
$s = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013_SP1)
$s.Credentials = New-Object Net.NetworkCredential($username, $password)
# $s.TraceEnabled = $true
Write-Host "Trying AutoDiscover... "
$s.AutodiscoverUrl($email, {$true})
if(!$s.Url) {
Write-Error "AutoDiscover failed"
return;
} else {
Write-Host -ForegroundColor Green "AutoDiscover succeeded - $($s.Url)"
}
# Create destination folder
$destinationFolder = "{0}\{1}" -f $destinationFolder, (Get-Date -Format "yyyyMMdd HHmmss")
mkdir $destinationFolder | Out-Null
# 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;
# Find the items
$inc = 0;
$maxRepeat = 50;
do {
$maxRepeat -= 1;
Write-Host "Searching for items in mailbox... " -NoNewline
$items = $inbox.FindItems(100)
Write-Host -ForegroundColor Green "found $($items.items.Count)"
foreach ($item in $items.Items)
{
# Create mail folder
$inc += 1
$mailFolder = "{0}\{1}" -f $destinationFolder, $inc;
mkdir $mailFolder | Out-Null
# load the property set to allow us to get to the body
try {
$item.load($psPropertySet)
Write-Host ("$inc - $($item.Subject)") -ForegroundColor Yellow
# save the metadata to a file
$item | Export-Clixml ("{0}\metadata.xml" -f $mailFolder)
# save all attachments
foreach($attachment in $item.Attachments) {
if(($attachment.Name -split "\." | select -last 1) -in $extensions) {
Write-Host " - $($attachment.Name) - $([Math]::Round($attachment.Size / 1024))KB"
$fileName = ("{0}\{1}" -f $mailFolder, $attachment.Name) -replace "/",""
$attachment.Load($fileName)
}
}
# delete the mail item
$item.Delete([Microsoft.Exchange.WebServices.Data.DeleteMode]::HardDelete, $true)
} catch [Exception] {
Write-Error "Unable to load item: $($_)"
}
}
} while($items.MoreAvailable -and $maxRepeat -ge 0)