-e(如果文件存在)perl 查找 sendmail 的技巧

-e (if file exists) trickiness in perl finding sendmail

试图测试一个常见的 sendmail 位置列表,我想只是循环和 -e 测试,但这里有些东西我不明白,写了一个小子程序来更好地解释这个;

sub mail_z
{
my $sendmail = '/xampp/usr/lib/sendmail';  #tried with/without/ and included the .exe

if(-e $sendmail){print"found SendMail";}else{print"NOT Found SendMail";}

    open ( MAIL, "| $sendmail " );
        print MAIL "From: $sender\n";
        print MAIL "To: $recipient\n";
        print MAIL "Subject: $subject\n\n";
        print MAIL "$body\n";
        print MAIL "\n.\n";
    close ( MAIL );
}

这个子的结果是它在页面上打印 "NOT Found SendMail" 然后使用 sendmail 给我发邮件。很明显它发现它不是 -e 我在这里做错了什么?

看CPAN的威力

use Unix::Whereis;

my $sendmail = whereis('ffmpeg');

FWIW,模块使用这些测试

if ( -f $bin && -x _ && -s _ ) {
# ...

我不明白的是,在 xampp 中有一个钩子可以在使用 [open MAIL] 时捕获缩写的 [/xampp/usr/lib/sendmail]。它可能在那里模拟在线 Apache 服务器,但它的深度不足以影响 -e。在我的 xampp 上发送邮件的 actual 路径是 [/xampp/usr/lib/sendmail.exe],这对两个测试都有效。笔记;大多数 xampp 的安装,sendmail 在 [xampp/sendmail/sendmail.exe]

在我的本地 [/xampp/usr/lib/] 目录上进行 readdir 测试显示文件 [sendmail.exe] 但是当我 运行 相同的 readdir 测试在线主机位于 [/usr/sbin/] 我发现该文件名为 [sendmail],没有扩展名,并且在 [sendmail] 上在线进行 -f 和 -d(文件或文件夹)测试,它显示它是一个文件。所以我原来的问题一次就好了已上传,我只需要记住添加用于本地测试的exe。

Holli 和 Grinnz 的回答是一个很好的替代路线,但是我需要在继续之前找出我的代码有什么问题。