In diesem PowerShell-Cmdlet des Tages behandeln wir das PowerShell-Cmdlet Send-MailMessage. Dieses PowerShell-Cmdlet dient einem Zweck und nur einem Zweck: dem Versenden von E-Mails auf viele verschiedene Arten.
Da es so viele Möglichkeiten gibt, wie das Cmdlet Send-MailMessage E-Mail-Nachrichten versenden kann, tauchen wir gleich ein und fangen an, alle gängigen Beispiele abzudecken, die Ihnen begegnen könnten. In diesem Artikel werden wir viele Beispiele behandeln, die von den einfachsten bis hin zu Szenarien reichen, die ich niemandem wünsche!
Dieser Beitrag ist eine großartige Ressource, die Sie als Lesezeichen speichern können, falls Sie jemals auf Fälle stoßen, in denen Sie E-Mails mit PowerShell senden müssen und die Syntax vergessen haben.
Inhaltsverzeichnis
Der SMTP-Server
Alle E-Mails müssen über einen SMTP-Server irgendwo über einen Server und einen Port gehen. Um den zu verwendenden SMTP-Server anzugeben, verwenden Sie einen Parameter namens SMTPServer
, mit dem Sie den SMTP-Server angeben können, über den eine Verbindung hergestellt und E-Mails weitergeleitet werden sollen. Er ist jedoch nicht erforderlich.
Wenn Sie keinen Wert für den Parameter SMTPServer
angeben, wird der in der Einstellungsvariable $PSEmailServer
gespeicherte Wert verwendet. Sie können dieser Variablen wie jeder anderen Variablen einen Wert zuweisen.
PS51> $PSEmailServer = 'smtp.server.local'
Diese Variable ist jedoch nicht PowerShell-Sitzungsübergreifend. Das bedeutet, dass Sie sie jedes Mal definieren müssen, wenn eine neue PowerShell-Sitzung geöffnet wird. Aus diesem Grund empfehle ich, sie entweder zu verwenden, indem Sie sie oberhalb Ihrer Send-MailMessage
-Referenz definieren, oder sie gar nicht zu definieren. Stattdessen würde ich persönlich den SMTPServer
Parameterwert bereitstellen. Auf diese Weise müssen Sie keine externe Variable verwalten, die sich bei Ihnen ändern könnte.
PS51> Send-MailMessage -SmtpServer 'smtp.server.local'
Port
Standardmäßig ist der Wert, mit dem das Cmdlet versucht, eine E-Mail über den SMTP-Server zu senden, Port 25. Dies ist einfaches, unverschlüsseltes SMTP. Heutzutage ist es jedoch üblicher, verschlüsselte E-Mails mit SSL/TLS zu senden (wir werden diese Szenarien später behandeln).
Wenn Sie den Port von 25 ändern müssen, können Sie den Parameter Port
verwenden.
PS51> Send-MailMessage -SmtpServer 'smtp.server.local' -Port 587
Empfänger und Absender
Um eine E-Mail über Methoden wie das To-, Cc- und Bcc-Feld an verschiedene Empfänger zu senden, verfügt das Cmdlet über verschiedene Parameter, um dies zu ermöglichen.
Die To-, Cc- und Bcc-Parameter im Cmdlet „Send-Mailmessage“
Das Cmdlet hat drei Parameter, die jeweils mehrere durch ein Komma getrennte Empfänger unterstützen: To
Cc
und Bcc
.
Sie können einzelne Adressen wie folgt angeben.
PS51> Send-MailMessage -To -Cc -Bcc -Subject 'this is a subject'
Oder Sie können mehrere Empfänger für jeden Parameterwert angeben.
PS51> Send-MailMessage -To , -Cc , -Bcc , -Subject 'this is a subject'
Der From-Parameter
Beim Versenden von E-Mails können Sie auch den From
-Parameter angeben, der den Reply-to-Header in der E-Mail setzt. Dieser Parameter erlaubt nur eine Adresse. Sollte ein Empfänger auf die E-Mail antworten wollen, wird dies die E-Mail-Adresse sein, an die die Antwort zurückkommt.
PS51> Send-MailMessage -From -To -Subject 'this is a subject'
Standardmäßig wird bei Verwendung einer E-Mail-Adresse einfach die E-Mail-Adresse im FROM-Feld des Empfängers angezeigt. Wenn Sie jedoch einen Namen oder eine Art Bezeichnung wie Service Account Mailbox angeben möchten, können Sie auch einen Namen und eine E-Mail wie folgt angeben:
Adam Bertram <>
Beachten Sie, dass der Parameter
Subject
verwendet wurde. Dieser Parameter ist immer erforderlich. Sie werden sehen, dass dieser Parameter in allen Beispielen verwendet wird.
Body
Mit dem Parameter Body
können Sie angeben, was im Body der E-Mail stehen soll. Im einfachsten Fall können Sie einen beliebigen Text angeben, den das Cmdlet dann als Klartext sendet.
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body'
Senden von E-Mails mit HTML-Text
Sie können einen E-Mail-Text auch als HTML-Text und nicht als Klartext senden. Verwenden Sie dazu den gleichen Body
-Parameter wie bei Plaintext, aber verwenden Sie HTML für die Zeichenkette und nutzen Sie den BodyAsHtml
-Schalterparameter.
$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
Beachten Sie im obigen Beispiel, dass ich den Body-String in
@'
und'@
eingeschlossen habe. Dies nennt man hier einen String. Damit können Sie lange Strings definieren, die typischerweise in E-Mail-Bodies vorkommen und Zeilenumbrüche enthalten. Here-Strings bewahren die Formatierung von Strings und sind eine gute Möglichkeit, den E-Mail-Body zu definieren, besonders wenn er in HTML ist.
Kodierung
Wenn Sie Sonderzeichen im Betreff oder Body Ihrer E-Mail haben, können Sie den Parameter Encoding
verwenden. Mit diesem Parameter können Sie den E-Mail-Betreff und -Text vor dem Versenden über den angegebenen Kodierungstyp kodieren.
Sie haben hier einige Möglichkeiten:
- ASCII (Standard)
- UTF8
- UTF7
- UTF32
- Unicode
- BigEndianUnicode
- Standard
- OEM
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Encoding UTF8
Anhänge
Das Cmdlet kann auch eine oder mehrere Dateien anhängen. Dazu können Sie den Parameter Attachments
verwenden und den Pfad der anzuhängenden Datei(en) angeben.
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc'
Sie können auch mehrere Anhänge über eine Sammlung angeben, indem Sie diese mit einem Komma trennen.
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc','D:\report.xlsx'
Mit dem Parameter Attachments
können Sie auch Dateien über Cmdlets wie Get-Item
und Get-ChildItem
auch an das Cmdlet Send-MailMessage
.
PS51> Get-ChildItem -Path 'C:\MyFiles' | Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body'
Sichere und authentifizierte E-Mails
Standardmäßig sendet das Cmdlet E-Mails über unverschlüsselte SMTP-Kommunikation über Port 25. Es bietet jedoch auch Unterstützung für den Versand von verschlüsselten E-Mails über SSL/TLS mit einem Benutzernamen und Passwort.
Wenn Sie versuchen, E-Mails über einen SMTP-Server weiterzuleiten, der eine Authentifizierung erfordert, schlägt der Befehl mit einer Fehlermeldung wie unten fehl.
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.
Um Abhilfe zu schaffen, müssen Sie zunächst den Port (typischerweise 587 für TLS) und den UseSsl
-Parameter angeben. Dadurch wird das Cmdlet angewiesen, zu versuchen, eine Verbindung zu Port 587 auf dem SMTP-Server herzustellen und die gesamte Nachricht zu verschlüsseln. Normalerweise (immer?) müssen Sie auch den Benutzernamen/das Kennwort zur Authentifizierung am SMTP-Server mit dem Parameter Credential
angeben.
PS51> $credential = Get-CredentialPS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -UseSsl -Port 587 -Credential $credential
Oben greife ich mit dem Cmdlet
Get-Credential
auf ein Credential-Objekt (PSCredential) zu. Dies stellt manchmal ein Problem dar, da es interaktiv ist, d. h. es hält das Skript an, um nach einem Benutzernamen und einem Passwort zu fragen. Um dies zu verhindern, könnten Sie ein PSCredential-Objekt „on the fly“ erstellen.
Ein gängiges E-Mail-Beispiel ist die Verwendung von Gmail. Mit dem Wissen, das Sie oben gewonnen haben, können Sie nun ganz einfach E-Mails über Gmail senden, indem Sie den SMTP-Server smtp.gmail.com verwenden, wie unten gezeigt.
$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-Mail-Priorität zuweisen
Eine Funktion von E-Mail, von der ich persönlich wünschte, sie würde sterben, ist, dass Sie den E-Mails, die Sie senden, über den Parameter Priority
Prioritätsstufen zuweisen können. Diese Priorität wird dann vom E-Mail-Client unterschiedlich interpretiert.
Mit mailmessage können Sie einer E-Mail drei verschiedene Prioritäten zuweisen.
- Normal (Standard)
- Hoch
- Niedrig
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Priority High
Aber bitte, um Himmels willen, denken Sie nicht, dass alle Ihre E-Mails hohe Priorität haben!
Zustellbenachrichtigungen
Schließlich können Sie Zustellbenachrichtigungen für E-Mails festlegen. Zustellbenachrichtigungen sind das, was in manchen E-Mail-Clients als Lesebestätigung bekannt ist. Mit Zustellbenachrichtigungen können Sie sich benachrichtigen lassen, wenn die E-Mail beim Empfänger eingegangen ist. Allerdings muss der Empfänger dies noch zulassen.
Sie haben vier Optionen, wenn Sie Zustellbenachrichtigungen anfordern.
- Keine (Standard)
- BeiErfolg (wenn die E-Mail erfolgreich zugestellt wurde)
- BeiFehlschlag (benachrichtigen, wenn die Zustellung nicht erfolgreich war)
- Verzögert (wenn die E-Mail über einen SMTP-Server verzögert wird)
Mit dem Parameter DeliveryNotificationOptions
können Sie eine Zustellbenachrichtigungsoption angeben.
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess'
Sie können auch mehrere Zustellungsbenachrichtigungen auf einmal anfordern, indem Sie sie mit einem Komma trennen.
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess','OnFailure','Delay'
Zusammenfassung
In diesem Beitrag haben Sie alles über das Cmdlet „Send-mailmessage“ erfahren und was es kann. Wir haben dieses Cmdlet ausführlich mit allen Parametern, die es hat, und mit Beispielen behandelt. Ich hoffe, dass dieser Beitrag als Referenz für Sie dienen kann, wenn Sie das Cmdlet „Send-mailmessage“ verwenden.
Weitere Lektüre
Sehen Sie sich auch andere verwandte Beiträge an!
- Verwenden des
Get-ChildItem
PowerShell-Cmdlets - Verwenden des
Set-Content
PowerShell-Cmdlets - Verwenden des
Out-File
PowerShell-Cmdlets