2011-03-16 83 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