Eu tenho um cron job que, se falhar, gera HTML. Se for bem-sucedido, não produzirá nada; nesse caso, não recebo nenhum email. Se falhar e escrever HTML, o cron me envia o e-mail, mas ele vem em texto simples e é difícil de ler.
Eu encontrei duas soluções parciais, mas não descobri como fazê-las funcionar muito bem. A primeira é fazer com que meu trabalho imprima especificadores MIME no topo da saída, assim:
Mime-Version: 1.0
Content-Type: text/html
<html>...
Então eu executo assim no cron:
my-job | sendmail my.name
O principal problema com isso é que recebo mensagens mesmo que não haja nenhum texto. Um problema secundário é que tive que adicionar linhas do tipo MIME ao meu script, que é o lugar errado para isso (não é elegante, mas talvez tolerável).
Então tentei usar mail
ou mailx
, que tem a -E
opção de pular o envio se não houver texto:
my-job | mail -E my.name
Isso faz praticamente o que o cron faz por padrão. No entanto, não consigo descobrir nenhuma maneira de definir o tipo MIME com mail/mailx! Algumas referências online dizem que isso é feito usando a -a
opção, mas no meu sistema (Fedora 16), mail -a
leva um nome de arquivo de anexo, não uma linha de cabeçalho como Content-Type: text/html
aparentemente acontece em alguns outros sistemas.
Não quero criar um arquivo temporário, verificar seu tamanho, etc. Acho que quero um destes:
- Uma maneira de tornar o cron mail legível como HTML.
- Para fazer o sendmail pular mensagens vazias.
- Para definir um tipo MIME em mailx.
- Alguma outra abordagem usando um programa diferente que é instalado por padrão no Fedora.
Responder1
Em vez de especificar o destinatário na linha de comando, chame sendmail com -t
e faça com que seu script gere um to:
cabeçalho. (Você também pode criar um subj:
cabeçalho enquanto estiver fazendo isso.) Então, quando não houver saída, não haverá destinatário e, portanto, nenhum email.
Responder2
A maneira mais fácil seria chamar sendmail fom dentro do seu script. Dessa forma, você pode controlar se algum e-mail será enviado ou não para você.
Alternativamente, você poderia fazer seu script retornar um código de sucesso sefalhare execute o sendmail somente se o script sair "corretamente":
$ my-job >/tmp/message && cat /tmp/message | sendmail
Diz ao &&
bash para executar o próximo comando somente se o primeiro tiver sido encerrado com sucesso ( exit 0
em BASH ou exit(0)
em PERL). Ao dizer ao seu script para sair com status 0 se falhar, você fará com que o comando sendmail seja executado apenas em caso de falha.
Responder3
Você pode especificar o tipo de conteúdo da seguinte maneira:
mail -s "$(echo -e "Status Report: $HOSTNAME\nContent-Type: text/html")" "yourmail@"