Home > Back-end >  PowerShell EWS API | How to download attachments?
PowerShell EWS API | How to download attachments?

Time:12-06

In the code below, I am able to retrieve the subject of the email but unable to download the attachment. I am not even able to output the name of the attachment. The attachment is a WAV sound file.

Import-Module "C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll"

$folderid = new-object Microsoft.Exchange.WebServices.Data.FolderId($v_FolderID)
$fiItems = $null
$iv = new-object Microsoft.Exchange.WebServices.Data.ItemView(1000)
$fiItems = $service.FindItems($folderid, $args[1], $iv)

foreach ($Item in $fiItems.Items[0])
{
    $v_Subject = $Item.Subject
    
    foreach($attachment in $Item.Attachments)
    {
    $attachment.Load()
    $attachmentname = $attachment.Name.ToString()
    $attachmentname
    $file = New-Object System.IO.FileStream("C:\", [System.IO.FileMode]::Create)
    $file.Write($attachment.Content, 0, $attachment.Content.Length)
    $file.Close()
    }

}
$iv.offset  = $fiItems.Items.Count

Out-File -FilePath "C:\EWSSubject.txt" -InputObject $v_Subject```

CodePudding user response:

You should first need to create a PropertySet object because the attachment information is not loaded automatically.

## Target Path Folder
$TargetPath = "c:\temp\attachments"

## Create a PropertySet with the Attachments metadata
$ItemPropetySet = [Microsoft.Exchange.WebServices.Data.PropertySet]::new(
[Microsoft.Exchange.Webservices.Data.BasePropertySet]::IdOnly,
[Microsoft.Exchange.WebServices.Data.ItemSchema]::Attachments,
[Microsoft.Exchange.WebServices.Data.ItemSchema]::HasAttachments
)

Then:

## Iterate the items and find messages with attachments
foreach ($item in $fiItems.Items)
{
    ## Load the Message attachment metadata using the PropertySet Created
    $message = [Microsoft.Exchange.WebServices.Data.EmailMessage]::Bind(
    $service, $item.Id, $ItemPropetySet)

    if ($message.HasAttachments)
    {
        foreach ($attachment in $message.Attachments)
        {
            if ($attachment -is [Microsoft.Exchange.WebServices.Data.FileAttachment])
            {
            $FilePath = Join-Path $TargetPath $attachment.Name
            $attachment.Load($FilePath)
            }
        }
    }
}
  • Related