El trabajo cron genera HTML; cómo enviar correo como HTML

El trabajo cron genera HTML; cómo enviar correo como HTML

Tengo un trabajo cron que, si falla, genera HTML. Si tiene éxito, no genera nada, en cuyo caso no recibo ningún correo. Si falla y escribe HTML, cron me envía el correo, pero viene como texto sin formato y es difícil de leer.

Se me ocurrieron dos soluciones parciales pero no he descubierto cómo hacer que funcionen realmente bien. La primera es hacer que mi trabajo imprima especificadores MIME en la parte superior de la salida, como este:

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

Luego lo ejecuto así en cron:

my-job | sendmail my.name

El principal problema con esto es que recibo correo incluso si no hay ningún texto. Un problema secundario es que tuve que agregar líneas de tipo MIME a mi script, que es el lugar equivocado para ello (no es elegante, pero tal vez sea tolerable).

Luego intenté usar mailo mailx, que tienen la -Eopción de omitir el envío si no hay texto:

my-job | mail -E my.name

Eso hace más o menos lo que hace cron por defecto. ¡Sin embargo, no puedo encontrar ninguna manera de configurar el tipo MIME con mail/mailx! Algunas referencias en línea dicen que se hace usando la -aopción, pero en mi sistema (Fedora 16), mail -atoma un nombre de archivo adjunto, no una línea de encabezado como Content-Type: text/htmlaparentemente ocurre en otros sistemas.

No quiero crear un archivo temporal, comprobar su tamaño, etc. Creo que quiero uno de estos:

  • Una forma de hacer que el correo cron sea legible como HTML.
  • Para hacer que sendmail omita mensajes vacíos.
  • Para configurar un tipo MIME en mailx.
  • Algún otro enfoque utilizando un programa diferente que se instala de forma predeterminada en Fedora.

Respuesta1

En lugar de especificar el destinatario en la línea de comando, llame a sendmail -ty haga que su secuencia de comandos genere un to:encabezado. (También podrías hacer un subj:encabezado mientras lo haces). Luego, cuando no hay salida, no hay destinatario y, por lo tanto, no hay correo.

Respuesta2

La forma más sencilla sería llamar a sendmail desde su script. De esa forma podrás controlar si se te envía o no algún correo.

Alternativamente, puede hacer que su secuencia de comandos devuelva un código de éxito sifallay ejecute sendmail sólo si el script sale "correctamente":

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

Le &&dice a bash que ejecute el siguiente comando solo si el primero salió exitosamente ( exit 0en BASH o exit(0)en PERL). Al decirle a su secuencia de comandos que salga con el estado 0 si falla, hará que el comando sendmail se ejecute solo en caso de falla.

Respuesta3

Puede especificar el tipo de contenido de la siguiente manera:

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

información relacionada