如何从 Vixie-cron(debian)和 msmtp 自定义电子邮件标题?

如何从 Vixie-cron(debian)和 msmtp 自定义电子邮件标题?

我在使用 cron 发送电子邮件时遇到了一些问题。我的 ISP 要求“发件人:”字段与发送电子邮件的电子邮件地址相匹配,否则电子邮件将被拒绝。由于 cron 将“发件人:”字段硬编码为“root(Cron Daemon)”,因此这些电子邮件不会被发送。

我已经设置了 msmtp,可以从命令行毫无问题地发送电子邮件。事实上,我已经将一些 cron 作业包装在一个脚本中,该脚本本身会发送电子邮件。这很好用,但我想要一个更优雅的解决方案。

我最初使用的包msmtp-mta只是符号链接/usr/lib/sendmail/usr/bin/msmtp,这样 cron 就可以使用 msmtp 发送电子邮件。由于这不起作用,我删除了该包并放入了一个 bash 脚本,/usr/lib/sendmail该脚本应该只从标准输入读取并发送带有正确标题的电子邮件:

#!/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,它会替换发件人标头并发送电子邮件。

#!/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 发送的电子邮件都使用相同的“发件人”标头,则可以使用以下配置。别名文件很有用,这样本地收件人(例如:)就可以root工作

/etc/msmtprc:

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

aliases /etc/aliases

/etc/别名

default: [email protected]

相关内容