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 (地址: https://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 。 测试发邮件,一切正常,也没有了警告。。