Cron job gera HTML; como enviar e-mail como HTML

Cron job gera HTML; como enviar e-mail como HTML

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 mailou mailx, que tem a -Eopçã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 -aopção, mas no meu sistema (Fedora 16), mail -aleva um nome de arquivo de anexo, não uma linha de cabeçalho como Content-Type: text/htmlaparentemente 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 -te 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 0em 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@"

informação relacionada