2011-03-16 39 views
1

我试图通过SSL发送带有Perl的电子邮件。基于示例,我遇到的最好的软件包是Net :: SMTP :: SSL。这似乎是标准。不幸的是,构造函数总是返回undef对我来说:通过SSL通过Perl发送电子邮件

my $smtp = Net::SMTP::SSL->new('smtp.server.com', Port => 25, Debug => 1); 

我已经验证,再验证,并再重新验证使用.NET应用程序,基本上做同样的事情的服务器名称和端口号。一切工作正常与.NET应用程序,所以我没有看到任何理由,我应该有问题连接到SMTP服务器。

如果模块提供某种调试信息,这将非常有用,但$!即将变为空白。有没有解释为什么$smtp变量会出现undefined?或者有什么办法可以从构造函数调用中找到一些有用的调试信息?

编辑:是的,我知道端口25是一个奇怪的端口用于SSL。我不知道为什么选择这个端口,但这是正在使用的端口。不幸的是我受到时间的限制,使用其他技术解决这个问题比试图调试cpan模块更容易。感谢大家的帮助。

+1

看看源代码,看看'new'调用的是什么。 – Ether 2011-03-16 17:42:51

+0

@其他我很难理解源代码。正如你可能想象的那样,我并不完全熟悉Perl。如果你能够详细阐述一个完整的答案,这对我和将来发现自己处于类似情况的任何其他人都将是非常有帮助的。 – Jake 2011-03-16 17:51:10

+0

您是否安装了Crypt :: SSLEay或IO :: Socket :: SSL? – Alessandro 2011-03-16 18:03:03

回答

3

Net::SMTP::SSL使用Net::SMTP来完成它的工作。在查看new子网中的Net :: SMTP的source时,由于许多错误条件而返回undef。首先,您可以在调试器中逐步执行此函数调用,也可以手动在其代码中散布打印语句,以查看在释放之前它有多远。

另外,检查您是否安装了IO::Socket::SSL - 这是用于网络操作。如果你使用cpan客户端安装你的模块,你应该拥有它,但是像rpm这样的其他软件包管理器有时会搞砸依赖链。

我还要双精度和三重检查是否有正确的端口:网:: SMTP :: SSL的文件说:

由于网:: SMTP的new法的性质,不会被覆盖以使用SMTPS服务的默认端口。也许未来的版本会像这样聪明。端口465通常是你想要的,指定它并不是一件痛苦的事情。

+1

因此,调试它的唯一方法是进入源代码并插入print语句?什么样的白痴设计了SMTP模块? :/ – Jake 2011-03-16 18:58:26

+0

我也想注意'IO :: Socket :: SSL'可能需要升级。在我的开箱即用的Perl中,我使用了1.962版本,并且新的Net :: SMTP :: SSL返回了'undef'。将IO :: Socket :: SSL升级到1.998解决了这个问题。 – Cozzamara 2014-09-19 08:32:21