我正在尝试通过SMTP在Perl中发送邮件。
我为此编写了一个脚本。
#!perl
use warnings;
use strict;
use Net::SMTP;
my $smtpserver = 'server';
my $smtpport = 25;
my $smtpuser = 'username';
my $smtppassword = 'password';
my $smtp = Net::SMTP->new($smtpserver, Port=>$smtpport, Timeout => 10, Debug => 1);
die "Could not connect to server!\n" unless $smtp;
$smtp->auth($smtpuser, $smtppassword);
$smtp->to('mymail@gmail.com');
$smtp->data();
$smtp->datasend("To: mymail\@gmail.com\n");
$smtp->quit;
当我运行此脚本时,我的输出如下:
Net::SMTP>>> Net::SMTP(2.31)
Net::SMTP>>> Net::Cmd(2.29)
Net::SMTP>>> Exporter(5.65)
Net::SMTP>>> IO::Socket::INET(1.31)
Net::SMTP>>> IO::Socket(1.32)
Net::SMTP>>> IO::Handle(1.31)
Net::SMTP=GLOB(0x273faf0)<<< 220 server GMX Mailservices E
Net::SMTP=GLOB(0x273faf0)>>> EHLO localhost.localdomain
Net::SMTP=GLOB(0x273faf0)<<< 250-server GMX Mailservices
Net::SMTP=GLOB(0x273faf0)<<< 250-8BITMIME
Net::SMTP=GLOB(0x273faf0)<<< 250-ENHANCEDSTATUSCODES
Net::SMTP=GLOB(0x273faf0)<<< 250-SIZE
Net::SMTP=GLOB(0x273faf0)<<< 250-AUTH=LOGIN PLAIN
Net::SMTP=GLOB(0x273faf0)<<< 250-AUTH LOGIN PLAIN
Net::SMTP=GLOB(0x273faf0)<<< 250 STARTTLS
Net::SMTP=GLOB(0x273faf0)>>> RCPT TO:<mymail@gmail.com>
Net::SMTP=GLOB(0x273faf0)<<< 503 5.5.1 MAIL first {mp-eu001}
Net::SMTP=GLOB(0x273faf0)>>> DATA
Net::SMTP=GLOB(0x273faf0)<<< 503 5.5.1 MAIL first {mp-eu001}
Net::SMTP=GLOB(0x273faf0)>>> To: mymail@gmail.com
Net::SMTP=GLOB(0x273faf0)>>> .
Net::SMTP=GLOB(0x273faf0)<<< 502 5.5.2 Unimplemented {mp-eu001}
Net::SMTP=GLOB(0x273faf0)>>> QUIT
Net::SMTP=GLOB(0x273faf0)<<< 502 5.5.2 Unimplemented {mp-eu001}
我没有足够的有关Perl和SMTP的信息,所以我无法理解这个错误。
我该如何解决这个问题?
答案 0 :(得分:26)
您必须使用MAIL命令启动SMTP会话(在授权后,如有必要),提供发件人的电子邮件地址。这就是响应说“MAIL first”(5xx是错误响应)的原因。所以:
$smtp->auth($smtpuser, $smtppassword);
$smtp->mail('sender@example.com');
$smtp->to('mymail@gmail.com');
但是,如果您不是SMTP专家,为什么不使用更高级别的模块,如Email::Sender而不是低级Net::SMTP?
use strict;
use warnings;
use Email::Sender::Simple qw(sendmail);
use Email::Sender::Transport::SMTP ();
use Email::Simple ();
use Email::Simple::Creator ();
my $smtpserver = 'server';
my $smtpport = 25;
my $smtpuser = 'username';
my $smtppassword = 'password';
my $transport = Email::Sender::Transport::SMTP->new({
host => $smtpserver,
port => $smtpport,
sasl_username => $smtpuser,
sasl_password => $smtppassword,
});
my $email = Email::Simple->create(
header => [
To => 'mymail@gmail.com',
From => 'sender@example.com',
Subject => 'Hi!',
],
body => "This is my message\n",
);
sendmail($email, { transport => $transport });
答案 1 :(得分:6)
这是cjm脚本的更新版本,目前可以使用STARTTLS与Gmail配合使用(未经其他SMTP服务测试) 它使用Email :: Sender :: Transport :: SMTPS而不是Email :: Sender :: Transport :: SMTP
您的Gmail帐户必须拥有&#34;访问不太安全的应用程序&#34;允许(&#34;打开&#34;) - 其中&#34;不太安全&#34;并不意味着未加密,它似乎意味着不使用OAuth 2.0
use strict;
use warnings;
use Email::Sender::Simple qw(sendmail);
use Email::Sender::Transport::SMTPS;
use Email::Simple ();
use Email::Simple::Creator ();
my $smtpserver = 'smtp.gmail.com';
my $smtpport = 587;
my $smtpuser = 'user@gmail.com';
my $smtppassword = 'password';
my $transport = Email::Sender::Transport::SMTPS->new({
host => $smtpserver,
ssl => 'starttls',
port => $smtpport,
sasl_username => $smtpuser,
sasl_password => $smtppassword,
debug => 1,
});
my $email = Email::Simple->create(
header => [
To => 'user@example.com',
From => 'whatever@gmail.com',
Subject => 'Hi!',
],
body => "This is my message\n",
);
sendmail($email, { transport => $transport });
答案 2 :(得分:1)
它抱怨缺少MAIL FROM:
SMTP命令。 没有查看任何文档,我猜它看起来像就像@cjm写的那样,你需要$smtp->from('you@example.net')
$smtp->mail('you@example.net');
当然,在您进行身份验证后提供用户名似乎有点愚蠢,但从历史和向后兼容的角度来看它是有道理的(STARTTLS ESMTP规范可以简单地说明您需要做什么到进行身份验证,然后会话的其余部分就像在身份验证完成后的常规SMTP中一样发生。不过,Net::SMTP
可以保护您免受这些实现细节的影响。
答案 3 :(得分:0)
附加的输出没有错误。您已在构造函数中启用了debug(Debug =&gt; 1)。一旦将其设置为0,这些消息就会消失。 使用SMTP的优点是它包含在库存安装中。无需添加模块。
答案 4 :(得分:0)
可悲的是,在(非常)2014年末,Net :: SMTP :: SSL无法完成1次安装测试,因此无法访问gmail(和任何其他)基于Web的服务器。如果没有安装我自己的邮件服务器,我可以找到从Perl发送电子邮件的唯一方法是OLE到Outlook。然后,Outlook将使用其连接来实现目标。
我希望有人可以证明我错了。
答案 5 :(得分:0)
对于使用STARTTLS的电子邮件服务,最好使用较新的NET :: SMTPS模块。请尝试以下代码:
my $msg = MIME::Lite ->new (
From => 'from@bellsouth.net',
To => 'to@gmail.com',
Subject => 'Test Message',
Data => 'This is a test',
Type => 'text/html'
);
my $USERNAME = 'from@bellsouth.net';
my $PASSWORD = 'abc123';
my $smtps = Net::SMTPS->new("smtp.mail.att.net", Port => 587, doSSL => 'starttls', SSL_version=>'TLSv1');
$smtps->auth ( $USERNAME, $PASSWORD ) or die("Could not authenticate with bellsouth.\n");
$smtps ->mail('from@bellsouth.net');
$smtps->to('to@gmail.com');
$smtps->data();
$smtps->datasend( $msg->as_string() );
$smtps->dataend();
$smtps->quit;