CronジョブはHTMLを出力します。メールをHTMLとして送信する方法

CronジョブはHTMLを出力します。メールをHTMLとして送信する方法

失敗した場合に HTML を出力する cron ジョブがあります。成功した場合は何も出力されず、その場合はメールは届きません。失敗して HTML が書き込まれると、cron からメールが送信されますが、プレーン テキストとして表示されるため読みにくくなります。

私は 2 つの部分的な解決策を思いつきましたが、それを本当にうまく機能させる方法はまだわかりません。1 つ目は、ジョブで次のように出力の先頭に MIME 指定子を印刷することです。

Mime-Version: 1.0
Content-Type: text/html
<html>...

次に、cron で次のように実行します。

my-job | sendmail my.name

これの主な問題は、テキストがまったくない場合でもメールが届くことです。2 番目の問題は、スクリプトに MIME タイプの行を追加する必要があることです。これは、ある意味間違った場所です (エレガントではありませんが、許容できるかもしれません)。

次に、テキストがない場合に送信をスキップするオプションがあるmailまたは を使用してみました。mailx-E

my-job | mail -E my.name

これは cron がデフォルトで行うこととほぼ同じです。しかし、mail/mailx で MIME タイプを設定する方法がわかりません。オンラインの参考資料には、オプションを使用して設定すると書かれています-aが、私のシステム (Fedora 16) では、他のシステムのmail -aようにヘッダー行ではなく、添付ファイル名が使用されますContent-Type: text/html

一時ファイルを作成したり、そのサイズを確認したりしたくないので、次のいずれかが必要だと思います。

  • cron メールを HTML として読み取り可能にする方法。
  • sendmail が空のメッセージをスキップするようにします。
  • mailx で MIME タイプを設定します。
  • Fedora にデフォルトでインストールされている別のプログラムを使用する他のアプローチ。

答え1

コマンドラインで受信者を指定する代わりに、 sendmail を呼び出して-tスクリプトにto:ヘッダーを生成させます。(ついでにヘッダーも生成したほうがよいでしょうsubj:。) 出力がない場合、受信者が存在しないため、メールも存在しません。

答え2

最も簡単な方法は、スクリプト内で sendmail を呼び出すことです。こうすることで、メールが送信されるかどうかを制御できます。

あるいは、スクリプトが成功コードを返すようにすることもできます。失敗するスクリプトが「正しく」終了した場合にのみ sendmail を実行します。

$ my-job >/tmp/message && cat /tmp/message | sendmail 

&&これは、最初のコマンドが正常に終了した場合にのみ、次のコマンドを実行するように bash に指示します ( exit 0BASH またはPERL)。スクリプトが失敗した場合にステータス 0 で終了するように指示exit(0)すると、sendmail コマンドが失敗した場合にのみ実行されるようになります。

答え3

コンテンツ タイプは次のように指定できます。

mail -s "$(echo -e "Status Report: $HOSTNAME\nContent-Type: text/html")" "yourmail@"

関連情報