netzweise2

Send-Mailmessage erzeugt keine verwendbaren Fehler - und wie man damit umgeht

Send-Mailmessage ist ein sehr nützliches Cmdlet, um Emails direkt aus Powershell an einen Mailserver zu senden. Er steht seit Powershell 2.0 zur Verfügung und vermeidet so, dass man sich direkt mit dem [System.net.mail]-Typ herumschlagen muß. Allerdings zeigt das Cmdlet ein sehr merkwürdiges Fehlerverhalten.

Wenn man versucht, Verbindungsfehler abzufangen, ist ein erster vernünftiger Ansatz, einfach auf den Parameter -Errorvariable zurückzugreifen:

Send-Mailmessage -SmtpServer mail.meineFirma.de -Subject 'Warnung' -Body 'Hier kommt die Maus' -From 'Elefant@netz-weise.xyz' -to 'Maulwurf@netz-weise.xyz' -ErrorVariable Fehlermeldung
If ( $Fehlermeldung ) { $Fehlermeldung.Exception.Message }

Tritt ein Fehler auf, wird dieser direkt in der Variablen $Fehlermeldung gespeichert. Achtung, bei der Angabe der Fehlervariablen wird kein $-Zeichen angegeben!

Dummerweise funktioniert diese Herangehensweise nicht. Die Variable $Fehlermeldung bleibt immer leer. Also nächster Versuch, Abfragen der Variablen $Error[0], die alle Fehler als Array speichert und im ersten Eintrag mit dem Index 0 immer den letzten Fehler gespeichert hat. Um herauszufinden, ob Send-Mailmessage einen Fehler geworfen hat oder erfolgreich war, kann man über die Standardvariable $? abrufen. $? ist true, wenn der letzte Befehl erfolgreich war, und false, wenn ein Fehler aufgetreten ist.

Send-Mailmessage -SmtpServer mail.meineFirma.de -Subject 'Warnung' -Body 'Hier kommt die Maus' -From 'Elefant@netz-weise.xyz' -to 'Maulwurf@netz-weise.xyz'
If ( -not $? ) {  $error[0].Exception.Message }

Dummerweise klappt auch dieser Ansatz nicht. $? gibt zwar korrekt false aus, wenn Send-Mailmessage eine Fehlermeldung ausgibt, aber wieder ist die Fehlermeldung nicht in der Fehlervariablen. Tatsächlich, und das ist das Problem, hat der Programmierer des Cmdlets geschlampt und das Fehlerobjekt offensichtlich nicht sauber ausgegeben. Was hilft ist, den Fehlerausgabestrom in die Standardausgabe umzuleiten und den Fehler von hier aus abzufangen:

$Fehlermeldung = Send-Mailmessage -SmtpServer mail.meineFirma.de -Subject 'Warnung' -Body 'Hier kommt die Maus' -From 'Elefant@netz-weise.xyz' -to 'Maulwurf@netz-weise.xyz' 2>&1
If ( $Fehlermeldung ) { $Fehlermeldung.Exception.Message }

Dieser Ansatz sollte so auch bei anderen Cmdlet funktionieren, die die Fehlermeldung nicht sauber zurückgeben.

Weiterführende Links

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/send-mailmessage?view=powershell-5.1

×
Stay Informed

When you subscribe to the blog, we will send you an e-mail when there are new updates on the site so you wouldn't miss them.

Parameter in Powershell-Funktionen und Skripten vo...
MDT - Autologon nach Installation aktiviert lassen

Related Posts

 

Comments

No comments made yet. Be the first to submit a comment
Already Registered? Login Here
Freitag, 29. August 2025