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。

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