我一直在本地 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/[email protected]”),并且出于某种原因,其中一个有两条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
我已经弄清楚并修复了它。
我查看了
ssmtp
源代码,试图找出它会为某些内容添加 RCPT TO 行的情况。这让我试图弄清楚ssmtp
调用的命令行参数是什么。我发现那mail
是ssmtp
用一些看起来很奇怪的命令行参数调用的,而且似乎对应于“额外”的 RCPT TO 行:有一段时间我一直怀疑这个文件
/etc/mail/mailer.conf
,因为它与“额外”的 RCPT TO 行有很多重叠。它看起来像这样:......但是当我说“看起来像”时,我的意思是字面上令人惊讶的。
cat
当我执行or之类的操作时,这就是我的样子nvim
。mail
但是除了第一行开头的“sendmail”之外,前三行都经过了这一事实,这让我看得更仔细了。原来看起来是六行,其实是四行。前三个伪线没有被 EOL 分开。它们被一大堆空格隔开(因此实际上是一行)。我不知道
nvim
这样显示的东西是否就像它们是单独的行一样,或者这只是巧合(空格的数量恰好等于会导致“完美”包装的数量)。所以,
mail
想调用sendmail
. 它sendmail
在mailer.conf
. 然后它认为该行上的所有内容,除了开头的“sendmail”本身,都是它应该调用的 invokesendmail
。那应该是/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
文件一开始是这个状态,我相信一定是发生了某种悲惨的复制粘贴事故。