¿Cómo personalizar los encabezados de correo electrónico de Vixie-cron (debian) y msmtp?

¿Cómo personalizar los encabezados de correo electrónico de Vixie-cron (debian) y msmtp?

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/sendmailpara /usr/bin/msmtpque cron envíe correos electrónicos usando msmtp. Como eso no funcionó, eliminé el paquete y /usr/lib/sendmailen 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/vixielogcontiene 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]

información relacionada