E-Mails mit PowerShell versenden

Innerhalb von Skripten ist es oft notwendig Nachrichten zu versenden. Die einfachste Lösung dabei sind E-Mails. Während man bei Batch-Skripten noch die Hilfe von externen Kommandozeilen-Tools (beispielsweise Blat) benötigt, lassen sich aus PowerShell-Skripten direkt E-Mails versenden. In PowerShell 1.0 geschieht dies aber noch über einen kleinen Umweg. Dort müssen explizit .NET-Klassen verwendet werden. Ab PowerShell 2.0 ist das neue Cmdlet “Send-MailMessage” zum Versenden von E-Mails vorhanden. Es müssen lediglich ein paar Parameter übergeben werden.

Nachfolgend eine kurze Übersicht der möglichen Parameter:

Send-MailMessage [-Attachments <String[]>] [-Bcc <String[]>] [[-Body] <String>] [-BodyAsHtml]
 [-Encoding <Encoding>] [-Cc <String[]>] [-DeliveryNotificationOption <DeliveryNotificationOptions>]
 -From <String> [[-SmtpServer] <String>] [-Priority <MailPriority>] [-Subject] <String> [-To] <String[]>
 [-Credential <PSCredential>] [-UseSsl] [-Port <Int32>] [<CommonParameters>]

E-Mails versenden via “Send-MailMessage”

Beim Aufruf des Cmdlets müssen einige Parameter übergeben werden. Neben dem SMTP-Server muss ein Absender, ein Empfänger, ein Betreff und ein Text angegeben werden. Hier ein kurzes Beispiel:

Send-MailMessage -SmtpServer "mail.gmx.de" -to "EMPFÄNGER@mail.de" 
-from "ABSENDER <ABSENDER@mail.de>" -Subject "Betreff" 
-body "Test für Send-MailMessage"

Selbstverständlich bietet das Cmdlet aber noch weitere Möglichkeiten. So können unter anderem auch HTML-Mails und Anhänge versendet werden. Auch die Anmeldung am SMTP-Server und die Nutzung von SSL ist möglich. Die Angabe eines spezifischen Ports ist leider erst mit PowerShell 3.0 möglich.

$SMTPServer = "SMTP-SERVER"
$username = "USERNAME"
$password = ConvertTo-SecureString "PASSWORD" -AsPlainText -Force

$From = "ABSENDER@mail.com"
$To = "EMPFÄNGER@mail.com"
$Subject = "Betreff"
$Body = @"
Nachricht
Nachricht
"@
$Attachments = "C:\PFAD_ZUM_ANHANG\BILD.jpg"
#################################################################

$creds = New-Object System.Management.Automation.PSCredential 
($username, $password)
Send-MailMessage -To $To -From $From -Subject $Subject -Body $Body 
-SmtpServer $SMTPServer -Credential $creds 
-encoding ([System.Text.Encoding]::UTF8) 
-Attachments $Attachments -UseSsl

Ich biete das Skript auch zum Download an. Vor der Verwendung müssen alle Felder oberhalb der Trennlinie den eigenen Bedürfnissen angepasst werden. Ebenso ist eine Version für GMail vorhanden, die allerdings erst ab PowerShell 3.0 funktioniert.

Download PowerShell Skript

Tobi

Hallo, mein Name ist Tobias und ich habe diesen Blog im April 2009 ins Leben gerufen. Seitdem blogge ich hier über Software, Internet, Windows und andere Themen, die mich interessieren. SSDblog ist mein zweiter Blog, indem es rund um das Thema SSDs geht. Ich würde mich freuen, wenn ihr meinen Feed abonniert oder mir auf Twitter und Facebook folgt.

7 Antworten

  1. Didy sagt:

    bei mir kommt immer folgender fehler beim gmx server:

    Send-MailMessage : Für den SMTP-Server ist eine sichere Verbindung erforderlich, oder der Client wurde nicht
    authentifiziert. Die Serverantwort war: Authentication required
    In C:\Users\ich\Desktop\PowerShell_Mail.ps1:16 Zeichen:1
    + Send-MailMessage -To $To -From $From -Subject $Subject -Body $Body -S …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (System.Net.Mail.SmtpClient:SmtpClient) [Send-MailMessage], SmtpExcept
    ion
    + FullyQualifiedErrorId : SmtpException,Microsoft.PowerShell.Commands.SendMailMessage

    das script ist von hier gedownloaded und ich hab es folgendermaßen editiert:

    $SMTPServer = “mail.gmx.net”
    $username = “meinusername”
    $password = ConvertTo-SecureString “meinpw” -AsPlainText -Force

    $From = “meineemail”
    $To = “meine2.email”
    $Subject = “ein Betreff”
    $Body = @”
    Nachricht
    Nachricht
    “@
    #################################################################

    $creds = New-Object System.Management.Automation.PSCredential ($username, $password)
    Send-MailMessage -To $To -From $From -Subject $Subject -Body $Body -SmtpServer $SMTPServer -Credential $creds -encoding ([System.Text.Encoding]::UTF8) -UseSsl
    pause

  2. Gerald Matz sagt:

    Besten Dank für diese sehr hilfreiche Vorlage !!! Besonders was die Passwortverschlüsselung mit PSCredential betrifft hat mir die Scriptvorlage viel Zeit erspart.
    Ich hatte auch erst Fehlermeldungen, aber als ich alle Parameter auf eine Zeile “gezogen” habe liefs sofort. Noch mit -Port 587 ergänzt, und deinen Hinweis das PS 3.0 notwendig ist berücksichtigt und alles ist wunderbar. Schön das es Leute wie dich gibt die ihr Wissen teilen. Danke!

  3. Daniel sagt:

    Hallo Tobi,

    ich habe dein Skript zwar noch nicht genutzt, aber ich kann es wahrscheinlich bald sehr gut gebrauchen, denke ich.
    Da mein Postfach nach vielen Jahren der Nutzung mittlerweile nun zum Platzen gefüllt ist, plane ich, meine Mails ordnerweise an ein anderes Postfach weiterzuleiten. Dabei wird mir dein Skript sicherlich eine große Hilfe sein. Vielen Dank deshalb schonmal im Voraus.

    Weißt du rein zufällig, wie ich auf Mails im Unterordner zugreifen kann und wie ich diese dann weiterleite?

    • Tobi sagt:

      Hallo Daniel, das Skript ist eher dazu da, mittels Powershell neue Mails zu generieren. Also z.B. Logs etc. schnell und einfach via Mail zu versenden. Ein Weiterleiten von bestehenden Mails innerhalb eines Postfachs ist damit nicht möglich.
      In diesem Fall wäre es doch viel einfacher beide E-Mail-Konten in Thunderbird zu verbinden und dann die gewünschten Mails bzw. Ordner via Drag and Drop zu verschieben.

Schreibe einen Kommentar

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