2016-02-10 44 views
2

我编写了一个简单的Perl脚本来使用MIME :: Lite和Net :: SMTP模块发送邮件。但它导致了错误,“SMTP无法连接到邮件服务器:一个非阻塞套接字操作无法立即完成”Perl:SMTP无法连接到邮件服务器

Perl脚本,我都试过了,

use strict; 
use warnings; 
use MIME::Lite; 
use Net::SMTP; 

my $from = '[email protected]'; 
my $to = '[email protected]'; 
my $host = 'smtp.gmail.com'; 

my $subject = 'A test message by script '; 
my $body = "Please ignore this message as this is test from Perl scripts "; 

my $msg = MIME::Lite->new (
    From => $from, 
    To => $to, 
    Subject => $subject, 
    Type =>'multipart/mixed' 
) or die "Error creating multipart container: $!\n"; 

$msg->attach (
    Type => 'TEXT', 
    Data => $body 
) or die "Error adding the text message part: $!\n"; 

MIME::Lite->send('smtp', $host, Timeout=>60); 
$msg->send; 

实际的错误我,

G:\>perl SampleEmail.pl 
SMTP Failed to connect to mail server: A non-blocking socket operation could not 
be completed immediately. 
at SampleEmail.pl line 26. 

请帮我具体是什么,我需要检查才能正常发送邮件。

由于提前

+0

你能说明你使用的perl的确切版本吗?我发现有关用于编译perl的特定编译器的这些问题的参考https://social.msdn.microsoft.com/Forums/vstudio/en-US/bceb27d0-621b-41ee-b536-df8c38f71598/vs-2010-winsock-问题?论坛= wsk – AnFi

回答

1

对不起,回答我的问题,但是这可以帮助别人。

经过一个月的搜索终于找到了为什么我的套接字无法连接到SMTP与适当的主机和密码。在我的事情IO :: Socket模块崩溃。我有取代IO ::插座与新鲜的和整个事情的工作。我想,模块崩溃的原因可能是我手动从不同站点下载所需模块的方式,并将其放置在Perl库而不是Perl包管理器中。

谢谢

-1

如果你配置良好的Linux服务器上运行这一点,你可能会,如果你拿出

use Net::SMTP 

MIME::Lite->send('smtp', $host, Timeout=>60); 

有更好的运气和只要让MIME::Lite使用其默认值 - 通常它会让sendmail处理该消息。 。

+0

嗨@Mscha,我已经检查,因为你使用sendmail陈述,但我仍然绕着相同的错误盘旋。 –

2

MIME ::精简版/网:: SMTP V3 * - 通过smtp.gmail.com发送

Q1:你能teknet SMTP(25)在smtp.gmail.com端口?你收到SMTP问候消息吗?

telnet smtp.gmail.com 25 

A1:NO =>这是很可能是您到SMTP端口传出连接被阻止,以避免传出垃圾邮件。

Q2:你可以telnet msa(587)端口smtp.gmail.com?你收到SMTP问候消息吗?

telnet smtp.gmail.com 587 

A1:YES =>通过MSA(587)或SMTPS(465)发送。 MIME::Lite可以使用Net::SMTP版本3连接到smtps(465)端口。*。
[警告:看到MIME::Lite 3.030 - NET::SMTP with smtps (port 465)]

# use smtps (465) port - it requires Net::SMTP version 3.* 
# use debugging (Debug=>1) for initial tests 
MIME::Lite->send('smtp', $host, SSL=>1, Timeout=>60, 
    AuthUser=>$user,AuthPass=>$pass 
    Debug=>1); 
+0

嗨@Andrzej,感谢您的回复,我使用3.05版的Net Smtp和3.01版的MIME lite。如您所述,我已经使用端口465进行了测试。我再次导致同样的错误。我也可以ping主机。那为什么它告诉无法连接到邮件服务器。我需要检查其他东西吗? –

+1

[Q2]当您在smtp.gmail.com上telnet端口587时,是否收到SMTP问候消息? (它是perl的错吗?) – AnFi

+0

我检查了命令 - “打开smtp.gmail.com 587”,我得到了答复 - “220 smtp.gmail.com ESMTP 188sm1896254qhi.1 - gsmtp”..我也尝试过主机 - '打开secure.emailsrvr.com 587',在那里我的回复为'220 smtp15.relay.iad3a.emailsrvr.com ESMTP - VA代码部分18.2-152.3:1禁止 将此系统用于未经请求的大量电子邮件(垃圾邮件) 421 4.4.2超时超时 与主机的连接丢失。 按任意键继续...' –