Weisheiten - der Netz-Weise Blog
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.
Kommentare