我有一個 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 中)工作」意味著問題是由依賴PATH
第一個使用者已到位但不同的環境設定的程式(經常)引起的或在cron
環境和其他使用者的 shell。
如果我處於你描述的情況,我要做的第一件事就是檢查 Perl 代碼,因為 Perl 是我的菜,然後我會print "Back from sendmail\n";
在 後面立即放置一個命令sendmail(%mail) or die
,只是為了絕對確定該程序不是嘗試發送郵件時靜默退出。但我想您可能已經盡可能地了解了這些基礎知識。
接下來,就是env
在適用的 shell 中運行該命令,並查看輸出以查找可能相關的任何設置,然後嘗試將這些設置移植到 root 的 shell 環境中以查看它們是否收到郵件在那裡工作。一旦您確定了使其適用於 root 的設置,那麼您也可以將這些相同的設置放入文件中crontab
,它也應該可以修復該問題。
您可以調查的另一個途徑是查看tail -f
您的郵件伺服器日誌,看看它是否可能正在接收郵件,然後丟棄(或退回)它,但這似乎有點不太可能,並且需要您有權訪問適當的郵件伺服器的日誌。環境問題似乎更有可能發生,除非您收到因郵件嘗試失敗而退回的郵件。 (如果您還沒有這樣做,請檢查 root 的郵箱!)
答案2
我在提供的腳本中發現了一個錯誤,該錯誤允許在不應該打開的情況下打開選項。現在一切正常。