Voor dit PowerShell cmdlet van de dag behandelen we het PowerShell cmdlet Send-MailMessage. Dit PowerShell cmdlet dient maar één doel: het versturen van e-mail op een heleboel verschillende manieren.
Omdat er zoveel manieren zijn waarop het Send-MailMessage cmdlet e-mailberichten kan versturen, duiken we er meteen in en behandelen we alle veelvoorkomende voorbeelden die je tegen kunt komen. In dit artikel behandelen we een groot aantal voorbeelden, variërend van de eenvoudigste tot scenario’s die ik niemand toewens
Dit artikel is een goede bladwijzer voor het geval je ooit e-mail moet versturen met PowerShell en je de syntax bent vergeten.
Inhoudsopgave
De SMTP-server
Alle e-mail moet ergens via een SMTP-server gaan, via een server en een poort. Om de te gebruiken SMTP-server op te geven, gebruikt u een parameter genaamd SMTPServer
waarmee u de SMTP-server kunt opgeven om een verbinding tot stand te brengen en de mail door te sturen. Het is echter niet verplicht.
Als u geen waarde opgeeft voor de SMTPServer
parameter, zal de waarde die is opgeslagen in de $PSEmailServer
voorkeursvariabele worden gebruikt. U kunt een waarde aan deze variabele toekennen, net zoals u dat bij elke andere variabele zou doen.
PS51> $PSEmailServer = 'smtp.server.local'
Deze variabele leeft echter niet over PowerShell-sessies heen. Dit betekent dat u deze telkens moet definiëren wanneer een nieuwe PowerShell-sessie wordt geopend. Daarom raad ik aan om hem te gebruiken door hem boven je Send-MailMessage
referentie te definiëren of hem helemaal niet te definiëren. In plaats daarvan zou ik persoonlijk de SMTPServer
parameterwaarde meegeven. Op deze manier hoef je geen variabele van buitenaf te beheren die je misschien in de steek laat.
PS51> Send-MailMessage -SmtpServer 'smtp.server.local'
Poort
De standaard waarde waarmee het cmdlet zal proberen een e-mail via de SMTP server te versturen is poort 25. Dit is gewone, onversleutelde SMTP. Tegenwoordig is het echter gebruikelijker om versleutelde email te versturen met behulp van SSL/TLS (We zullen deze scenario’s later behandelen).
Als je de poort van 25 moet veranderen, kun je de Port
parameter gebruiken.
PS51> Send-MailMessage -SmtpServer 'smtp.server.local' -Port 587
Ontvangers en Originators
Om een e-mail naar verschillende ontvangers te sturen via methoden zoals de velden To, Cc en Bcc, heeft het cmdlet verschillende parameters om dit mogelijk te maken.
De To, Cc en Bcc parameters in het Send-Mailmessage Cmdlet
Het cmdlet heeft drie parameters die elk meerdere ontvangers ondersteunen, gescheiden door een komma, genaamd To
Cc
en Bcc
.
U kunt afzonderlijke adressen opgeven zoals hieronder.
PS51> Send-MailMessage -To -Cc -Bcc -Subject 'this is a subject'
Of u kunt voor elke parameterwaarde meerdere ontvangers opgeven.
PS51> Send-MailMessage -To , -Cc , -Bcc , -Subject 'this is a subject'
De From Parameter
Bij het verzenden van e-mail kunt u ook de From
parameter opgeven, die de reply-to header in de e-mail zal instellen. Deze parameter staat slechts één adres toe.
PS51> Send-MailMessage -From -To -Subject 'this is a subject'
In de standaardinstelling wordt bij gebruik van een e-mailadres het e-mailadres in het FROM-veld van de ontvanger getoond. Als u echter een naam wilt opgeven of een label zoals Service Account Mailbox, kunt u ook een naam en een e-mailadres opgeven zoals:
Adam Bertram <>
Merk op dat de
Subject
parameter is gebruikt. Deze parameter is altijd verplicht. U ziet deze parameter in alle voorbeelden gebruikt.
Body
Met de Body
parameter kunt u aangeven wat er in de e-mail body komt te staan. In het eenvoudigste geval kunt u elke tekst opgeven die u maar wilt en het cmdlet zal deze via platte tekst verzenden.
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body'
Het verzenden van HTML body e-mails
U kunt ook een e-mail body via HTML verzenden in plaats van platte tekst. Gebruik daarvoor dezelfde Body
parameter als bij platte tekst, maar gebruik HTML voor de string en de BodyAsHtml
switch parameter.
$body = @'<table style="width:100%"> <tr> <th>Firstname</th> <th>Lastname</th> <th>Age</th> </tr> <tr> <td>Jill</td> <td>Smith</td> <td>50</td> </tr> <tr> <td>Eve</td> <td>Jackson</td> <td>94</td> </tr></table>'@PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body $body -BodyAsHtml
Merk op dat ik in het bovenstaande voorbeeld de bodystring heb ingesloten in
@'
en'@
. Dit wordt een here string genoemd. Hiermee kunt u lange tekenreeksen definiëren die typisch zijn voor e-mail body’s die carriage returns bevatten. Here strings behouden de opmaak van strings en zijn een goede manier om de e-mailbody te definiëren, vooral als deze in HTML is.
Codering
Als u speciale tekens in het onderwerp of de body van uw e-mail hebt, kunt u de parameter Encoding
gebruiken. Met deze parameter kunt u het onderwerp en de body van de e-mail coderen met het opgegeven coderingstype voordat u de e-mail verzendt.
U hebt hier een paar opties:
- ASCII (standaard)
- UTF8
- UTF7
- UTF32
- Unicode
- BigEndianUnicode
- Default
- OEM
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Encoding UTF8
Bijlagen
Het cmdlet kan ook een of meer bestanden bijvoegen. U kunt hiervoor de parameter Attachments
gebruiken en het pad opgeven naar het bestand of de bestanden die u wilt bijvoegen.
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc'
U kunt ook meerdere bijlagen opgeven via een verzameling door ze van elkaar te scheiden met een komma.
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc','D:\report.xlsx'
De Attachments
parameter stelt u ook in staat om bestanden te pijpen via cmdlets zoals Get-Item
en Get-ChildItem
ook naar het Send-MailMessage
cmdlet te leiden.
PS51> Get-ChildItem -Path 'C:\MyFiles' | Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body'
Beveiligde en geauthenticeerde email
Het cmdlet verstuurt standaard email via onversleutelde SMTP communicatie over poort 25. Het heeft echter ook ondersteuning voor het verzenden van versleutelde e-mail via SSL/TLS met een gebruikersnaam en wachtwoord.
Als je probeert e-mail te verzenden via een SMTP server die authenticatie vereist, mislukt het commando met een foutmelding zoals hieronder.
The SMTP server requires a secure connection or the client was notauthenticated. The server response was: 5.7.0 Must issue a STARTTLS command first.
Om dit te verhelpen, moet je eerst de poort opgeven (meestal 587 voor TLS) en de UseSsl
parameter. Dit vertelt het cmdlet om te proberen verbinding te maken met poort 587 op de SMTP Server en het hele bericht te versleutelen. U zult typisch (altijd?) ook de gebruikersnaam/wachtwoord moeten opgeven om te authenticeren op de SMTP server door de Credential
parameter te gebruiken.
PS51> $credential = Get-CredentialPS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -UseSsl -Port 587 -Credential $credential
Hierboven pak ik een credential (PSCredential) object met behulp van het
Get-Credential
cmdlet. Dit geeft soms een probleem omdat het interactief is, wat betekent dat het script stopt om naar een gebruikersnaam en wachtwoord te vragen. Om dit te voorkomen, zou je een PSCredential-object on the fly kunnen maken.
Een veelgebruikt e-mailvoorbeeld is het gebruik van Gmail. Met de kennis die je hierboven hebt opgedaan, kun je nu eenvoudig e-mail via Gmail versturen met behulp van de SMTP-server smtp.gmail.com, zoals hieronder is te zien.
$gmailCred = Get-Credential$sendMailParams = @{ From = '' ## Must be gmail.com To = '' Subject = 'some subject' Body = 'some body' SMTPServer = 'smtp.gmail.com' SMTPPort = 587 UseSsl = $true Credential = $gmailCred}Send-MailMessage @sendMailParams
E-mailprioriteit toekennen
Hoewel ik persoonlijk zou willen dat e-mail niet meer bestond, kun je prioriteitsniveaus toekennen aan de e-mails die je verstuurt via de parameter Priority
. Deze prioriteit wordt vervolgens op verschillende manieren geïnterpreteerd door de e-mailclient.
Send-mailmessage maakt het mogelijk om een e-mail drie verschillende prioriteiten toe te kennen.
- Normaal (standaard)
- Hoog
- Laag
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Priority High
Maar denk alsjeblieft niet dat al je e-mails een hoge prioriteit hebben!
Aflevernotificaties
Ten slotte kun je aflevernotificaties voor e-mails specificeren. Aflevernotificaties zijn wat in sommige e-mailprogramma’s bekend staat als leesbevestigingen. Met afleveringsberichten krijgt u een melding als de e-mail door de ontvanger is ontvangen. De ontvanger moet dit echter wel toestaan.
U hebt vier mogelijkheden om afleveringsberichten aan te vragen.
- None (standaard)
- OnSuccess (wanneer de e-mail met succes is afgeleverd)
- OnFailure (meldt als de aflevering niet is gelukt)
- Delay (wanneer de e-mail is vertraagd via een SMTP-server)
U kunt een afleveringsnotificatie-optie opgeven door gebruik te maken van de DeliveryNotificationOptions
parameter.
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess'
U kunt ook meerdere aflevernotificaties tegelijk aanvragen door ze te scheiden met een komma.
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess','OnFailure','Delay'
Samenvatting
In dit bericht heeft u alles geleerd over het cmdlet Send-mailmessage en wat het allemaal kan. We hebben dit cmdlet uitgebreid behandeld aan de hand van elke parameter die het heeft, samen met voorbeelden. Ik hoop dat deze post als naslagwerk kan dienen wanneer je het Send-mailmessage cmdlet gebruikt.
Verder lezen
Bekijk ook eens een aantal andere gerelateerde posts!
- Gebruik van het
Get-ChildItem
PowerShell cmdlet - Gebruik van het
Set-Content
PowerShell cmdlet - Gebruik van het
Out-File
PowerShell cmdlet