我有一个 Perl 脚本(随我的 Vicidial 拨号软件一起提供),可以在 Linux 命令行中完美运行。它在脚本末尾发送一封电子邮件。
该脚本不会产生任何错误,并且直到 sendmail 为止的整个脚本(https://metacpan.org/pod/Mail::Sendmail) 函数在 crontab 和 shell 脚本可执行文件(以 root 身份运行)中运行时正常工作,但是电子邮件不会发送。
在 bash 可执行文件和 bash CLI 中运行脚本有什么区别?sendmail 函数没有抛出任何错误,为什么它就是不发送?
以下是 Perl 脚本中的两个相关代码片段:
use MIME::QuotedPrint;
use MIME::Base64;
use Mail::Sendmail;
if (length($attachment)>0) {
#print $mail{body};
sendmail(%mail) or die $mail::Sendmail::error;
#print "error: ";
#print $mail::Sendmail::error;
}
这是我运行脚本的方式:
/usr/share/astguiclient/AST_email_web_report.pl --email-subject=XXXX--email-list=XXXX --email-sender=XXXX --date=XXXX
答案1
一般来说,“它在一个用户的 shell 中可以工作,但在crontab
(或在另一个用户的 shell 中)却不行”意味着问题是由程序依赖于环境设置(通常)引起的,第一个用户已经设置了环境设置,但在环境和另一个用户的 shellPATH
中却不同或缺失。cron
如果我处于您描述的情况,我要做的第一件事就是检查 Perl 代码,因为 Perl 是我的强项,然后我会print "Back from sendmail\n";
在 后面立即放置一个命令sendmail(%mail) or die
,以确保程序在尝试发送邮件时不会默默退出。但我认为您可能已经尽可能地覆盖了这些基础。
接下来,就是env
在它适用的 shell 中运行该命令,并查看输出中是否有任何看起来可能相关的设置,然后尝试将这些设置移植到 root 的 shell 环境中,看看它们是否能让邮件在那里正常工作。一旦您确定了让 root 正常工作的设置,那么您也可以将这些相同的设置放入文件中crontab
,它也应该可以解决这个问题。
另一种可以调查的方法是查看tail -f
邮件服务器日志,看看它是否可能收到邮件然后将其丢弃(或退回),但这似乎有点牵强,而且需要您能够访问相应的邮件服务器日志。除非您收到来自失败邮件尝试的退回邮件,否则环境问题似乎更有可能发生。(如果您还没有检查 root 的邮箱,请检查它们!)
答案2
我发现提供的脚本中有一个错误,它允许打开一个不应该打开的选项。现在一切都正常了。