Error: need MAIL command when using smtp with perl
Error: need MAIL command when using smtp with perl
我试图使用 Mime::Lite perl 模块并通过 smtp 身份验证发送电子邮件。但不幸的是,这是行不通的。它显示
Error: need MAIL command, Error: command not implemented
这是更新后的代码片段和调试输出。
#!/usr/bin/perl
use warnings;
use strict;
use MIME::Lite;
use Net::SMTP;
use MIME::Base64;
my $smtp = Net::SMTP->new(<mail host>,Port=>587,Debug=>1)or die;
$smtp->starttls();
$smtp->auth($username,$password) or die $!;
my $msg = MIME::Lite -> new (
From => 'from@mail.com',
TO => 'to@mail.com',
Subject => 'Testing Text Message',
Data => 'How\'s it going.' );
$smtp->mail(<from mail>);
$smtp->to(<to mail>);
$smtp -> data();
$smtp -> datasend( $msg->as_string() );
$smtp -> dataend();
print $smtp ->message();
$smtp -> quit;
调试输出:
Net::SMTP>>> Net::SMTP(3.10)
Net::SMTP>>> Net::Cmd(3.10)
Net::SMTP>>> Exporter(5.68)
Net::SMTP>>> IO::Socket::INET6(2.71)
Net::SMTP>>> IO::Socket(1.36)
Net::SMTP>>> IO::Handle(1.34)
Net::SMTP=GLOB(0x1e0a920)<<< 220 email-smtp.amazonaws.com ESMTP SimpleEmailService-2108164273 5RjAQr5ZFI284sDt1KWu
Net::SMTP=GLOB(0x1e0a920)>>> EHLO localhost.localdomain
Net::SMTP=GLOB(0x1e0a920)<<< 250-email-smtp.amazonaws.com
Net::SMTP=GLOB(0x1e0a920)<<< 250-8BITMIME
Net::SMTP=GLOB(0x1e0a920)<<< 250-SIZE 10485760
Net::SMTP=GLOB(0x1e0a920)<<< 250-STARTTLS
Net::SMTP=GLOB(0x1e0a920)<<< 250-AUTH PLAIN LOGIN
Net::SMTP=GLOB(0x1e0a920)<<< 250 Ok
Net::SMTP=GLOB(0x1e0a920)>>> STARTTLS
Net::SMTP=GLOB(0x1e0a920)<<< 220 Ready to start TLS
Net::SMTP::_SSL=GLOB(0x1e0a920)>>> EHLO localhost.localdomain
Net::SMTP::_SSL=GLOB(0x1e0a920)<<< 250-email-smtp.amazonaws.com
Net::SMTP::_SSL=GLOB(0x1e0a920)<<< 250-8BITMIME
Net::SMTP::_SSL=GLOB(0x1e0a920)<<< 250-SIZE 10485760
Net::SMTP::_SSL=GLOB(0x1e0a920)<<< 250-STARTTLS
Net::SMTP::_SSL=GLOB(0x1e0a920)<<< 250-AUTH PLAIN LOGIN
Net::SMTP::_SSL=GLOB(0x1e0a920)<<< 250 Ok
Died at test_script.pl line 17.
请告诉我解决方法。
提前致谢!
您的代码没有任何错误检查,这就是您错过身份验证失败的原因:
Net::SMTP_auth=GLOB(0x13085a8)>>> AUTH LOGIN
Net::SMTP_auth=GLOB(0x13085a8)<<< 530 Must issue a STARTTLS command first
并且由于身份验证失败,它将不接受发送邮件,即 $smtp->mail('admin@testadmin.com');
将导致 Error: need MAIL command, Error: command not implemented
。
不幸的是,非常非常旧的 Net::SMTP_auth(最后更新于 2006 年)不支持 STARTTLS。但是,Net::SMTP 的当前版本支持 auth(因此您不需要 Net::SMTP_auth)和 starttls(从 Net::SMTP 版本 3.xx 开始)。
使用 Net::SMTP 3.xx 你的代码应该是这样的:
my $smtp = Net::SMTP->new( '<emailhost>') or die;
$smtp->starttls or die;
$smtp->auth('<username>', '<password>') or die;
...
我试图使用 Mime::Lite perl 模块并通过 smtp 身份验证发送电子邮件。但不幸的是,这是行不通的。它显示
Error: need MAIL command, Error: command not implemented
这是更新后的代码片段和调试输出。
#!/usr/bin/perl
use warnings;
use strict;
use MIME::Lite;
use Net::SMTP;
use MIME::Base64;
my $smtp = Net::SMTP->new(<mail host>,Port=>587,Debug=>1)or die;
$smtp->starttls();
$smtp->auth($username,$password) or die $!;
my $msg = MIME::Lite -> new (
From => 'from@mail.com',
TO => 'to@mail.com',
Subject => 'Testing Text Message',
Data => 'How\'s it going.' );
$smtp->mail(<from mail>);
$smtp->to(<to mail>);
$smtp -> data();
$smtp -> datasend( $msg->as_string() );
$smtp -> dataend();
print $smtp ->message();
$smtp -> quit;
调试输出:
Net::SMTP>>> Net::SMTP(3.10)
Net::SMTP>>> Net::Cmd(3.10)
Net::SMTP>>> Exporter(5.68)
Net::SMTP>>> IO::Socket::INET6(2.71)
Net::SMTP>>> IO::Socket(1.36)
Net::SMTP>>> IO::Handle(1.34)
Net::SMTP=GLOB(0x1e0a920)<<< 220 email-smtp.amazonaws.com ESMTP SimpleEmailService-2108164273 5RjAQr5ZFI284sDt1KWu
Net::SMTP=GLOB(0x1e0a920)>>> EHLO localhost.localdomain
Net::SMTP=GLOB(0x1e0a920)<<< 250-email-smtp.amazonaws.com
Net::SMTP=GLOB(0x1e0a920)<<< 250-8BITMIME
Net::SMTP=GLOB(0x1e0a920)<<< 250-SIZE 10485760
Net::SMTP=GLOB(0x1e0a920)<<< 250-STARTTLS
Net::SMTP=GLOB(0x1e0a920)<<< 250-AUTH PLAIN LOGIN
Net::SMTP=GLOB(0x1e0a920)<<< 250 Ok
Net::SMTP=GLOB(0x1e0a920)>>> STARTTLS
Net::SMTP=GLOB(0x1e0a920)<<< 220 Ready to start TLS
Net::SMTP::_SSL=GLOB(0x1e0a920)>>> EHLO localhost.localdomain
Net::SMTP::_SSL=GLOB(0x1e0a920)<<< 250-email-smtp.amazonaws.com
Net::SMTP::_SSL=GLOB(0x1e0a920)<<< 250-8BITMIME
Net::SMTP::_SSL=GLOB(0x1e0a920)<<< 250-SIZE 10485760
Net::SMTP::_SSL=GLOB(0x1e0a920)<<< 250-STARTTLS
Net::SMTP::_SSL=GLOB(0x1e0a920)<<< 250-AUTH PLAIN LOGIN
Net::SMTP::_SSL=GLOB(0x1e0a920)<<< 250 Ok
Died at test_script.pl line 17.
请告诉我解决方法。
提前致谢!
您的代码没有任何错误检查,这就是您错过身份验证失败的原因:
Net::SMTP_auth=GLOB(0x13085a8)>>> AUTH LOGIN Net::SMTP_auth=GLOB(0x13085a8)<<< 530 Must issue a STARTTLS command first
并且由于身份验证失败,它将不接受发送邮件,即 $smtp->mail('admin@testadmin.com');
将导致 Error: need MAIL command, Error: command not implemented
。
不幸的是,非常非常旧的 Net::SMTP_auth(最后更新于 2006 年)不支持 STARTTLS。但是,Net::SMTP 的当前版本支持 auth(因此您不需要 Net::SMTP_auth)和 starttls(从 Net::SMTP 版本 3.xx 开始)。
使用 Net::SMTP 3.xx 你的代码应该是这样的:
my $smtp = Net::SMTP->new( '<emailhost>') or die;
$smtp->starttls or die;
$smtp->auth('<username>', '<password>') or die;
...