【发布时间】:2015-06-04 05:24:02
【问题描述】:
我的目标是即时验证无法投递的邮件,并在发送电子邮件时相应地更新我的数据库。
我像这样使用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 服务器之间的对话,我就可以解析它并识别无法投递的邮件。
有没有人成功地做到了这一点,如果有,是怎么做到的?
后记
我知道邮件无法送达的原因有很多,并且可能需要数小时才能获得明确的答复。然而,我的绝大多数无法交付的东西只是收件人无法识别,这些可以立即处理。这就是我想要做的。
编辑
我一直在努力,并添加了以下代码:
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 后,$output 包含 'error' 和 'out'。但是 id 不包含 sendmail 的输出,由于 STDERR 已被重定向,因此不再显示在终端中。所以 $output 的内容表明 STDERR 已经被重定向,终端中没有 sendmail 输出表明 sendmail 正在写入 STDERR,但是我们仍然无法捕获到 sendmail 的输出!
我错过了什么?
【问题讨论】: