Ich habe einen Cron-Job, der, wenn er fehlschlägt, HTML ausgibt. Wenn er erfolgreich ist, gibt er nichts aus, und ich bekomme keine E-Mail. Wenn er fehlschlägt und HTML schreibt, schickt mir Cron die E-Mail, aber sie kommt als einfacher Text und ist schwer zu lesen.
Ich habe zwei Teillösungen gefunden, aber noch nicht herausgefunden, wie ich sie richtig zum Laufen bekomme. Die erste besteht darin, meinen Job so zu gestalten, dass MIME-Spezifizierer am Anfang der Ausgabe gedruckt werden, und zwar wie folgt:
Mime-Version: 1.0
Content-Type: text/html
<html>...
Dann führe ich es in cron folgendermaßen aus:
my-job | sendmail my.name
Das Hauptproblem dabei ist, dass ich E-Mails bekomme, auch wenn überhaupt kein Text vorhanden ist. Ein sekundäres Problem ist, dass ich meinem Skript die MIME-Typzeilen hinzufügen musste, was irgendwie der falsche Ort dafür ist (nicht elegant, aber vielleicht erträglich).
Dann habe ich versucht, mail
oder zu verwenden mailx
, die über eine -E
Option zum Überspringen des Sendens verfügen, wenn kein Text vorhanden ist:
my-job | mail -E my.name
Das macht so ziemlich das, was cron standardmäßig macht. Ich kann jedoch keine Möglichkeit finden, den MIME-Typ mit mail/mailx festzulegen! Einige Online-Referenzen sagen, dass dies mit der -a
Option geschieht, aber auf meinem System (Fedora 16) mail -a
wird ein Dateiname für Anhänge verwendet, keine Kopfzeile, wie Content-Type: text/html
dies anscheinend auf einigen anderen Systemen der Fall ist.
Ich möchte keine temporäre Datei erstellen, ihre Größe prüfen usw. Ich glaube, ich möchte eines davon:
- Eine Möglichkeit, Cron-Mail als HTML lesbar zu machen.
- Damit Sendmail leere Nachrichten überspringt.
- So legen Sie einen MIME-Typ in mailx fest.
- Ein anderer Ansatz verwendet ein anderes Programm, das standardmäßig auf Fedora installiert ist.
Antwort1
Anstatt den Empfänger in der Befehlszeile anzugeben, rufen Sie sendmail auf -t
und lassen Sie Ihr Skript einen to:
Header generieren. (Sie können auch gleich einen subj:
Header erstellen, wenn Sie schon dabei sind.) Wenn dann keine Ausgabe erfolgt, gibt es keinen Empfänger und somit auch keine E-Mail.
Antwort2
Am einfachsten wäre es, wenn Sie sendmail in Ihrem Skript aufrufen. Auf diese Weise können Sie steuern, ob Ihnen E-Mails gesendet werden oder nicht.
Alternativ können Sie Ihr Skript so einrichten, dass es einen Erfolgscode zurückgibt, wenn esschlägt fehlund führen Sie sendmail nur aus, wenn das Skript „korrekt“ beendet wird:
$ my-job >/tmp/message && cat /tmp/message | sendmail
Dies &&
weist Bash an, den nächsten Befehl nur auszuführen, wenn der erste erfolgreich beendet wurde ( exit 0
in BASH oder exit(0)
in PERL). Indem Sie Ihrem Skript sagen, dass es mit dem Status 0 beendet werden soll, wenn es fehlschlägt, führen Sie den Sendmail-Befehl nur bei einem Fehler aus.
Antwort3
Den Inhaltstyp können Sie wie folgt angeben:
mail -s "$(echo -e "Status Report: $HOSTNAME\nContent-Type: text/html")" "yourmail@"