使用Perl通过Gmail发送邮件

时间:2016-05-17 13:27:50

标签: bash perl email

我有这个perl脚本:

#!/usr/bin/perl

use Net::SMTP::TLS;

my $file="/var/www/myweb/textfile.txt";

my $smtp = new Net::SMTP::TLS(
'smtp.gmail.com',
    Hello => 'smtp.gmail.com',
    Port => 587,
    User => 'mymail@gmail.com',
    Password => 'mypassword',
);

$smtp->mail('mymail@gmail.com');
$smtp->to('destinationmail@hotmail.com');
$smtp->data();
$smtp->datasend("Subject: Subject of mail \n");
$smtp->datasend("\n");

#make sure file exists
if (-e $file) {
    $smtp->datasend("body of the mail");
    #read the file one line at a time
    open( RFILE, "<$file" )||print "could not open file";
    while (my $line  = <RFILE>){
            $smtp->datasend("$line");
    }
    close(RFILE) || print "could not close file";
}
else {
    #print "did not find the report $file ";
    exit 1;
}
#End the message.
$smtp->dataend();
#Close the connection to your server.
$smtp->quit();

此脚本打开textfile.txt并将其内容放入电子邮件正文中。从昨天开始,这个脚本在4台不同的Linux计算机上运行良好。现在它返回此消息:

  

无法启动TLS:由于握手问题,SSL连接尝试失败   错误:1409442E:SSL例程:SSL3_READ_BYTES:tlsv1警报协议   scriptname.pl第7行的版本

我没有找到任何有关Gmail SMTP服务更改的文档。我该怎么办?

由于

3 个答案:

答案 0 :(得分:4)

Net::SMTP::TLS自2006年以来一直没有维护,并且有一些错误导致无法使用当前版本的IO :: Socket :: SSL(由于更严格地检查给定参数)和当前站点(由于首选对于SSL 3.0)。这些错误可以通过修改Net :: SMTP :: TLS来修复,也可以通过修改IO :: Socket :: SSL来解决(这是错误的做法,但有足够的网站传播这个)。

我的猜测是你试图使用这个模块并进行一些更改,以使其工作,通过修改Net :: SMTP :: TLS或修改IO :: Socket :: SSL。由于一些更新,这些修改的一部分现在已经消失。由于错误的性质,这可能会导致您尝试SSL 3.0不支持的SSL 3.0。

我的建议:远离Net :: SMTP :: TLS并使用Net :: SMTP(核心模块)。最新版本3.x(2014年发布)本机支持TLS和IPv6(如果安装了IO :: Socket :: SSL)。它包含在perl 5.22+中。如果您无法使用最新版本,则可以安装Net::SSLGlue::SSL,这样可以使用旧版本的Net :: SMTP。

答案 1 :(得分:0)

答案 2 :(得分:0)

最后我选择改变一点脚本。我没有使用Net :: SMTP :: TLS,而是使用了MIME :: Lite

#!/usr/bin/perl
use MIME::Lite;
use Net::SMTPS;

my $file="/var/www/myweb/myfile.txt";
open(FILE, $file) or die "Can't read file 'filename' [$!]\n";  
$document = <FILE>; 
close (FILE);  
my $msg = MIME::Lite ->new (  
From => 'sender@hotmail.com',
To => 'recipient@hotmail.com',
Subject => 'mail subject',  
Data => qq{
<body>
Text message body HTML format. <p> $document </p>
</body>
},
Type => 'text/html; charset=UTF-8'
);  
my $USERNAME = 'sender@hotmail.com';
my $PASSWORD = 'password'; 

my $smtps = Net::SMTPS->new("smtp.live.com", Port => 587, doSSL=> 'starttls', SSL_version=>'TLSv1');

$smtps->auth ( $USERNAME, $PASSWORD ) or DIE("Could not authenticate with mail.\n");

$smtps ->mail('sender@hotmail.com');  
$smtps->to('recipient@hotmail.com');
$smtps->data(); 
$smtps->datasend( $msg->as_string() );  
$smtps->dataend();  
$smtps->quit;

我使用Outlook.com服务而不是GMail。

谢谢!