本文受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库,并:
- 从中拷贝libcrypto-1_1.dll、libssl-1_1.dll到d:\Programs\Qt\Qt5.12.6\5.12.6\mingw73_32\bin\中
- 拷贝libcrypto-1_1-x64.dll、libssl-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。