Wie passe ich E-Mail-Header von Vixie-cron (Debian) und msmtp an?

Wie passe ich E-Mail-Header von Vixie-cron (Debian) und msmtp an?

Ich hatte einige Probleme damit, cron zum Senden von E-Mails zu bringen. Mein ISP verlangt, dass das Feld „Von:“ mit der E-Mail-Adresse übereinstimmt, von der die E-Mail gesendet wird, andernfalls wird die E-Mail abgelehnt. Da cron das Feld „Von:“ fest auf „root (Cron Daemon)“ codiert, werden diese E-Mails nicht gesendet.

Ich habe msmtp eingerichtet und kann problemlos E-Mails von der Befehlszeile aus senden. Tatsächlich habe ich einige meiner Cron-Jobs in ein Skript gepackt, das die E-Mails selbst sendet. Das funktioniert gut, aber ich hätte gerne eine elegantere Lösung.

Ich habe ursprünglich das Paket verwendet msmtp-mta, das nur einen symbolischen Link /usr/lib/sendmailzu /usr/bin/msmtperstellt, sodass Cron E-Mails über msmtp sendet. Da das nicht funktionierte, habe ich das Paket entfernt und /usr/lib/sendmailstattdessen ein Bash-Skript eingefügt, das nur die Standardeingabe lesen und eine E-Mail mit den richtigen Headern senden sollte:

#!/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

Dies hat jedoch nicht den gewünschten Effekt. Ich erhalte lediglich eine fast leere E-Mail mit /tmp/vixielogdem gleichen Inhalt:

To: <myemail>
From: Cron <myotheremail>
Subject: Vixie-cron snooper (-i -FCronDaemon -oem <myemail>)

Stdin:

Die E-Mails kommen zur richtigen Zeit, sodass ich weiß, dass der Cron-Job ordnungsgemäß ausgeführt wird, aber ich erhalte keine Ausgabe. Wie könnte ich diesen Ansatz anpassen, um die Ausgabe des Befehls in der E-Mail zu erhalten?

Antwort1

Schließlich kam ich zu folgender Lösung. Anstatt zu verwenden mstmp-mta, schrieb ich mein eigenes einfaches Bash-Skript, das als mein MTA fungiert. In platziert /usr/sbin/sendmail, ersetzt es den From-Header und sendet die E-Mail weiter.

#!/bin/bash

sed -e "s/From: root (Cron Daemon)/From: WHATEVER YOU LIKE/" | msmtp $BASH_ARGV

Hoffentlich hilft dies jedem, der eine einfache Lösung für das Problem sucht.

Antwort2

Die Quelle muss nicht aus dem E-Mail-Header bekannt sein (vorherige Posts stammen von: root (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

Antwort3

Ich habe einen kleinen Wrapper für Systemmails erstellt, der /etc/aliases analysiert und Mail im richtigen Format sendet (über /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 

Ändern Sie einfach die Standard-E-Mail und die E-Mail-Domäne

Antwort4

Wenn es Ihnen nichts ausmacht, dass alle E-Mails von msmtp-mta mit dem gleichen "From"-Header gesendet werden, können Sie die folgende Konfiguration verwenden. Die Aliasdatei ist nützlich, damit lokale Empfänger (z. B.: root) funktionieren

/etc/msmtprc:

account default
...
from [email protected]
# or from %[email protected]
set_from_header on

aliases /etc/aliases

/etc/Aliase

default: [email protected]

verwandte Informationen