当我通过 SSMTP 发送电子邮件时,这些“额外”RCPT_TO 行来自哪里?

当我通过 SSMTP 发送电子邮件时,这些“额外”RCPT_TO 行来自哪里?

我一直在本地 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/ssmtpsend-mail /usr/local/sbin/ssmtp mailq /usr/local/sbin/ssmtp

最后,sendmail决定这四个启动参数中的每一个都是要发送到的电子邮件地址,无论出于何种原因,都将“@vesterman.com”添加到每个地址上。

至于为什么该mailer.conf文件首先处于这种状态,我相信它一定是在某种悲惨的复制粘贴事故中发生的。

相关内容