2012-04-04 171 views
12

我试图通过SMTP在Perl中发送邮件。在Perl中通过SMTP发送邮件

我写了一个脚本这一点。

#!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('[email protected]'); 
$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:<[email protected]> 
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: [email protected] 
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足够的信息,让我无法理解这个错误。

我该如何解决这个问题?

回答

21

你有(,授权后,如有必要),以启动一个SMTP会话使用MAIL命令给发件人的电子邮件地址。这就是为什么回复说“MAIL优先”(5xx是错误响应)。所以:

$smtp->auth($smtpuser, $smtppassword); 
$smtp->mail('[email protected]'); 
$smtp->to('[email protected]'); 

但是,如果你不是一个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  => '[email protected]', 
    From => '[email protected]', 
    Subject => 'Hi!', 
    ], 
    body => "This is my message\n", 
); 

sendmail($email, { transport => $transport }); 
+0

我相信你的答案将解决我的问题,但我有一个新的问题。我正在研究windows。我试图安装电子邮件::发件人到Perl库。我使用mingw32,但没有安装。 – Selin 2012-04-04 10:46:34

+1

用适当的诊断程序发布一个单独的问题,也许在SuperUser上。 – tripleee 2012-04-04 11:35:33

+0

如何发送HTML内容而不是纯文本? – 2013-03-12 11:13:30

1

它抱怨缺乏MAIL FROM: SMTP命令。 不看任何资料,我猜它会看起来像$smtp->from('[email protected]')像@cjm写道,你需要$smtp->mail('[email protected]');

诚然,这似乎有点傻必须提供用户名,你刚才认证之后,但从历史和向后兼容的角度来看,它是有意义的(STARTTLS ESMTP规范可以简单地陈述您需要做什么来进行身份验证,然后会话的其余部分在完成身份验证后就像常规SMTP一样发生)。尽管如此,Net::SMTP可以让你屏蔽这些实现细节。

+2

Net :: SMTP是一个低级模块;它的目的不是为了保护你的细节。有更高级别的模块(如Email :: Sender)可以做到这一点。 – cjm 2012-04-17 22:55:57

0

顺便说一句 - 虽然有点晚了,对于未来的读者来说,你真的收到邮件吗?

有在连接输出中没有错误。你已经在你的构造函数中启用了debug(Debug => 1)。一旦您将其设置为0,这些消息就会消失。 使用SMTP的优点是它包含在股票安装中。无需添加模块。

0

可悲的是,(非常)2014年年底,网:: SMTP :: SSL失败1 1的安装测试,因此Gmail中(以及任何其他)基于Web服务器无法访问。在没有安装我自己的邮件服务器的情况下,我可以从Perl发送电子邮件的唯一方法是将其OLE发送到Outlook。然后,Outlook将使用其连接来完成任务。

我希望有人能证明我错了。

5

以下是当前使用STARTTLS(未与其他SMTP服务一起测试)使用Gmail的cjm脚本的更新版本 它使用电子邮件::发件人::传输:: SMTPS代替电子邮件::发件人::传输:: SMTP

您的Gmail帐户必须有允许“不够安全的应用接入”(“开启”) - 其中,“不太安全”并不意味着不加密的,它只是似乎没有使用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 = '[email protected]'; 
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  => '[email protected]', 
    From => '[email protected]', 
    Subject => 'Hi!', 
    ], 
    body => "This is my message\n", 
); 

sendmail($email, { transport => $transport }); 
0

对于使用STARTTLS电子邮件服务时,最好使用较新的Net :: SMTPS模块。请尝试以下代码:

my $msg = MIME::Lite ->new ( 
From => '[email protected]', 
To => '[email protected]', 
Subject => 'Test Message', 
Data => 'This is a test', 
Type => 'text/html' 
); 

my $USERNAME = '[email protected]'; 
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('[email protected]'); 
$smtps->to('[email protected]'); 
$smtps->data(); 
$smtps->datasend($msg->as_string()); 
$smtps->dataend(); 
$smtps->quit;