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

时间:2016-09-23 20:25:00

标签: linux bash sendmail

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

我想找到我的服务器在运行时运行的 sendmail 的版本,因为 sSMTP 不支持-t,但是强制性的后缀

现在挑战开始了。

关于sSMTP变体输出的{p> sendmail -V 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的变体。不仅仅是postfix或sSMTP。

4 个答案:

答案 0 :(得分:2)

  

有没有更有效的方法来实现这一目标?

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

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

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

答案 1 :(得分:2)

这个怎么样?

type -p sendmail |
xargs dpkg -S

Some packages将其放入/usr/lib,其他人放入/usr/sbin等。这显然要求他们在PATH上。

dpkg -S告诉您安装文件的软件包的名称,type -p用于查找sendmail上的PATH,以便我们将其传递给{{ 1}}。这显然需要一个基于Debian的发行版(Ubuntu,Mint,你有什么)。

dpkg -S系统上ssmpt/usr/lib,输出

PATH

在Postfix系统上,ssmtp: /usr/lib/sendmail 略有不同,

PATH

我认为我没有Exim或Qmail系统,我可以试试这个,但它们应该是可以预测的相似。

另外,如果您想通过来自postfix: /usr/sbin/sendmail 的管道将多行字符串(如电子邮件)传递给sendmail,则需要引用多行变量为了它的工作。

echo

如果您要使用echo "$body" | sendmail -t sendmail -t应该包含要解析的"$body"的{​​{1}}标头 - 这就是To:选项的作用,所以我不认为你想要一个带有收件人地址的变量。

另外,不要将大写字母用于私有变量名称;大写变量名保留供系统使用。

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

答案 2 :(得分:1)

怎么样:

后缀:

$ /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并测试返回值,具体取决于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失败并返回代码(75)。 sSMTP如果在有或没有-C开关的情况下运行,则退出并显示零和消息sendmail: No recipients supplied - mail will not be sent。测试返回值($?)以进行识别。

答案 3 :(得分:-2)

这有点hacky,但是应该有用(我会检查带有sSMTP的机器上的man sendmail没有“postfix”这个词)

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

基本上,它会解析手册页中的“postfix”一词,如果有的话,则返回1(理论上为0表示sSMTP)。