Es gibt die verschiedensten Wege um E-Mails über PowerShell zu versenden. Eine Variante ist, man baut sich die E-Mail samt benötigten Informationen selbst zusammen oder man nutzt die cmdlet Send-MailMessage. Die cmdlet gibt es seit PowerShell 2.0. Die Vorteile liegen auf der Hand, alle benötigten Informationen, wie SMTP-Server, E-Mail-Adresse, ect. werden über Parameter angefügt und so kann nichts vergessen werden. Doch auch die selbst erstellte Variante hat ihre Vorteile.
Ich möchte mehrere Scripte vorstellen, zuerst die selbst erstellen und anschließend gehe ich auf die cmdlet Send-MailMessage kurz ein. Das erste Script ist für einen Exchange Server gedacht. Hier muss der Name des Exchange bekannt sein und der auszuführende User muss entsprechend berechtigt sein.
Was wird benötigt?
Um erfolgreich eine Mail zu versenden muss ein neues Objekt eines SMTP-Client erzeugt werden, dann wird der Host (in diesem Falle der Exchange Server) benötigt. Zudem muss es einen Absender sowie einen Adressanten geben. Der Betreff (engl. Subject) der E-Mail ist nicht zwingen erforderlich, ebenso wie die Information ob es eine HTML-Mail ist. Der Body, also der eigentliche Inhalt der E-Mail sollte allerdings vorhanden sein. Ich habe alle nötigen Eigenschaften in eine Funktion namens sendmail($body) geschrieben und unterhalb den Inhalt der Mail in der Variable $body gespeichert. Anschließend wird die Funktion einfach aufgerufen und der Inhalt übergeben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
function sendmail($body) { $SmtpClient = new-object system.net.mail.smtpClient $MailMessage = New-Object system.net.mail.mailmessage $SmtpClient.Host = "Inexchout.DOMAIN-Strunktur" $mailmessage.from = "stefan.rehwald@stefanrehwald.de" $mailmessage.To.add("stefanrehwald@stefanrehwald.de") $mailmessage.Subject = “Betreff der Nachricht” $MailMessage.IsBodyHtml = $false $mailmessage.Body = $body $smtpclient.Send($mailmessage) } $body = "Irgendein Text oder der Inhalt einer Variable" sendmail $body |
Bei $mailmessage.To.add() müssen die Klammern auch bei nur einem Adressanten gesetzte werden, da es sich hierbei um ein Array handelt. Demzufolge können natürlich mehrere Empfänger hinzugefügt werden. Ebenso ist es möglich auch BBC einzurichten. Also Empfänger die nicht in der E-Mail genannt bzw. angezeigt werden.
Das Script nun noch einmal mit einem Anhang. Dafür wird der Pfad der anzuhängenden Datei benötigt, zudem muss eine Objekt-Instanz erzeugt werden und diese an die E-Mail angehangen werden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
function sendmail($body) { $filename = "D:\Dateien\Zeug.zip" $SmtpClient = new-object system.net.mail.smtpClient $MailMessage = New-Object system.net.mail.mailmessage $att = new-object Net.Mail.Attachment($filename) $SmtpClient.Host = "Inexchout.DOMAIN-Strunktur" $mailmessage.from = "stefan.rehwald@stefanrehwald.de" $mailmessage.To.add("stefanrehwald@stefanrehwald.de") $mailmessage.Subject = “Betreff der Nachricht” $MailMessage.IsBodyHtml = $false $mailmessage.Body = $body $mailmessage.Attachments.Add($att) $smtpclient.Send($mailmessage) } $body = "Irgendein Text oder der Inhalt einer Variable" sendmail $body |
Es können auch über gängige Provider wie GMX, Web.de und andere einfach E-Mails verschickt werden. Dies ist ebenfalls mit und ohne Anhang möglich. Hierbei werden weniger Informationen benötigt als bei dem Script für den Exchange. Es muss wieder eine SMTP-Objekt instanziiert werden, hier wird auch gleich der SMTP-Client des Providers angeben. In meinem Fall ist das mail.gmx.net. Eine List der SMTP, POP3 oder IMAPs der verschieden Provider findet man einfach im Internet oder auf der entsprechenden Seiten des Providers. Es kann auch anstatt des DNS-Namen die IP-Adresse des SMTP-Clients angegeben werden. Die kann mittels CMD-Befehl ping mail.gmx.net ermittelt werden. So ist die IP-Adresse für GMX IPv4 213.165.64.21. Allerdings wird für dieses Verfahren die Authentifizierung benötigt. Dies geschieht je nach Provider mit einem Anmeldenamen oder der E-Mail-Adresse. Das Password wird natürlich auch benötigt. Um erfolgreich die Mail zu versenden müssen folgende Kriterien in folgender Reihenfolge angeben werden: ,,,. Es können hier auch $Variablen eingesetzt werden, die vorher definiert wurden.
1 2 3 4 5 6 7 8 9 10 11 |
#Smtp-Server $smtp = New-Object System.Net.Mail.SmtpClient("mail.gmx.net") #DNS oder IP #Auth $SmtpUser = New-Object System.Net.NetworkCredential $SmtpUser.UserName = "stefan.rehwald@gmx.de" $SmtpUser.Password = "********************" $smtp.Credentials = $SmtpUser $smtp.Send("stefan.rehwald@gmx.de", "stefan.rehwald@stefanrehwald.de", "PowerShell Email", "This is a email from powershell") |
Das Script jetzt nochmal mit Anhang und in einer ähnlichen Schreibweise, angelehnt an das Exchange-Script. Hier wird bei $smtp.send() nur noch die $Variable $MailMessage angehangen. Diese Variante ist zwar länger, sieht aber deutlich übersichtlicher aus.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$smtp = New-Object System.Net.Mail.SmtpClient $MailMessage = New-Object system.net.mail.mailmessage $attfile = "C:\Users\stefan.rehwald\Desktop\homehoffice_arbeit.docx" $attatchment = New-Object System.Net.Mail.Attachment($attfile) $smtp.Host = "mail.gmx.net" #DNS oder IP $MailMessage.From = "stefan.rehwald@gmx.de" $MailMessage.To.Add("stefan.rehwald@stefanrehwald.de") $MailMessage.Subject = "PowerShell Email with attatchemnt" $MailMessage.Body ="This is a email from powershell with attatchments" $MailMessage.IsBodyHtml = $false $MailMessage.Attachments.Add($attatchment) #Auth $SmtpUser = New-Object System.Net.NetworkCredential $SmtpUser.UserName = "stefan.rehwald@gmx.de" $SmtpUser.Password = "********************" $smtp.Credentials = $SmtpUser $smtp.Send($MailMessage) |
Es gibt auch die Möglichkeit, dass das Passwort sowie der Benutzername nicht hinterlegt sein müssen. Dies wird mittels der cmdlet get-credential realisiert. Diese Fragt dann Benutzernamen und Passwort ab und sieht wie folgt aus.
Hier wieder die kurze Variante des Scriptes allerdings mit Authentifizierung.
1 2 3 4 5 6 7 8 9 |
#Smtp-Server $smtp = New-Object System.Net.Mail.SmtpClient("mail.gmx.net") #DNS oder IP #Auth $SmtpUser = New-Object System.Net.NetworkCredential $mycredentials = Get-Credential $smtp.Credentials = $mycredentials $smtp.Send("stefan.rehwald@gmx.de", "stefan.rehwald@stefanrehwald.de", "PowerShell Email", "This is a email from powershell") |
Anschließend komme ich noch auf die ab PowerShell 2.0 verfügbare Funktion Send-MailMessge ein. Es werden wieder alle benötigten Informationen als Parameter übergeben. Dies können auch wieder Variablen sein.
1 |
Send-MailMessage -From "Woody <stefan.rehwald@gmx.de>" -To "stefan.rehwald@stefanrehwald.de" -Subject "A Send-Mail-Message" -Body "send with send-mailmessage" -Credential stefan.rehwald@gmx.de -dno OnFailure, OnSuccess -SmtpServer "mail.gmx.net" |
Wer gerne noch mehr Informationen zur cmdlet möchte, kann sich den Artikel von Wolfgang Sommergut zum Thema Send-MailMessage auf WindwosPro anschauen.Er hat einen sehr guten uns ausführlichen Artikel dazu verfasst. Auf Colorconsole.de sind alle Eigenschafen aufgelistet.
rewe
Hallo,
ich möchte eine Datei versenden. KEINEN geschriebenen Text oder so.
Einfach z.B. eine *.pdf-Datei. Und NICHT als Anhang!
Hast Du da vielleicht eine Lösung parat?
Ich hatte gedacht, es ginge vielleicht über einen Ordner in den man beliebige Dateien reinpackt und diese dann OHNE Begleitschreiben o.ä. – also NICHT als Anhang – an einen EMail-Empfänger schicken kann.
Diese Empfängeremail sollte man einfach mittels einer Eingabebox jeweils manuell einfügen können.
Gruß
– Eric –