O trabalho Cron gera HTML; como enviar email como HTML

2

Eu tenho um cron job que, se falhar, gera HTML. Se for bem sucedido, não produz nada, e nesse caso não recebo nenhum email. Se falhar e escrever HTML, o cron me envia o email, mas ele vem como texto simples e é difícil de ler.

Eu criei duas soluções parciais, mas não descobri como fazer isso funcionar muito bem. A primeira é fazer com que o meu trabalho imprima os especificadores MIME no topo da saída, assim:

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

Então eu corro assim no cron:

my-job | sendmail my.name

O principal problema com isso é que eu recebo e-mails, mesmo que não haja texto algum. Um problema secundário é que eu tive que adicionar as linhas do tipo MIME ao meu script, que é uma espécie de lugar errado para ele (não elegante, mas talvez tolerável).

Então, tentei usar mail ou mailx , que têm uma opção -E para ignorar o envio se não houver texto:

my-job | mail -E my.name

Isso faz praticamente o que o cron faz por padrão. Ainda não consigo descobrir qualquer maneira de definir o tipo MIME com mail / mailx! Algumas referências online dizem que é feito usando a opção -a , mas no meu sistema (Fedora 16), mail -a usa um nome de arquivo anexo, não uma linha de cabeçalho como Content-Type: text/html como aparentemente faz em outros sistemas. p>

Eu não quero criar um arquivo temporário, verificar seu tamanho etc. Acho que quero um desses:

  • Uma maneira de tornar o cron mail legível como HTML.
  • Para fazer o sendmail pular mensagens vazias.
  • Para definir um tipo MIME no mailx.
  • Alguma outra abordagem usando um programa diferente que é instalado por padrão no Fedora.
por John Zwinck 20.09.2012 / 09:45

3 respostas

2

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: header. (Você pode muito bem fazer um cabeçalho subj: enquanto estiver nele.) Então, quando não há saída, não há destinatário e, portanto, nenhum email.

    
por 20.09.2012 / 10:19
2

A maneira mais fácil seria chamar o sendmail fom dentro do seu script. Dessa forma, você pode controlar se algum e-mail é enviado para você.

Como alternativa, você pode fazer com que seu script retorne um código de sucesso se ele falhar e executar o sendmail somente se o script sair "corretamente":

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

O && diz ao bash para executar o próximo comando apenas se o primeiro sair com sucesso ( exit 0 no BASH ou exit(0) no PERL). Ao dizer ao seu script para sair com o status 0 se ele falhar, você fará com que o comando sendmail seja executado somente em caso de falha.

    
por 20.09.2012 / 12:00
0

Você pode especificar o tipo de conteúdo da seguinte forma:

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