【问题标题】:Why does Perl's MIME::Lite fail with " SMTP data() command failed: 2.1.5 ... Recipient ok"?为什么 Perl 的 MIME::Lite 失败并显示“SMTP data() command failed: 2.1.5 ... Recipient ok”?
【发布时间】:2011-04-12 22:30:19
【问题描述】:

这可能是一个对 SO 和 SF 都有效的交叉问题。 我正在使用如下 Perl 脚本发送电子邮件:

my $SMTP_SERVER = 'xx.xx.xx.xx'; 
my $DEFAULT_SENDER = 'yyy@xxx.com';      
my $DEFAULT_RECIPIENT = 'yyy@xxx.com';

### Create the multipart "container":
$msg = MIME::Lite->new(
    From    =>$DEFAULT_SENDER,
    To      =>$input{to},
    Cc      =>$DEFAULT_SENDER,
    Subject =>$input{mailsubject},
    Type    =>'multipart/mixed'
);


my $msgbody="<body bgcolor=\"#C0C0C0\">\n";
   $msgbody.="<img src="cid:xyz.gif"><br>O hai thar.."
   $msgbody.="</body>";


### Add the text message part:
### (Note that "attach" has same arguments as "new"):
$msg->attach(
    Type     =>'text/html',
    Data     =>$msgbody
);

### Add the logo image part:    
$msg->attach(
    Type => 'image/gif',
    Id   => 'xyz.gif',
    Path => '/var/www/images/xyz.gif',
);


### Add the file part:
$msg->attach(
    Type        =>'application/zip',
    Path        =>$input{fullpath},
    Filename    =>$input{file},
    Disposition => 'attachment'
);

open ERROR,  '>>', "/debug/error.txt"  or die $!;
STDERR->fdopen( \*ERROR,  'w' );

eval{

# send the email
MIME::Lite->send('smtp', $SMTP_SERVER, Timeout=>30, Debug=>1, Notify => ['FAILURE','DELAY'], SkipBad => 1 );
$msg->send();

1;
}
or do{&error($@)};

close ERROR;

现在这个脚本适用于 98% 的已发送电子邮件。但是 .. 2% 的大客户是我现在想要弄清楚的那个。每当我特别发送给这个客户端时,我都会收到消息:SMTP data() command failed: 2.1.5 ... Recipient ok .

之前有没有人看到过这个错误,或者知道我的问题出在哪里?我尝试替换 X-Mailer: 认为正在被垃圾邮件过滤的标题。我尝试向我们域中的其他人发送相同的消息,但该消息不适用于此客户端 URL。

下面的示例标题:

MIME-Version: 1.0 
Content-Transfer-Encoding: binary 
Content-Type: multipart/mixed; 
boundary="_----------=_12845827796770" 
X-Mailer: MIME::Lite 3.027 (F2.76; T1.29; A2.03; B3.07_01; Q3.07) 
Date: Wed, 15 Sep 2010 13:37:59 -0700 
From: yyy@xxx.com 
To: client1@clienturl.com, client2@clienturl.com, me@xxx.com 
Cc: yyy@xxx.com 
Subject: TEST

有什么线索吗?

此外,直接使用带有相同附件的 Outlook 发送电子邮件可以与此客户端和相同的 smtp 服务器完美配合。只有当通过这个自动化过程发送错误时,才会引起它的丑陋。

更新: 调试日志(这让我认为这是一个很大的延迟问题,其中响应返回异步并在 MIME::Lite 过程中占用正常的操作流程)

