Cron-Job gibt HTML aus; So senden Sie E-Mails als HTML

Cron-Job gibt HTML aus; So senden Sie E-Mails als HTML

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, mailoder zu verwenden mailx, die über eine -EOption 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 -aOption geschieht, aber auf meinem System (Fedora 16) mail -awird ein Dateiname für Anhänge verwendet, keine Kopfzeile, wie Content-Type: text/htmldies 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 -tund 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 0in 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@"

verwandte Informationen