查找 sendmail 版本(sSMTP 或 Postfix 或其他)

Find sendmail version (sSMTP or Postfix or other)

我有一个在多台服务器上运行的脚本。有些服务器使用 sSMTP,有些服务器使用 postfix

我想在运行时查找我的服务器 运行 的 sendmail 版本,因为 sSMTP 不支持 -t 但在 Postfix

中是强制性的

现在挑战开始。

sendmail -V 在 sSMTP 变体输出上 sSMTP 2.64 (Not sendmail at all) 但 postfix 变体没有用于显示版本的 -V 选项。

我通过以下代码片段成功完成了它。

VER=$(sendmail -V 2>/dev/null)
if [[ "sSMTP" == $VER* ]]; then
        echo $BODY | sendmail $EMAIL #sSMTP
else
        echo $BODY | sendmail -t $EMAIL #postfix
fi

有没有更有效的方法来实现这个?

我想查找我的服务器中的 sendmail 变体。不仅仅是后缀或 sSMTP。

这有点 hacky,但应该可以工作(我会检查带有 sSMTP 的机器上的 man sendmail 没有单词 "postfix")

echo $(man sendmail)| grep "postfix" | wc -l

基本上它会解析单词 "postfix" 和 returns 1 个联机帮助页(理论上 sSMTP 为 0)。

Is there a more efficient method to achieve this?

是;不要试图找到 sendmail 版本,并使用标准方式发送邮件...

您应该使用 mail(或 mailx)命令以获得更好的兼容性

MAILCMD=$(type -p mail || type -p mailx)
echo $BODY | $MAILCMD $EMAIL

怎么样:

后缀:

$ /usr/sbin/sendmail -C sdfsf
sendmail: fatal: open sdfsf/main.cf: No such file or directory
$ echo $?
75

sSMTP:

$ /usr/sbin/sendmail -C sdfsf
sendmail: No recipients supplied - mail will not be sent
$ echo $?
0

在您的脚本中执行 /usr/sbin/sendmail -C sdfsf >/dev/null 2>&1 并测试 return 值,该值因 MTA 而异。

/usr/sbin/sendmail -C sdfsf >/dev/null 2>&1
if [ $? -eq 0 ]; then   # return code 75 would mean Postfix
    echo sSMTP
else 
    echo Postfix
fi
sSMTP

在 Postfix 中 -C 标识配置文件,如果不存在会导致 sendmail 失败并显示 return 代码 (75)。如果 运行 有或没有 -C 开关,sSMTP 将以零和消息 sendmail: No recipients supplied - mail will not be sent 退出。测试 return 值 ($?) 以进行识别。

这个怎么样?

type -p sendmail |
xargs dpkg -S

Some packages放在/usr/lib,其他放在/usr/sbin,等等。这显然需要他们在你的PATH

dpkg -S 告诉您安装文件的包的名称,type -p 用于在您的 PATH 上查找 sendmail,因此我们可以将其传递给dpkg -S。这显然需要 Debian-based 发行版(Ubuntu,Mint,你有什么)。

ssmpt 系统上,/usr/libPATH 上,输出是

ssmtp: /usr/lib/sendmail

在稍微不同的 Postfix 系统上 PATH,

postfix: /usr/sbin/sendmail

我认为我没有可以尝试此操作的 Exim 或 Qmail 系统,但可以预见它们应该是相似的。

顺便说一句,如果你想通过来自 echo 的管道将 multi-line 字符串(例如电子邮件)传递给 sendmail,你需要引用multi-line 变量以使其工作。

echo "$body" | sendmail -t

如果要使用 sendmail -t"$body" 应该包含 To: header 以便 sendmail 解析——这就是 -t 选项,所以我认为在这种情况下您不需要带有收件人地址的变量。

此外,不要为您的私有变量名使用大写字母;大写变量名保留供系统使用。

最后,正如其他地方已经评论的那样,我相信 SSMTP 和 Postfix 都支持 sendmail -t,就像我见过的几乎所有其他 Sendmail 实现一样。所以最后,我认为您实际上不需要此代码来实现该目标。