失敗した場合にHTMLを出力するcronジョブがあります。成功すると何も出力されません。その場合、メールは届きません。失敗してHTMLを書き込むと、cronからメールが送信されますが、プレーンテキストで表示され、読みにくくなります。
私は2つの部分的な解決策を思いつきましたが、それを本当にうまく機能させる方法を理解していません。 1つ目は、次のように、出力の上部にMIME指定子を出力するようにジョブを作成することです。
Mime-Version: 1.0
Content-Type: text/html
<html>...
次に、cronで次のように実行します。
my-job | sendmail my.name
これの主な問題は、テキストがまったくなくてもメールが届くということです。二次的な問題は、スクリプトにMIMEタイプの行を追加する必要があったことです。これは、スクリプトにとっては間違った場所です(エレガントではありませんが、許容できる可能性があります)。
次に、mail
またはmailx
を使用してみました。これらには、テキストがない場合に送信をスキップする-E
オプションがあります。
my-job | mail -E my.name
これは、cronがデフォルトで行うこととほぼ同じです。それでも、mail/mailxでMIMEタイプを設定する方法がわかりません!オンラインのいくつかの参考文献は、それが-a
オプションを使用して行われると言っていますが、私のシステム(Fedora 16)では、mail -a
は、明らかにそうであるようにContent-Type: text/html
のようなヘッダー行ではなく、添付ファイル名を取ります他のいくつかのシステム。
一時ファイルを作成したり、サイズを確認したりしたくありません。次のいずれかが必要だと思います。
コマンドラインで受信者を指定する代わりに、-t
を指定してsendmailを呼び出し、スクリプトにto:
ヘッダーを生成させます。 (そこにいる間にsubj:
ヘッダーを作成することもできます。)次に、出力がない場合、受信者がいないため、メールがありません。
最も簡単な方法は、スクリプト内でsendmailfomを呼び出すことです。そうすれば、メールを送信するかどうかを制御できます。
または、スクリプトが成功コードを返すようにすることもできますfailsそして、スクリプトが「正しく」終了した場合にのみsendmailを実行します。
_$ my-job >/tmp/message && cat /tmp/message | sendmail
_
_&&
_は、最初のコマンドが正常に終了した場合にのみ次のコマンドを実行するようにbashに指示します(BASHでは_exit 0
_、Perlではexit(0)
)。失敗した場合にステータス0で終了するようにスクリプトに指示することで、sendmailコマンドが失敗した場合にのみ実行されるようになります。
コンテンツタイプは次のように指定できます。
mail -s "$(echo -e "Status Report: $HOSTNAME\nContent-Type: text/html")" "yourmail@"