Download Attachments from user Mailbox using EWS Managed API, you can define specific folder to download the attachments from.
set the $itemsview to download more no of items from user mailbox default is set to 10
POWERSHELL
# Usage Example:
# .\Download-Attachments-from-Email-Ews.ps1 -mailbox "test@xyz.com" -downloadDirectory "\\Lab-01\Downloads" `
# -folderName "Reports" -AdminuserName admin@xyz.com -password Mypass -ItemsView 100
As we are going to use the EWS make sure you met all the prerequisites before you plan to run this script.
- Admin account should have application impersonation rights, you can follow this msdn post to setup the permissions.
- Install EWS managed API on system where you plan to run the script from, if API is not installed, download the same from here
POWERSHELL
#Download Attachment From User Mailbox Programmatically
#This script can be used to download attachments Programmatically from a user Mailbox
# Usage Example:
# .\Download-Attachments-from-Email-Ews.ps1 -mailbox "test@xyz.com" -downloadDirectory "\\Lab-01\Downloads" `
# -folderName "Reports" -AdminuserName admin@xyz.com -password Mypass
param (
$mailbox="sunil.chauhan@xyz.com",
$downloadDirectory="\\Lab-host\Attachments",
$folderName="Daily Report",
$AdminuserName,
$password,
POWERSHELL
$itemsView=10
)
POWERSHELL
$uri=[system.URI] "https://outlook.office365.com/ews/exchange.asmx"
$dllpath = "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"
Import-Module $dllpath
## Set Exchange Version
$ExchangeVersion = [Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP2
$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService($ExchangeVersion)
$service.Credentials = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials -ArgumentList $AdminuserName, $password
$service.url = $uri
$service.ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId `
([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SMTPAddress,$mailbox);
$Folderid=new-object Microsoft.Exchange.WebServices.Data.FolderId `
([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::MsgFolderRoot,$Mailbox)
$MailboxRoot=[Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$folderid)
$FolderList = new-object Microsoft.Exchange.WebServices.Data.FolderView(100)
$FolderList.Traversal = [Microsoft.Exchange.WebServices.Data.FolderTraversal]::Deep
$findFolderResults = $MailboxRoot.FindFolders($FolderList)
$allFolders=$findFolderResults | ? {$_.FolderClass -eq "IPF.Note"}
$FolderToSearchForAttachment=$allFolders | ? {$_.DisplayName -eq $folderName}
$ItemsWithAttachments=new-object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo `
([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::HasAttachments, $true)
$ItemView=New-Object Microsoft.Exchange.WebServices.Data.ItemView($itemsView)
$ItemsWithAttachments = $FolderToSearchForAttachment.FindItems($ItemsWithAttachments,$ItemView)
Write-host "Downloading..."
foreach($MailItems in $ItemsWithAttachments.Items)
JSON
{
$MailItems.Load()
foreach($attach in $MailItems.Attachments)
JSON
{
$Name=("AD-" +(($attach.lAstModifiedTime).ToShortDateString()) + "-" + $attach.Name.ToString())
$Name=$Name.replace("/","-")
write-host "Attachment saved to Path:"(($downloadDirectory + "\" + $name))
$attach.Load()
$File = new-object System.IO.FileStream(($downloadDirectory + "\" + $Name), [System.IO.FileMode]::Create)
$File.Write($attach.Content, 0, $attach.Content.Length)
$File.Close()
}
}