Monday, July 22, 2013

Forwarding a Message as an Attachment using the EWS Managed API and Powershell

While you can easily create an Inbox rule to forward a Message as an Attachment, doing this programmatically in EWS isn't that straight forward. As there is no direct method in EWS to attach an existing Store item a work around is needed.

With this workaround we use the MimeContent of an existing email message which will allow you to create an ItemAttachment of this existing message (using the method from this post) in the Inbox and maintain all the Mime Properties and attachments on the message your forwarding. Note this method doesn't maintain full fidelity of a Message as it won't include any MAPI properties or Exchange rich datatypes which may or may not be important.

The following sample demonstrates how to forward the more recently received email in the Inbox as an Item Attachment using the MimeContent (and also setting the MessageFlags property to make sure the message appears sent). 
  1. $folderid= new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox,$MailboxName)     
  2. $Inbox = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service,$folderid)  
  3. #Define ItemView to retrive just 1 Item     
  4. $ivItemView =  New-Object Microsoft.Exchange.WebServices.Data.ItemView(1)      
  5. $fiItems = $service.FindItems($Inbox.Id,$ivItemView)   
  6. if($fiItems.Items.Count -eq 1){  
  7.     $mail = New-Object Microsoft.Exchange.WebServices.Data.EmailMessage($service)   
  8.     $OriginalEmail = $fiItems.Items[0]  
  9.     $psPropset= new-object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::IdOnly)    
  10.     $psPropset.Add([Microsoft.Exchange.WebServices.Data.ItemSchema]::MimeContent)  
  11.     $psPropset.Add([Microsoft.Exchange.WebServices.Data.ItemSchema]::Subject)  
  12.     $OriginalEmail.Load($psPropset)  
  13.     $AtColtype = ("Microsoft.Exchange.WebServices.Data.AttachmentCollection") -as "Type"  
  14.     $Emailtype = ("Microsoft.Exchange.WebServices.Data.EmailMessage") -as "Type"  
  15.     $methodInf = $AtColtype.GetMethod("AddItemAttachment");  
  16.     $AddItmAttachMethod = $methodInf.MakeGenericMethod($Emailtype);  
  17.     $EmailAttachment = $AddItmAttachMethod.Invoke($mail.Attachments,$null);  
  18.     $EmailAttachment.Item.MimeContent = $OriginalEmail.MimeContent  
  19.     $PR_Flags = new-object Microsoft.Exchange.WebServices.Data.ExtendedPropertyDefinition(3591, [Microsoft.Exchange.WebServices.Data.MapiPropertyType]::Integer);    
  20.     $EmailAttachment.Item.SetExtendedProperty($PR_Flags,"1")    
  21.     $EmailAttachment.Name = $OriginalEmail.Subject  
  22.     $mail.Subject = "See the Attached Email"  
  23.     $mail.ToRecipients.Add("")   
  24.     $mail.SendAndSaveCopy()     
  25. }