У меня есть скрипт Perl (который идет с моим программным обеспечением для набора номера Vicidial), который отлично работает в командной строке Linux. Он отправляет электронное письмо в конце скрипта.
Скрипт не создает никаких ошибок и весь скрипт вплоть до sendmail (https://metacpan.org/pod/Mail::Отправить почту) функция работает правильно при запуске в crontab и в исполняемом файле скрипта оболочки (запущенном от имени 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
В общем случае, «работает в оболочке одного пользователя, но не работает crontab
(или не работает в оболочке другого пользователя)» означает, что проблема вызвана тем, что программа полагается на настройки среды (очень часто PATH
), которые установлены у первого пользователя, но отличаются или отсутствуют в cron
среде и оболочке другого пользователя.
Если бы я оказался в ситуации, которую вы описываете, первое, что я бы сделал, это проверил код Perl, потому что Perl — это моя стихия, а затем я бы поместил команду print "Back from sendmail\n";
сразу после sendmail(%mail) or die
, просто чтобы быть абсолютно уверенным, что программа не завершается молча при попытке отправить почту. Но я предполагаю, что вы, вероятно, уже рассмотрели эти основы настолько хорошо, насколько это возможно.
Следующее, что нужно сделать, это запустить env
команду в оболочке, для которой она работает, и просмотреть вывод на предмет любых настроек, которые кажутся релевантными, затем попытаться перенести эти настройки в среду оболочки root, чтобы посмотреть, заставят ли они почту работать там. Как только вы определите настройки, которые заставляют ее работать для root, вы также можете поместить эти же настройки в файл, crontab
и это тоже должно исправиться.
Другой путь, который вы могли бы исследовать, — это проверить tail -f
журнал вашего почтового сервера, чтобы узнать, получает ли он сообщение, а затем отбрасывает (или возвращает), но это кажется немного маловероятным и требует доступа к журналам соответствующего почтового сервера. Проблемы со средой кажутся гораздо более вероятными, если только вы не получаете возвраты из-за неудачных попыток отправки почты. (Проверьте почтовый ящик root на наличие таковых, если вы еще этого не сделали!)
решение2
Я обнаружил ошибку в предоставленном скрипте, которая позволяла включить опцию, когда ее не должно было быть. Теперь все работает нормально.