我一直在本地 FreeBSD 计算机上使用 SSTMP 将某些 cron 作业的输出等内容发送到我的“真实”主电子邮件帐户,该帐户不是托管在同一台计算机(甚至域)上。例如,我有一个每日 cron 作业设置如下:
smartctl -a /dev/ada0 | grep overall-health | mail -s "Silicon daily smartctl" [email protected]
只要邮件成功发送到我的“真实”电子邮件帐户,效果就很好。但是,每次发送邮件时,我还会从“真实”电子邮件帐户的邮件系统收到一堆警告和退回邮件。
我发现mail
有一个“详细”标志,-v
它显示了我的 SSMTP 和我的“真实”电子邮件帐户主机之间的对话。我尝试了一下,发现了以下有趣的部分:
[->] RCPT TO:<[email protected]>
[<-] 250 Accepted
[->] RCPT TO:</usr/local/sbin/[email protected]>
[<-] 250 Accepted
[->] RCPT TO:<[email protected]>
[<-] 250 Accepted
[->] RCPT TO:</usr/local/sbin/[email protected]>
[<-] 250 Accepted
[->] RCPT TO:<[email protected]>
[<-] 250 Accepted
那么 SSMTP 是说消息不仅应该发送到预期的收件人,还应该发送到其他三个地址?其中之一看起来特别奇怪(“/usr/local/sbin/[电子邮件受保护]”),并且出于某种原因,人们得到二RCPT TO 线。
我不知道这些“额外”的 RCPT TO 线是从哪里来的。有人有什么想法吗?谢谢。
我的 /usr/local/etc/ssmtp/ssmtp.conf 的内容:
[email protected]
mailhub=mail.vesterman.com:465
rewriteDomain=vesterman.com
hostname=silicon.vestertopia.net
FromLineOverride=YES
UseTLS=YES
[email protected]
AuthPass=hunter2
答案1
我已经弄清楚并修复了它。
我查看了ssmtp
源代码,试图找出在什么情况下它会为某些东西添加 RCPT TO 行。然后,我试图找出调用时ssmtp
使用的命令行参数。我发现mail
调用时使用了ssmtp
一些看起来相当奇怪的命令行参数,而且这些参数似乎与“额外的” RCPT TO 行相对应:
# ps -jdp 63097 -ww 999
USER PID PPID PGID SID JOBC STAT TT TIME COMMAND
root 63097 62987 63097 60346 1 I 1 0:00.09 -su (bash)
root 36939 63097 36939 60346 1 S+ 1 0:00.00 - mail -vs aojg [email protected]
root 38014 36939 36939 60346 1 S+ 1 0:00.01 `-- sendmail send-mail /usr/local/sbin/ssmtp mailq /usr/local/sbin/ssmtp -i -v [email protected] (ssmtp)
我有一段时间对该文件持怀疑态度/etc/mail/mailer.conf
,因为它与“额外”的 RCPT TO 行有很多重叠。它看起来像这样:
sendmail /usr/local/sbin/ssmtp
send-mail /usr/local/sbin/ssmtp
mailq /usr/local/sbin/ssmtp
newaliases /usr/local/sbin/ssmtp
hoststat /usr/bin/true
purgestat /usr/bin/true
......但是当我说“看起来像”时,我的意思是字面意思令人惊讶。这就是我做类似cat
或 之类的事情时的样子nvim
。但mail
除了第一行开头的“sendmail”之外,通过前三行的事实让我看得更仔细。
事实证明,虽然它看起来就像六行独立的线一样,它实际上是四行。前三个伪行没有被 EOL 分隔。相反,它们被一大堆空格分隔开(因此实际上是一行)。我不知道nvim
这样的显示是否就像它们是单独的行一样,或者这只是一个巧合(空格的数量恰好等于导致“完美”换行的数量)。
所以,mail
想调用sendmail
.它查找了sendmail
中的行mailer.conf
。然后,它认为该行上的所有内容(除了开头的“sendmail”本身之外)都是它应该调用的 invoke sendmail
。本来应该是这样/usr/local/sbin/ssmtp
,但由于空间古怪,结果却是这样/usr/local/sbin/ssmtp send-mail /usr/local/sbin/ssmtp mailq /usr/local/sbin/ssmtp
。
也就是说,使用命令行参数(加上出于合法原因添加的其他参数)mail
调用可执行文件。/usr/local/sbin/ssmtp
send-mail /usr/local/sbin/ssmtp mailq /usr/local/sbin/ssmtp
最后,sendmail
决定这四个启动参数中的每一个都是要发送到的电子邮件地址,无论出于何种原因,都将“@vesterman.com”添加到每个地址上。
至于为什么该mailer.conf
文件首先处于这种状态,我相信它一定是在某种悲惨的复制粘贴事故中发生的。