【问题标题】:Capture the dialog between sendmail and SMTP server捕获 sendmail 和 SMTP 服务器之间的对话
【发布时间】: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 的输出!

我错过了什么?

【问题讨论】:

    标签: perl email smtp sendmail


    【解决方案1】:

    试试这个:

     open(MAIL, "|$sendmail -oi -t -v -v");
     print MAIL "From: $from\n";
    
     # redirect your script to get  all messages.
    

    【讨论】:

    • 我将所有 sendmail 代码放在一个名为 sendemail.pl 的单独文件中。然后我这样调用该代码: my $res = readpipe( "./sendemail.pl \"$from\" \"$subject\" \"$to\" \"$bcc\" \"$errorsto\" \"$body\"" );它发送电子邮件,但我仍然没有捕获输出。我错过了什么?当我调用 readpipe('ls') 时,我可以捕获输出。但不是用sendmail。 ???
    • 我正在取得进展。当我这样做时: $res = readpipe( "./sendemail.pl \"$from\" \"$subject\" \"$to\" \"$bcc\" \"$errorsto\" \"$copyofbody \" > log.txt 2>&1" );我发现输出重定向到 log.txt。现在如何将其放入变量中?
    【解决方案2】:

    我能找到的最佳解决方案是将 STDOUT 重定向到文件,然后将 STDERR 重定向到 STDOUT,最后将文件读入一个变量,然后我会使用它。

    奇怪的是,当我重定向到一个变量而不是一个文件时,只有 STDOUT 被重定向,而不是 STDERR。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 2010-11-28
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多