Wie man eine E-Mail mit Windows PowerShell sendet

Windows PowerShell ist vor allem als eine Befehlszeilen-Shell bekannt, die zur Lösung einiger Verwaltungsaufgaben in Windows und Anwendungen, die auf diesem Betriebssystem laufen, verwendet wird. Gleichzeitig ist es eine Skriptsprache, mit der Sie Cmdlets – leichtgewichtige Befehle zur Ausführung bestimmter Funktionen – anpassen können. Und heute sprechen wir über Send-MailMessage, ein Cmdlet zum Versenden von E-Mails aus der PowerShell, sowie über andere Möglichkeiten, dies zu tun.

Das einfachste Skript zum Senden einer E-Mail mit der PowerShell

Fangen wir mit einfachen Dingen an. Hier ist ein einzeiliges Skript, das auf dem Send-MailMessage-Cmdlet basiert, das Sie sofort verwenden können, um eine E-Mail aus der PowerShell mit dem SMTP-Protokoll zu senden.

Send-MailMessage -To "<recipient’s email address>” -From "<sender’s email address>” -Subject "Your message subject” -Body "Some important plain text!” -Credential (Get-Credential) -SmtpServer "<smtp server>” -Port 587

Alles, was Sie brauchen, ist das Einfügen der E-Mail-Adresse eines Absenders und eines Empfängers sowie die Angabe des SMTP-Servers, den Sie verwenden werden. Kopieren Sie dann dieses Skript in Ihre PowerShell und drücken Sie die Eingabetaste.

<

Mailtrap hilft uns zu prüfen, ob es funktioniert. Melden Sie sich an und gehen Sie zu Ihrem Demo-Posteingang. Suchen Sie die SMTP-Zugangsdaten und passen Sie das Skript wie folgt an:

Send-MailMessage -To "[email protected]” -From "[email protected]” -Subject "Hey, Jon” -Body "Some important plain text!” -Credential (Get-Credential) -SmtpServer "smtp.mailtrap.io” -Port 587

Hier haben wir nur den SMTP-Host angegeben. Die Adressen des Empfängers und des Absenders sind nicht real, wie Sie vielleicht schon vermutet haben. Und das ist einer der Vorteile der Verwendung eines gefälschten SMTP-Servers. Sie müssen sich nicht mit echten E-Mails auseinandersetzen, um den E-Mail-Workflow zu testen. Alternativ können Sie auch eine Dummy-E-Mail verwenden, aber das kann eine schlechte Testpraxis sein. Erfahren Sie in unserem Blogbeitrag Warum die Verwendung von Dummy-E-Mails zum Testen einfach nicht funktioniert.

Testen Sie Mailtrap kostenlos

Wenn Sie dieses Skript in die PowerShell kopieren und einfügen und die Eingabetaste drücken, öffnet sich ein Fenster, in dem SMTP-Anmeldeinformationen (Benutzername und Kennwort) abgefragt werden. Füllen Sie diese mit denen von Mailtrap aus, und das war’s. Prüfen Sie Ihren Demo-Posteingang und finden Sie Ihre Nachricht.

Kann ich eine HTML-E-Mail oder eine E-Mail mit Anhängen aus der PowerShell an mehrere Empfänger senden?

Ja, Sie können! Send-MailMessage lässt Sie Ihre E-Mail mit vielen Parametern aufpumpen, einschließlich HTML-Inhalt, Priorität und so weiter. Außerdem können Sie E-Mails an mehrere Empfänger senden, indem Sie diese im entsprechenden Parameter angeben. Hier sehen Sie, wovon Sie Gebrauch machen können:

