Articles

Adam der Automator

Posted on

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

Nachricht mit hoher Priorität in Outlook
Nachricht mit hoher Priorität in Outlook

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.