Моя цель - проверить неуправляемые вещи на лету и обновить мою базу данных при отправке писем.Захват диалогового окна между сервером sendmail и SMTP
Я использую sendmail
как так
open(MAIL, "|$sendmail -oi -t -v");
print MAIL "From: $from\n";
В расширенном режиме я получаю все отзывы от удаленного сервера и может увидеть коды возврата, когда получатель не признается. К сожалению, я не смог зафиксировать этот текст.
Я пробовал [Capture::Tiny
] [Capture :: Tiny] без успеха. Выход выводится на экран, а переменная захвата пуста.
Я пробовал [Mail::Sender
] [Mail :: Sender] без успеха. Он возвращает ответ OK, даже если получатель недоступен.
Я пробовал все распространенные методы перенаправления STDOUT
, но sendmail всегда печатает на экране, и моя переменная захвата всегда пуста.
Я пробовал [Net::SMTP
] [Net :: SMTP] без успеха. $smtp->message()
не возвращает никакой информации, которая позволила бы мне идентифицировать недоставленные материалы.
Я запросил $?
после печати до sendmail
, но он всегда имеет нулевое значение.
Если бы я мог захватить диалог между sendmail
и удаленным SMTP-сервером, я мог бы его разобрать и определить недоставок.
Неужели кто-то сделал это с успехом, и если да, то как?
Afternote
Я знаю, что есть много причин, почему почта не может быть доставлена, и это может занять несколько часов до того, как окончательный ответ может быть получен. Однако подавляющее большинство моих недоставок - это просто получатель, который не распознается, и это может быть немедленно устранено. Это то, что я пытаюсь сделать.
Редактировать
Я продолжал работать над этим и добавил следующий код:
open(SAVEOUT, ">&STDOUT");
open(SAVEERR, ">&STDERR");
close(STDOUT);
close(STDERR);
open(STDOUT, '>', \$output) or die $!;
open(STDERR, ">&STDOUT") or die $!;
print "error\n";
print STDOUT "out\n";
open(MAIL, "|$sendmail -oi -t -v");
print MAIL "From: $from\n";
[...]
close(MAIL);
После закрытия MAIL, $ Выход содержит 'ошибки' и 'из'. Но id не содержит выход sendmail, который больше не отображается в терминале, поскольку STDERR был перенаправлен. Таким образом, содержимое $ output показывает, что STDERR был перенаправлен, отсутствие вывода sendmail в терминале демонстрирует, что sendmail пишет в STDERR, но мы по-прежнему не можем захватить вывод из sendmail!
Что мне не хватает?
Я поместил весь код sendmail в отдельный файл, называемый sendemail.pl. Затем я назвал этот код следующим: my $ res = readpipe ("./sendemail.pl \" $ from \ "\" $ subject \ "\" $ to \ "\" $ bcc \ "\" $ errorsto \ " \ "$ body \" "); он отправляет письмо, но я до сих пор не фиксирую вывод. Что мне не хватает? Когда я вызываю readpipe ('ls'), я могу захватить вывод. Но не с sendmail. ??? – Peter
Я делаю прогресс. Когда я это делаю: $ res = readpipe ("./sendemail.pl \" $ from \ "\" $ subject \ "\" $ to \ "\" $ bcc \ "\" $ errorsto \ "\" $ copyofbody \ "> log.txt 2> &1"); Я нахожу, что выход перенаправляется на log.txt. Теперь, как я могу получить его в переменной? – Peter