У меня есть задание cron, которое при неудаче выводит HTML. Если оно успешно, то ничего не выводит, в этом случае я не получаю почту. Если оно терпит неудачу и пишет HTML, cron отправляет мне почту, но она приходит в виде обычного текста и ее трудно прочитать.
Я придумал два частичных решения, но не понял, как заставить их работать действительно хорошо. Первое — заставить мою работу печатать спецификаторы 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 делает по умолчанию. Но я не могу придумать, как задать тип MIME с помощью mail/mailx! Некоторые ссылки в сети говорят, что это делается с помощью опции -a
, но в моей системе (Fedora 16) mail -a
принимается имя файла вложения, а не строка заголовка, как Content-Type: text/html
это, по-видимому, происходит в некоторых других системах.
Я не хочу создавать временный файл, проверять его размер и т. д. Думаю, мне нужно что-то из этого:
- Способ сделать почту cron читаемой в формате HTML.
- Чтобы sendmail пропускал пустые сообщения.
- Чтобы установить тип MIME в mailx.
- Другой подход с использованием другой программы, которая установлена по умолчанию в Fedora.
решение1
Вместо того, чтобы указывать получателя в командной строке, вызовите sendmail с помощью -t
и заставьте свой скрипт сгенерировать to:
заголовок. (Вы также можете сделать subj:
заголовок, пока вы этим занимаетесь.) Затем, когда нет вывода, нет и получателя, а значит, нет и почты.
решение2
Самый простой способ — вызвать sendmail fom в вашем скрипте. Таким образом, вы можете контролировать, будет ли вам отправлена почта.
В качестве альтернативы вы можете заставить свой скрипт возвращать код успеха, если онтерпит неудачуи запускать sendmail только в том случае, если скрипт завершается «корректно»:
$ my-job >/tmp/message && cat /tmp/message | sendmail
Сообщает &&
bash, что нужно запустить следующую команду только в случае успешного завершения первой ( exit 0
в BASH или exit(0)
PERL). Сообщив скрипту о необходимости завершить работу со статусом 0 в случае сбоя, вы заставите команду sendmail запускаться только в случае сбоя.
решение3
Вы можете указать тип контента следующим образом:
mail -s "$(echo -e "Status Report: $HOSTNAME\nContent-Type: text/html")" "yourmail@"