我尝试编写一个小脚本来覆盖 nullmailer 的发件人地址。Nullmailer 有一个选项“allmailfrom”,您可以将邮件地址放入 /etc/nullmailer/allmailfrom,并且所有发送的邮件都以该地址作为“Return-Path”,但发件人仍然是发件人的值,因此发送程序如 pi@raspberrypi
因此,我尝试创建一个小脚本来重写发件人地址。基本上,您将 sendmail 移至 sendmail-bin,并将创建的脚本命名为 sendmail。它与命令“mail”配合使用,地址按应有的方式重写。但是,对于 cron,它不起作用。STDIN 为空,因此无法通过电子邮件接收 cron 的输出。Syslogs 写道
/usr/sbin/sendmail: line 11: /dev/stdin: permission denied
这是脚本。
#!/bin/bash
#########################################
#Beginn change here
export NULLMAILER_USER=user
export NULLMAILER_HOST=somedomain.com
#Ende change here
#############################################
export NULLMAILER_FLAGS=ft
stdin=$(</dev/stdin)
optPosition=0 #defaultvalue when not found
while getopts ":f:" from; do
case $from in
f) optPosition=$OPTIND
break
;;
esac
done
arguments=($@)
if (($optPosition != 0)); then #-f Option was used
arguments[(($optPosition-2))]=$NULLMAILER_USER@$NULLMAILER_HOST
set -- "${arguments[@]}"
fi
echo "$stdin" | /usr/sbin/sendmail-bin "$@"
NULLMAILER_USER 和 NULLMAILER_HOST 以及 NULLMAILER_FLAGS=f 告诉 nullmailer 将此用作发件人地址。该部分有效,请参阅http://manpages.ubuntu.com/manpages/trusty/man1/nullmailer-inject.1.html
在 crontab 中
*/1 * * * * echo test
当 nullmailer 的原始 sendmail 存在时,邮件正文中就会出现“test”,这是理所当然的。那么为什么无法从 stdin 读取此 bash 脚本呢?
答案1
替换行
stdin=$(</dev/stdin)
和
stdin=`cat`
不知道为什么这会产生这么大的差异,重要的是它有效。