MIME::Lite::SMTP>>> MIME::Lite::SMTP
MIME::Lite::SMTP>>>   Net::SMTP(2.31)
MIME::Lite::SMTP>>>     Net::Cmd(2.29)
MIME::Lite::SMTP>>>       Exporter(5.62)
MIME::Lite::SMTP>>>     IO::Socket::INET(1.31)
MIME::Lite::SMTP>>>       IO::Socket(1.30_01)
MIME::Lite::SMTP>>>         IO::Handle(1.27)
MIME::Lite::SMTP=GLOB(0x84ac258)<<< 220 smpt.xxx.com ESMTP Sendmail 8.12.9/8.13.1; Wed, 15 Sep 2010 16:50:44 -0700 (PDT)
MIME::Lite::SMTP=GLOB(0x84ac258)>>> EHLO localhost.localdomain
MIME::Lite::SMTP=GLOB(0x84ac258)<<< 250-smpt.xxx.com Hello [xx.xx.xx.xx], pleased to meet you
MIME::Lite::SMTP=GLOB(0x84ac258)<<< 250-ENHANCEDSTATUSCODES
MIME::Lite::SMTP=GLOB(0x84ac258)<<< 250-PIPELINING
MIME::Lite::SMTP=GLOB(0x84ac258)<<< 250-8BITMIME
MIME::Lite::SMTP=GLOB(0x84ac258)<<< 250-SIZE
MIME::Lite::SMTP=GLOB(0x84ac258)<<< 250-DSN
MIME::Lite::SMTP=GLOB(0x84ac258)<<< 250-ETRN
MIME::Lite::SMTP=GLOB(0x84ac258)<<< 250-DELIVERBY
MIME::Lite::SMTP=GLOB(0x84ac258)<<< 250 HELP
MIME::Lite::SMTP=GLOB(0x84ac258)>>> MAIL FROM:<yyy@xxx.com>
MIME::Lite::SMTP=GLOB(0x84ac258)<<< 250 2.1.0 <yyy@xxx.com>... Sender ok
MIME::Lite::SMTP=GLOB(0x84ac258)>>> RCPT TO:<client1@clienturl.com>
[Wed Sep 15 16:41:22 2010] myemailscript.cgi: MIME::Lite::SMTP=GLOB(0x84ac258): Timeout at /usr/local/share/perl/5.10.0/MIME/Lite.pm line 2889
MIME::Lite::SMTP=GLOB(0x84ac258)>>> RCPT TO:<client2@clienturl.com>
[Wed Sep 15 16:41:52 2010] myemailscript.cgi: MIME::Lite::SMTP=GLOB(0x84ac258): Timeout at /usr/local/share/perl/5.10.0/MIME/Lite.pm line 2889
MIME::Lite::SMTP=GLOB(0x84ac258)>>> RCPT TO:<me@xxx.com>
[Wed Sep 15 16:42:22 2010] myemailscript.cgi: MIME::Lite::SMTP=GLOB(0x84ac258): Timeout at /usr/local/share/perl/5.10.0/MIME/Lite.pm line 2889
MIME::Lite::SMTP=GLOB(0x84ac258)>>> RCPT TO:<yyy@xxx.com>
MIME::Lite::SMTP=GLOB(0x84ac258)<<< 250 2.1.5 <client1@clienturl.com>... Recipient ok
MIME::Lite::SMTP=GLOB(0x84ac258)>>> DATA
MIME::Lite::SMTP=GLOB(0x84ac258)<<< 250 2.1.5 <client2@clienturl.com>... Recipient ok

【问题讨论】:

  • 我看到您在MIME::Lite-&gt;send 期间启用了Debug。您可以发布该日志吗?
  • 好奇是不是因为您包含了body 而不是html/head,或者这很重要?
  • @cjm:感谢您将我指向日志。最终让我找到了解决问题的方法。

标签: perl email smtp mime


【解决方案1】:

Net::SMTP 客户端似乎正在超时,但对 RCTP TO 的响应最终到达时不再是预期的。尝试将超时设置为 300 秒而不是 30 秒?

【讨论】:

  • 这是我在查看调试日志序列后的假设。有点担心,当其他所有客户都没有这个问题时,它需要很长时间。我将测试一些不同的超时值。
  • 虽然在这种情况下增加超时并不理想。感谢您的意见。
  • @George 从该调试日志中,您可以看到响应第一个 RCPT TO 需要 90 到 120 秒。您必须进行试验,看看这是否一致。
猜你喜欢
  • 1970-01-01
  • 2011-06-25
  • 2011-02-12
  • 2022-10-12
  • 1970-01-01
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多