Parameter Beschreibung
-To E-Mail-Adresse eines Empfängers oder von Empfängern
-Bcc E-Mail-Adresse eines BCC Empfängers bzw. der Empfänger
-Cc E-Mail-Adresse eines CC-Empfängers bzw. der CC-Empfänger
-From E-Mail-Adresse des Absenders
-Subject Betreff der E-Mail
-Body E-Mail-Bodentext
-BodyAsHtml Definiert, dass der E-Mail-Bodentext HTML enthält
-Attachments Anzuhängende Dateinamen und der Pfad zu ihnen
-Credential Authentifizierung zum Senden der E-Mail vom Konto
-SmtpServer Name des SMTP-Servers
-Port Port des SMTP-Servers
-DeliveryNotificationOption Der/die Absender, der/die im Parameter Form angegeben wurde(n), wird/werden über die Zustellung der E-Mail informiert. Hier sind die Optionen:

  • None – Benachrichtigungen sind aus (Standardparameter)
  • OnSuccess – Benachrichtigung über eine erfolgreiche Lieferung
  • OnFailure – Benachrichtigung über eine erfolglose Lieferung
  • Delay – Benachrichtigung über eine einer verzögerten Lieferung
  • Never – nie Benachrichtigungen erhalten
  • -Encoding Die Kodierung für den Body und den Betreff
    -Priority Definiert die Prioritätsstufe der Nachricht. Gültige Optionen sind:

  • Normal (Standardparameter)
  • Low
  • High
  • -UseSsl Die Verbindung zum SMTP-Server wird über das Secure Sockets Layer (SSL)-Protokoll hergestellt

    So, lassen Sie uns ein Skript erstellen, das eine E-Mail mit HTML-Text und einem Anhang versendet. Dieses Mal definieren wir die Parameter im Voraus und verweisen dann im Send-MailMessage-Cmdlet auf sie:

    $From = "[email protected]"$To = "[email protected]", "[email protected]”$Cc = "[email protected]"$Attachment = "C:\Temp\Drogon.jpg"$Subject = "Photos of Drogon"$Body = "<h2>Guys, look at these pics of Drogon!</h2><br><br>"$Body += "He is so cute!” $SMTPServer = "smtp.mailtrap.io"$SMTPPort = "587"Send-MailMessage -From $From -to $To -Cc $Cc -Subject $Subject -Body $Body -BodyAsHtml -SmtpServer $SMTPServer -Port $SMTPPort -UseSsl -Credential (Get-Credential) -Attachments $Attachment

    Wie Sie bemerkt haben, haben wir $Body += verwendet, um eine neue Zeile zum Textkörper der Nachricht hinzuzufügen. Und so sieht die E-Mail im Posteingang von Mailtrap aus.

    Starten Sie mit dem kostenlosen Testen Ihrer PowerShell-E-Mails.

    Senden Sie eine E-Mail von PowerShell mit dem Gmail-SMTP-Server

    Alles ist cool, wenn Sie einen gefälschten SMTP-Server zum Testen verwenden. Aber was ist, wenn wir eine Nachricht über einen echten wie Gmail senden. In diesem Fall fügen Sie smtp.gmail.com als SMTP-Host ein und verwenden echte E-Mail-Adressen für einen Absender (Ihre Gmail-Adresse) und einen Empfänger.

    Wir haben einen Versuch unternommen und die Anmeldedaten im Pop-up-Fenster ausgefüllt. Aber der Server antwortete mit einem Fehler – 551 Authentication Required. Um dieses Problem zu beheben, müssen Sie in Ihrem Google-Konto auf der Registerkarte „Sicherheit“ die Option „Weniger sicherer App-Zugriff“ aktivieren. Wir haben es getan, und PowerShell hat unsere Nachricht erfolgreich an das Ziel übermittelt. Erfahren Sie mehr über SMTP-Antwortcodes und Befehle in unserem entsprechenden Blogbeitrag.

    SMTP-Einstellungen für gängige E-Mail-Anbieter

    Nicht jeder ist ein Gmail-Nutzer. Daher sind die folgenden Angaben vielleicht für Sie von Bedeutung, wenn Sie einen anderen SMTP-Host verwenden.

    Service SMTP-Server Port Verbindung
    Gmail smtp.gmail.com 587
    25
    465
    TLS
    TLS
    SSL
    Office 365 smtp.office365.com 587
    25
    TLS
    Outlook.com smtp-mail.outlook.com 587
    25
    TLS
    Yahoo mail smtp.mail.yahoo.com 587
    25
    465
    TLS
    TLS
    SSL
    Windows Live Hotmail smtp.live.com 587
    25
    TLS
    Zoho smtp.zoho.com 587
    465
    TLS
    SSL

    E-Mails aus PowerShell mit EASendMail versenden

    EASendMail ist eine SMTP-Komponente, die Protokolle wie SMTP unterstützt, ESMTP (erweitertes SMTP), EWS (Exchange Web Service) und WebDAV (Web Distributed Authoring and Versioning) Protokolle. Die Komponente wird hauptsächlich zum Senden von E-Mails in Anwendungen der COM/.NET/.NET Core-Umgebung und in Anwendungen verwendet, die mit folgenden Programmen erstellt wurden:

    • ASP
    • VB
    • VBA
    • VC++
    • C++/CLI
    • C#
    • VB.NET
    • JavaScript
    • ASP.NET
    • Delphi

    Außerdem können Sie EASendMail verwenden, um E-Mails aus der PowerShell zu versenden. Gott allein weiß, warum Sie das brauchen, aber hier ist eine Anleitung dafür:

    • Schritt 1: Installieren Sie EASendMail mit dem Installer
    • Schritt 2: Erstellen Sie das folgende Skript
    ::LoadFile("C:\Program Files (x86)\EASendMail\Lib\net20\EASendMail.dll")#change the path to the EASendMail.dll file if you have another build of run-time assembly for .NET Framework, .NET Core, or .NET Compact Frameworkfunction SendMailTo($sender, $name, $address, $subject, $body, $htmlFormat) { $mail = New-Object EASendMail.SmtpMail("TryIt") # you can replace "TryIt” with your license code for EASendMail SMTP component $mail.From.Address = $sender $recipient = New-Object EASendMail.MailAddress($name, $address) $mail.To.Add($recipient) > $null $mail.Subject = $subject if($htmlFormat) { $mail.HtmlBody = $body } else { $mail.TextBody = $body } $server = New-Object EASendMail.SmtpServer("smtp.mailtrap.io") $server.User = "*********" $server.Password = "*********" $server.Port = 587 $server.ConnectType = ::ConnectTryTLS# specify your settings of the SMTP server, username, password, port, and connection type $smtp = New-Object EASendMail.SmtpClient $smtp.SendMail($server, $mail)}function SendMailFromPowerShell () { $sender = "[email protected]" $name = "Jon Snow" $address = "[email protected]" $subject = "Happy Samhain" $body = "Jonny, congrats on Samhain!"# specify your settings of sender’s email address and name, recipient’s email address, as well as subject and body text of the message try { "Start to send email to {0} ..." -f $address SendMailTo $sender $name $address $subject $body "" "Email to {0} has been submitted to server!" -f $address } catch { "Failed to send email: {0}" -f $_.Exception.Message }}SendMailFromPowerShell

    • Schritt 3: Führen Sie das Skript aus und überprüfen Sie den Posteingang der Mailtrap Demo. Hier ist die Nachricht.

    Start Testing

    Massenversand aus PowerShell mit EASendMail Service Queue

    Die EASendMail SMTP-Komponente ist nützlich für den Versand von Massen-E-Mails. Hierfür müssen Sie nicht mehrere Threads programmieren. Alles, was Sie brauchen, ist EASendMail Service, der Nachrichten mit mehreren Threadings automatisch in einer Warteschlange im Hintergrund senden kann. Werfen Sie einen Blick auf das folgende Skript für den Massenversand einer Nachricht mit einer HTML-Vorlage:

    ::LoadFile("C:\Program Files (x86)\EASendMail\Lib\net20\EASendMail.dll")#change the path to the EASendMail.dll file if you have another build of run-time assembly for .NET Framework, .NET Core, or .NET Compact Frameworkfunction SendMailToQueue($sender, $name, $address, $subject, $body, $htmlFormat) { $mail = New-Object EASendMail.SmtpMail("TryIt") $mail.From.Address = $sender $recipient = New-Object EASendMail.MailAddress($name, $address) $mail.To.Add($recipient) > $null $mail.Subject = $subject if($htmlFormat) { $mail.HtmlBody = $body } else { $mail.TextBody = $body } $server = New-Object EASendMail.SmtpServer("smtp.mailtrap.io") $server.User = "*********" $server.Password = "*********" $server.Port = 587 $server.ConnectType = ::ConnectTryTLS# specify your settings of the SMTP server, username, password, port, and connection type $smtp = New-Object EASendMail.SmtpClient $smtp.SendMailToQueue($server, $mail)}function OpenConnection () { $connectionString = "Server=localhost\AdminSystem;Database=test;Integrated security=SSPI;MultipleActiveResultSets=True;" Write-Host(("Connecting database {0} ..." -f $connectionString)) $sqlConnection = New-Object System.Data.SqlClient.SqlConnection $sqlConnection.ConnectionString = $connectionString# You can change the connection string to yours by specifying user and password: $connectionString = "Server=localhost\AdminSystem;Database=dbname;User Id=user;Password=yourpassword;MultipleActiveResultSets=True;" $sqlConnection.Open() Write-Host 'Connected' return $sqlConnection}function BuildHtmlBody ($sqlConnection) { Write-Host "Building HTML body based on database ..." $sqlQuery = "SELECT ID, Name, Email, Age, Department FROM users" $sqlCommand = New-Object System.Data.SqlClient.SqlCommand($sqlQuery, $sqlConnection); $reader = $sqlCommand.ExecuteReader() $html = "<!DOCTYPE html><html><body>" $html += "<div style=""font-family:'Segoe UI', Calibri, Arial, Helvetica; font-size: 14px; max-width: 768px;"">" $html += "Dear {name}, <br /><br />This is a congrats email on Samhain. <br />" $html += "Here is full data in table:<br /><br />" $html +="<table style='border-spacing: 0px; border-style: solid; border-color: #ccc; border-width: 0 0 1px 1px;'>" while ($reader.Read()) { $name = $reader.GetString(1) $address = $reader.GetString(2) $age = $reader.GetInt32(3) $department = $reader.GetString(4) $html += "<tr>" $html += "<td style='padding: 10px; border-style: solid; border-color: #ccc; border-width: 1px 1px 0 0;'>{0}</td>" -f $name $html += "<td style='padding: 10px; border-style: solid; border-color: #ccc; border-width: 1px 1px 0 0;'>{0}</td>" -f $address $html += "</tr>" } $reader.Close > $null $reader.Dispose > $null $sqlCommand.Close > $null $sqlCommand.Dispose > $null return $html}function SendMailFromDBToQueue () { $sender = "[email protected]" $subject = "Happy Samhain" $sqlConnection = OpenConnection $bodyTemplate = BuildHtmlBody($sqlConnection)$sqlQuery = "SELECT ID, Name, Email, Age, Department FROM users" $sqlCommand = New-Object System.Data.SqlClient.SqlCommand($sqlQuery, $sqlConnection); $reader = $sqlCommand.ExecuteReader() while ($reader.Read()) { $name = $reader.GetString(1).Trim() $address = $reader.GetString(2).Trim() $body = $bodyTemplate.Replace("{name}", $name) Write-Host(("Start to send email to {0} ..." -f $address)) SendMailToQueue $sender $name $address $subject $body "html" Write-Host(("Email to {0} has been submitted to easendmail service!" -f $address)) } $reader.Close > $null $reader.Dispose > $null $sqlCommand.Close > $null $sqlCommand.Dispose > $null $sqlConnection.Close > $null $sqlConnection.Dispose > $null } catch { "Failed to send email: {0}" -f $_.Exception.Message }}SendMailFromDBToQueue

    E-Mails aus PowerShell mit System.Net.Mail-API senden

    Das Cmdlet „Send-MailMessage“ ist die gängigste Option für den Versand von E-Mails aus PowerShell. Dies war jedoch nicht immer der Fall. Es ist erst ab PowerShell 3.0 verfügbar und basiert auf der System.Net.Mail-API. Dabei handelt es sich um einen Namespace, der Klassen zum Senden von elektronischen Nachrichten an den SMTP-Server enthält. Der Versand erfolgt über die Methode SmtpClient.Send oder .Send. Schauen wir uns das folgende Beispiel an:

    $EmailFrom = "[email protected]”$EmailTo = "[email protected]”$Subject = "Happy Samhain”$Body = "Jonny, congrats on Samhain!”$SMTPServer = "smtp.mailtrap.io”$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)$SMTPClient.EnableSsl = $true$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("<username>", "<password>");$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)

    Schauen Sie sich den Demo-Posteingang von Mailtrap an und voila – es ist drin. Alternativ können Sie auch die .Send-Methode und eine modifizierte Syntax wie diese verwenden:

    $smtpFrom = "[email protected]”$smtpTo = "[email protected]”$messageSubject = "Happy Samhain”$messageBody = "Jonny, congrats on Samhain!”$smtpServer = "smtp.mailtrap.io”$smtp = New-Object Net.Mail.SmtpClient($SmtpServer, 587)$smtp.EnableSsl = $true$smtp.Credentials = New-Object System.Net.NetworkCredential("94b784b5970edf", "01a5d515011f6e");$smtp.Send($smtpFrom , $smtpTo, $messageSubject, $messageBody)

    Lernen Sie in unserer Fallstudie mit The Software House, wie genau Mailtrap Ihnen helfen kann, E-Mail-Testprozesse zu rationalisieren.

    Zum Schluss

    Der System.Net.Mail-Namespace wird auch zum Erstellen und Versenden von Nachrichten in ASP.NET C# verwendet, über das wir ebenfalls gebloggt haben. Und das war’s für heute. Wir hoffen, dass dieser Blogbeitrag Ihre Kenntnisse im Umgang mit PowerShell erweitert hat. Folgen Sie unserem Blog und entdecken Sie nützliches Know-how für Ihre Projekte.

    Wenn Ihnen dieser Artikel gefallen hat, teilen Sie ihn bitte und verbreiten Sie ihn weiter. Wir würden uns sehr darüber freuen.

    Schreibe einen Kommentar

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