Send email Exchange Web Services PowerShell
Hello,
Since PowerShell version 1 there is a way to send mail with it. In v1, this was not strait forward, you needed to create a SMTP object from .net, and then use it to send an email based on an MailMessage object. In v2, you get the Send-MailMessage cmdlet. Those two methods use an SMTP server, there is a third one, with Exchange Web Services. There isn’t a real benefit for using those beside learn how to use EWS for doing greater things. Indeed, you can do a lot more with EWS than just send mail.
Send email with PowerShell 1
This was not as easy as in v2:
$MailMessage = New-Object System.Net.Mail.MailMessage('Sender@ItForDummies.net', 'Anakin.Skywalker@itfordummies.net') $MailMessage.BodyEncoding = [System.Text.Encoding]::UTF8 $MailMessage.IsBodyHtml = $true $MailMessage.Subject = 'Subject' $Body = '<h1>This is a mail sent through Send-MailMessage</h1>' $HtmlBody = [Net.Mail.AlternateView]::CreateAlternateViewFromString($Body, 'text/html') $MailMessage.AlternateViews.Add($HtmlBody) $SMTPClient = New-Object System.Net.Mail.SmtpClient( 'Smtp.itfordummies.net' , 25 ) $SMTPClient.Send($MailMessage)
Send email with PowerShell 2
This is quite easy with this cmdlet:
Send-MailMessage -SmtpServer Smtp.itfordummies.net -To Anakin.Skywalker@itfordummies.net -From 'Sender <Sender@ItForDummies.net>' -Subject 'Subject' -Body '<h1>This is a mail sent through Send-MailMessage</h1>' -BodyAsHtml
Send email Exchange Web Services PowerShell
Now, let’s see with Exchange Web Services, this is more complicated than is v2, but we’re here to learn !
First, you need to install a piece of software on your host, the Exchange Web Services needs a dll to be loaded.
You can find it here:
https://www.microsoft.com/en-us/download/details.aspx?id=42951
Then, import it:
Import-Module -Name 'C:Program FilesMicrosoftExchangeWeb Services2.2Microsoft.Exchange.WebServices.dll'
Note: You may need to change the path to fits your needs.
Once imported, you have access to a very lot new objects related to Exchange. The one we need is:
$exchService = New-Object -TypeName Microsoft.Exchange.WebServices.Data.ExchangeService
And then, connect it to your Web Services:
$Credential = Get-Credential $exchService.Credentials = New-Object -TypeName Microsoft.Exchange.WebServices.Data.WebCredentials -ArgumentList $Credential.UserName, $Credential.GetNetworkCredential().Password $exchService.AutodiscoverUrl($Credential.UserName, {$true})
Note: You need to specify an account with a mailbox.
Note: You can force the URL if you already know it (Office 365 for example):
$exchService.Url = 'https://outlook.office365.com/EWS/Exchange.asmx'
Once connected, you can start creating an email message:
$eMail = New-Object -TypeName Microsoft.Exchange.WebServices.Data.EmailMessage -ArgumentList $exchService $eMail.Subject = 'Test is a test' $eMail.Body = '<h1>This message is being sent through EWS with PowerShell</h1>' $eMail.ToRecipients.Add('Anakin.Skywalker@itfordummies.net') | Out-Null
And finally send it:
$eMail.SendAndSaveCopy()
The full script:
Import-Module -Name 'C:Program FilesMicrosoftExchangeWeb Services2.2Microsoft.Exchange.WebServices.dll' $Credential = Get-Credential $exchService = New-Object -TypeName Microsoft.Exchange.WebServices.Data.ExchangeService $exchService.Credentials = New-Object -TypeName Microsoft.Exchange.WebServices.Data.WebCredentials -ArgumentList $Credential.UserName, $Credential.GetNetworkCredential().Password $exchService.AutodiscoverUrl($Credential.UserName, {$true}) #eMail $eMail = New-Object -TypeName Microsoft.Exchange.WebServices.Data.EmailMessage -ArgumentList $exchService $eMail.Subject = 'Test is a test' $eMail.Body = '<h1>This message is being sent through EWS with PowerShell</h1>' $eMail.ToRecipients.Add('Anakin.Skywalker@itfordummies.net') | Out-Null $eMail.SendAndSaveCopy()
As you can see, I used the SendAndSaveCopy method, this will save a copy of the send mail in the “Sent Item” of the mailbox you use to connect to the Exchange Web Services. You can choose a different folder with an overload:
$eMail.SendAndSaveCopy('Inbox')
Note: You can get the list of well known folders name with:
[System.Enum]::GetValues('Microsoft.Exchange.WebServices.Data.WellKnownFolderName')
Or, you can don’t save a copy at all:
$eMail.Send()
I like the fact that you can save a copy of mail being sent with this method, this can help for tracking and logging.
Pingback: Meeting Request Exchange Web Services PowerShell - It for DummiesIt for Dummies
When I call $exchService, I see;
RequestedServerVersion : Exchange2013_SP1
So I guess the above solution is for 2013(v15.x) only?
No, it works for other version too for want we want to achieve here. Some more complicated operation may bot work though
Hi,
I’m studying the powershell for a few days.
I’m very happy for sending a Email to my box by learning from this article.It’s so helpfully.
Thank you for sharing your good experience!
And then I added a short script,this $Credential based “PSCredential”. The good news is it’s working.
$Sspass = ConvertTo-SecureString $ -AsPlainText -Force
$Credential = New-Object System.Management.Automation.PSCredential ( $, $Sspass)
^ ^
Sorry for that I sent a Test Mail to from the EXAMPLE script .
Pingback: Enviar E-mail no powershell usando o EWS API - NVLan.com.br