Recently we needed to create an Exchange Web Services Script to Auto Reply from a Mailbox due to Auto Replies being disabled for Spam Reasons on the Hubtransports, below will do this and will move the item to a subfolder of Inbox when done
This can be run as a scheduled task as a powershell script
# Connect to Exchange server and load Exchange powershell modules
. 'C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1'
Connect-ExchangeServer -auto
$mailbox = Get-Mailbox MailboxName
$mailAddress = $mailbox.PrimarySmtpAddress.ToString();
[Reflection.Assembly]::LoadFile("C:\Program Files (x86)\Microsoft\Exchange\Web Services\2.1\Microsoft.Exchange.WebServices.dll") | Out-Null
$s = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2007_SP1)
$s.AutodiscoverUrl($mailAddress);
$MailboxRootid = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::MsgFolderRoot,$mailAddress)
$MailboxRoot = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($s,$MailboxRootid)
# Get Folder ID from Path
Function GetFolder()
{
# Return a reference to a folder specified by path
$RootFolder, $FolderPath = $args[0];
$Folder = $RootFolder;
if ($FolderPath -ne '\')
{
$PathElements = $FolderPath -split '\\';
For ($i=0; $i -lt $PathElements.Count; $i++)
{
if ($PathElements[$i])
{
$View = New-Object Microsoft.Exchange.WebServices.Data.FolderView(2,0);
$View.Traversal = [Microsoft.Exchange.WebServices.Data.FolderTraversal]::Deep;
$View.PropertySet = [Microsoft.Exchange.WebServices.Data.BasePropertySet]::IdOnly;
$SearchFilter = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.FolderSchema]::DisplayName, $PathElements[$i]);
$FolderResults = $Folder.FindFolders($SearchFilter, $View);
if ($FolderResults.TotalCount -ne 1)
{
# We have either none or more than one folder returned... Either way, we can't continue
$Folder = $null;
Write-Host "Failed to find " $PathElements[$i];
Write-Host "Requested folder path: " $FolderPath;
break;
}
$Folder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($s, $FolderResults.Folders[0].Id)
}
}
}
$Folder;
}
$folderid = new-object Microsoft.Exchange.WebServices.Data.Folderid([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Inbox,$mailAddress)
$InboxFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($s,$folderid)
$mails = $inboxFolder.FindItems(20)
$mails | % {$_.Load()}
foreach($Item in $mails.Items)
{
#Get the email body
$body = Get-Content “C:\scripts\CareersEmailTemplate.htm”
$body = $body -replace “Placeholder”, $Placeholder
#Have to convert the object to a string to use in the mail body.
[string]$msgBody = $body
#Create the email message and set the Subject and Body
$message = New-Object Microsoft.Exchange.WebServices.Data.EmailMessage -ArgumentList $s
#Put Images inline
$message.Attachments.AddFileAttachment("C:\images\logo.png") | Out-Null
$message.Attachments[0].ContentId = "logo.png";
$message.From = “email@domain.com”
$message.Subject = “MessageSubject”
$message.Body = $msgBody
#Sets reciepients as sender
$message.ToRecipients.Add($item.Sender.Address)
#Send the message and save a copy in the users Sent Items folder (Alt is message.Send which will not save a copy.)
$message.SendAndSaveCopy()
#Move to Folder After Replying
$FolderObject = GetFolder($MailboxRoot, "\Inbox\Replied\");
try
{
$Item.Move($FolderObject.Id) | out-null;
}
catch
{
Write-Host "Failed to move item", $Item.Id.UniqueId
}
}