Как настроить заголовки писем из Vixie-cron (debian) и msmtp?

Как настроить заголовки писем из Vixie-cron (debian) и msmtp?

У меня возникли некоторые проблемы с отправкой писем cron. Мой провайдер требует, чтобы поле "From:" соответствовало адресу электронной почты, с которого отправляется письмо, в противном случае письмо отклоняется. Поскольку cron жестко кодирует поле "From:" на "root (Cron Daemon)", эти письма не отправляются.

Я настроил msmtp и могу отправлять письма без проблем из командной строки. Фактически, я обернул некоторые из моих заданий cron в скрипт, который отправляет само письмо. Это работает отлично, но мне хотелось бы более элегантного решения.

Первоначально я использовал пакет msmtp-mta, который просто ссылается /usr/lib/sendmailна /usr/bin/msmtpтак, чтобы cron отправлял письма с помощью msmtp. Поскольку это не сработало, я удалил пакет и /usr/lib/sendmailвместо него вставил скрипт bash, который должен просто читать из стандартного ввода и отправлять письмо с правильными заголовками:

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

Однако это не дает желаемого эффекта. Я просто получаю почти пустое письмо, /tmp/vixielogсодержащее то же самое:

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

Stdin:

Письма приходят в нужное время, поэтому я знаю, что задание cron выполняется правильно, но я не получаю вывод. Как мне настроить этот подход, чтобы получить вывод команды в письме?

решение1

В конце концов я пришел к следующему решению. Вместо того, чтобы использовать mstmp-mta, я написал свой собственный простой скрипт bash, который действует как мой MTA. Помещенный в /usr/sbin/sendmail, он заменяет заголовок From и отправляет письмо дальше.

#!/bin/bash

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

Надеюсь, это поможет всем, кто ищет легкое решение проблемы.

решение2

Не нужно знать источник из заголовка письма (предыдущие сообщения были От: 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

решение3

Я сделал небольшую оболочку для системных писем, она анализирует /etc/aliases и отправляет почту в правильном формате (через /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 

Просто измените почту по умолчанию и почтовый домен

решение4

Если вы не против того, чтобы все письма, отправленные с msmtp-mta, имели одинаковый заголовок "From", вы можете использовать следующую конфигурацию. Файл псевдонимов полезен, так как локальные получатели (например: root) работают

/etc/msmtprc:

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

aliases /etc/aliases

/etc/псевдонимы

default: [email protected]

Связанный контент