Warning: Default SSL_verify_mode deprecated 的解決辦法

由於 Vultr VPS 默認是禁止程序通過 sendmail 發郵件的。另外 sendmail 發的郵件通常是被一些郵箱當作 spam 處理的。

所以, 我的 MT 是通過設定 stmp 服務器和用戶名、密碼認證登陸到 mail.qq.com 發送郵件。 簡單配置如下:

config    # in mt-config.cgi
    EmailAddressMain UserName@QQ.com
    MailTransfer smtp
    SMTPServer smtp.qq.com
    SMTPUser UserName
    SMTPPassword MyPassword
    SMTPAuth ssl

這個配置可以正常工作。。。

但是,一段時間後查看日誌,發現 mt-starman.log總在不停的增大中,下載下來,發現每次發郵件總會警告:

quote    *******************************************************************
     Using the default of SSL_verify_mode of SSL_VERIFY_NONE for client
     is deprecated! Please set SSL_verify_mode to SSL_VERIFY_PEER
     together with SSL_ca_file|SSL_ca_path for verification.
     If you really don't want to verify the certificate and keep the
     connection open to Man-In-The-Middle attacks please set
     SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application.
    *******************************************************************
      at lib/MT/Mail.pm line 237.

呃,定位發現是Net::SMTP::SSL 模塊問題。。。 這個模塊太老了。。。。。

搜索了一圈,這個問題很普遍,而且解決辦法都五花八門, 但是似乎都是不是很好的解決辦法。。。

因為我用的是 MT 的老版本,那麼我查查 MT6.x 系列是如何解決的?

查看 MT6.x 的 Mail.pm (地址: http://github.com/movabletype/movabletype/blob/master/lib/MT/Mail.pm)

我倒~~ MT6.x 居然直接停用了 Net::SMTP::SSL 模塊,改用了 Net::SMTPS 模塊。 這個並不是我想要的結果。

繼續搜索,終於定位到下面兩個鏈接:

  1. http://www.spinics.net/lists/git/msg298814.html

  2. http://foswiki.org/Support/Faq69#Error:_61Default_SSL_verify_mode_deprecated_61

豁然大悟,理由如下:

Net::SMTP itself can do the necessary SSL and STARTTLS bits just fine since version 1.28, and Net::SMTP::SSL is now deprecated. Since 1.28 isn't that old yet, keep the old code in place and use it when necessary.

簡單的說就是:

Net::SMTP::SSL 模塊廢棄了。 這個模塊是 Net::SMTP 模塊的擴展, 現在的 Net::SMTP 模塊(版本大於1.28)自行即可處理 SSL 連接。。

那麼解決辦法很簡單了。。。

打開 Mail.pm ,定位 Net::SMTP::SSL ,直接改成 Net::SMTP,並保證其有參數 SSL => 1 即可。

代碼片段如下:

perlelsif ($ssl) {
### By EasunLee  Net::SMTP can do ssl well itself ,Net::SMTP::SSL is obsolete, use only when necessary,
$smtp = Net::SMTP->new(
  $host,
  Port=> $port,
  Timeout => 60,
  Hello   => $localhost,
  SSL => 1,
  ( $MT::DebugMode ? ( Debug => 1 ) : () ),
  )
  or return $class->error(
      MT->translate(
     'Error connecting to SMTP server [_1]:[_2]',
    $host, $port
   )
  );
} 

詳細修改請參考 GitHub
保存,重啟 mt-starman 。 測試發郵件,一切正常,也沒有了警告。。