2015-06-03 2 views
0

Моя цель - проверить неуправляемые вещи на лету и обновить мою базу данных при отправке писем.Захват диалогового окна между сервером 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!

Что мне не хватает?

ответ

0

Попробуйте это:

open(MAIL, "|$sendmail -oi -t -v -v"); 
print MAIL "From: $from\n"; 

# redirect your script to get all messages. 
+0

Я поместил весь код sendmail в отдельный файл, называемый sendemail.pl. Затем я назвал этот код следующим: my $ res = readpipe ("./sendemail.pl \" $ from \ "\" $ subject \ "\" $ to \ "\" $ bcc \ "\" $ errorsto \ " \ "$ body \" "); он отправляет письмо, но я до сих пор не фиксирую вывод. Что мне не хватает? Когда я вызываю readpipe ('ls'), я могу захватить вывод. Но не с sendmail. ??? – Peter

+0

Я делаю прогресс. Когда я это делаю: $ res = readpipe ("./sendemail.pl \" $ from \ "\" $ subject \ "\" $ to \ "\" $ bcc \ "\" $ errorsto \ "\" $ copyofbody \ "> log.txt 2> &1"); Я нахожу, что выход перенаправляется на log.txt. Теперь, как я могу получить его в переменной? – Peter

0

Лучшее решение, которое я могу найти, чтобы перенаправить STDOUT в файл, а затем перенаправить STDERR на STDOUT и, наконец, прочитать файл в переменную, которую я затем использовать.

Необычно, когда я перенаправляюсь к переменной вместо файла, перенаправляется только STDOUT, но не STDERR.

Смежные вопросы