%20y%20msmtp%3F.png)
He tenido algunos problemas para que cron envíe correos electrónicos. Mi ISP requiere que el campo "De:" coincida con la dirección de correo electrónico desde la que se envía el correo electrónico; de lo contrario, el correo electrónico se rechaza. Como cron codifica el campo "De:" en "root (Cron Daemon)", estos correos electrónicos no se envían.
He configurado msmtp y puedo enviar correos electrónicos sin problemas desde la línea de comando. De hecho, he incluido algunos de mis trabajos cron en un script que envía el correo electrónico. Esto funciona bien, pero me gustaría una solución más elegante.
Originalmente usé el paquete msmtp-mta
, que solo tiene enlaces simbólicos /usr/lib/sendmail
para /usr/bin/msmtp
que cron envíe correos electrónicos usando msmtp. Como eso no funcionó, eliminé el paquete y /usr/lib/sendmail
en su lugar puse un script bash que debería leer la entrada estándar y enviar un correo electrónico con los encabezados correctos:
#!/bin/bash
HEADERS="To: <myemail>
From: Cron <myotheremail>
Subject: Vixie-cron snooper ($@)
"
INPUT=$( cat /dev/stdin )
echo -e "$HEADERS""Stdin:\n$INPUT\n" | msmtp <myemail>
echo "$HEADERS""Stdin:\n$INPUT\n" > /tmp/vixielog
Sin embargo, esto no tiene el efecto deseado. Acabo de recibir un correo electrónico casi vacío y /tmp/vixielog
contiene lo mismo:
To: <myemail>
From: Cron <myotheremail>
Subject: Vixie-cron snooper (-i -FCronDaemon -oem <myemail>)
Stdin:
Los correos electrónicos llegan en el momento adecuado, por lo que sé que el trabajo cron se está ejecutando correctamente, pero no obtengo el resultado. ¿Cómo podría ajustar este enfoque para obtener el resultado del comando en el correo electrónico?
Respuesta1
Finalmente llegué a la siguiente solución. En lugar de usar mstmp-mta
, escribí mi propio script bash simple que actúa como mi MTA. Colocado en /usr/sbin/sendmail
, reemplaza el encabezado De y envía el correo electrónico.
#!/bin/bash
sed -e "s/From: root (Cron Daemon)/From: WHATEVER YOU LIKE/" | msmtp $BASH_ARGV
Esperemos que esto ayude a cualquiera que quiera una solución ligera al problema.
Respuesta2
No es necesario conocer la fuente del encabezado del correo (las publicaciones anteriores provienen de: raíz (Cron Daemon)):
#!/bin/bash
# /usr/sbin/sendmail
# We write the sent letter to the stdin variable
stdin=$(cat)
# Text to which we will replace the From header:
__REPLACE_WITH="sender name <[email protected]>"
# Find the text between From: and To :, write it to the __FIND_WHAT variable.
__FIND_WHAT=$(echo $stdin | grep -o -P '(?<=From: ).*(?=To:)')
# grep command (above) adds a space to the variable at the end of the line. It must be deleted, otherwise the text replacement will not work.
# Remove the space at the end of the variable
__FIND_WHAT=$( echo $__FIND_WHAT | sed -e 's/\s$//g' )
# Replace the text __FIND_WHAT with __REPLACE_WITH
mail=$(echo "$stdin" | sed -e "s/$__FIND_WHAT/$__REPLACE_WITH/" )
# Send a letter, with the correct sender in the header of the letter.
echo -e "$mail" | msmtp $BASH_ARGV
Respuesta3
He creado un pequeño contenedor para los correos del sistema, analiza /etc/aliases y envía el correo en el formato correcto (a través de /usr/sbin/sendmail):
#!/bin/bash
stdin=$(cat)
mail=$(echo "$stdin" | sed "s/From: root (Cron Daemon)/From: ${4} ${4}@domain.com/g")
if [ -f /etc/aliases ]; then
if [ "grep ${1} /etc/aliases" != "" ]; then
exec < /etc/aliases
while read line
do
if [[ $line =~ ^${1}:\ (.*)$ ]] ; then
addr=${BASH_REMATCH[1]}
else
if [[ $line =~ ^default:\ (.*)$ ]] ; then
addr=${BASH_REMATCH[1]}
fi
fi
done
echo $addr
fi
else
addr="[email protected]"
fi
mail=$(echo "$mail" | sed "s/To: ${4}/To: ${addr} /g")
echo -e "$mail" | msmtp --auto-from=on --read-envelope-from --maildomain=domain.com -t
Simplemente cambie el correo predeterminado y el dominio de correo
Respuesta4
Si no le importa que todos los correos electrónicos se envíen desde msmtp-mta con el mismo encabezado "De", puede utilizar la siguiente configuración. El archivo de alias es útil para que los destinatarios locales (ej: root
) funcionen
/etc/msmtprc:
account default
...
from [email protected]
# or from %[email protected]
set_from_header on
aliases /etc/aliases
/etc/alias
default: [email protected]