SmtpClient-for-Qt不能使用ssl发送的处理办法

本文受Qt 5.13.2 qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed启发

项目需要在特定的时刻通过邮件发送报警信息,主体框架使用Qt开发,找了一个基于Qt开发的邮件客户端程序SmtpClient-for-Qt。使用Qt5.12.6,编译、启动运行都很正常,但是在使用QQ邮箱进行发送的时候,遇到几个问题:

  • 无法连接QQ邮箱服务器smtp.qq.com
    原因是QQ邮箱未开启pop/smtp功能,需要web登录邮箱开启相应功能
  • 无法通过ssl连接465端口
    本文主要指导解决此问题

在使用ssl连接465端口时,Qt后台打印信息

qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed

检索网上的解决方案,大多是指出缺少openssl库的缘故,绝大部分文章都指出需要找到libeay32.dll和ssleay32.dll这两个文件,并放到Qt安装目录中。但实操过后并未解决问题。

通过QSslSocket::supportsSsl()观察当前系统平台是否支持ssl,打印结果是false。

文章开头链接的文章中提到一个链接Win32OpenSSL。这里提供windows平台下编译好的openssl库文件的下载。

下载了32位/64位的openssl库,并:

  1. 从中拷贝libcrypto-1_1.dlllibssl-1_1.dll到d:\Programs\Qt\Qt5.12.6\5.12.6\mingw73_32\bin\中
  2. 拷贝libcrypto-1_1-x64.dlllibssl-1_1-x64.dll到d:\Programs\Qt\Qt5.12.6\5.12.6\mingw73_64\bin\中

再次运行打印QSslSocket::supportsSsl(),现在返回结果为true了。

再次通过ssl连接smtp.qq.com的465端口,可以正常发送邮件了。

这个问题出现的原因,在Qt官方论坛里有讨论,可以窥见Qt5.12.6这些高版本中的openssl使用的1.1.x版本,而libeay32.dll和ssleay32.dll对应的版本是openssl1.0.x。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章