Articles

Adam the Automator

Posted on

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 ToCc 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.

Hoge prioriteit bericht in Outlook
Hoge prioriteit bericht in Outlook

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

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *