本文受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。