Qt编写的SMTP客户端(库)
Qt編寫的SMTP客戶端(庫)
允許應用程序通過SMTP發送電子郵件(有文本,html,附件,內聯文件等的MIME)。并支持SSL和SMTP身份驗證。
Qt SMPT客戶端支持
(1) 與SMTP服務器的TCP和SSL連接。
(2) SMTP驗證(PLAIN和LOGIN方法)。
(3) 發送MIME電子郵件(給多個收件人)。
(4) 電子郵件中的純文本和HTML(帶有內聯文件)內容。
(5) 多個附件和內聯文件(用于HTML)。
(6) 不同的字符集(ascii,utf-8等)和編碼方法(7位,8位,base64)。
(7) 錯誤處理。
示例1 -一封簡單的(純文本)電子郵件
#include <QtGui/QApplication> #include "../src/SmtpMime"int main(int argc, char *argv[]) {QApplication a(argc, argv);// 這是Qt項目的Smtpclient的第一個演示應用程序// 首先,我們需要創建一個Smtpclient對象// 我們將使用Gmail的smtp服務器(smtp.gmail.com,端口465,ssl)SmtpClient smtp("smtp.gmail.com", 465, SmtpClient::SslConnection);// 我們需要設置用戶名(您的電子郵件地址)和密碼// 為smtp認證。smtp.setUser("your_email_address@gmail.com");smtp.setPassword("your_password");// 現在我們創建一個MimeMessage對象。這是郵件。MimeMessage message; message.setSender(EmailAddress("your_email_address@gmail.com", "Your Name"));message.addRecipient(EmailAddress("recipient@host.com", "Recipient's Name"));message.setSubject("SmtpClient for Qt - Demo");// 現在向電子郵件中添加一些文本。// 首先,我們創建一個Mimetext對象。MimeText text;text.setText("Hi,\nThis is a simple email message.\n");// 現在將其添加到郵件中message.addPart(&text);// 現在我們可以寄信了smtp.connectToHost();smtp.login();smtp.sendMail(message);smtp.quit();}本文福利,莬費領取Qt開發學習資料包、技術視頻,內容包括(C++語言基礎,Qt編程入門,QT信號與槽機制,QT界面開發-圖像繪制,QT網絡,QT數據庫編程,QT項目實戰,QT嵌入式開發,Quick模塊等等)↓↓↓↓↓↓見下面↓↓文章底部點擊莬費領取↓↓
示例2 -發送附件
#include <QtGui/QApplication> #include "../src/SmtpMime"int main(int argc, char *argv[]) {QApplication a(argc, argv);// 首先創建Smtpclient對象并設置用戶和密碼。SmtpClient smtp("smtp.gmail.com", 465, SmtpClient::SslConnection);smtp.setUser("your_email_address@gmail.com");smtp.setPassword("your_password");// 創建一個 MimeMessageMimeMessage message;message.setSender(EmailAddress("your_email_address@gmail.com", "Your Name"));message.addRecipient(EmailAddress("recipient@host.com", "Recipient's Name"));message.setSubject("SmtpClient for Qt - Demo");// 添加一些文本MimeText text;text.setText("Hi!\n This is an email with some attachments.");message.addPart(&text);// 現在我們創建附件對象QFile image("image1.jpg");MimeAttachment attachment(&image);// 可以設置文件類型。(默認是application/octet-stream)attachment.setContentType("image/jpg");// 現在將其添加到消息中message.addPart(&attachment);// 添加另一個附件QFile document("document.pdf")MimeAttachment documentAttachment(&document);message.addPart(&documentAttachment);// 現在我們可以寄信了smtp.connectToHost();smtp.login();smtp.sendMail(message);smtp.quit();}示例3 -帶有嵌入圖像的HTML電子郵件(內聯文件)
#include <QtGui/QApplication> #include "../src/SmtpMime"int main(int argc, char *argv[]) {QApplication a(argc, argv);// 首先創建Smtpclient對象并設置用戶和密碼。SmtpClient smtp("smtp.gmail.com", 465, SmtpClient::SslConnection);smtp.setUser("your_email@gmail.com");smtp.setPassword("your_password");// 創建一個 MimeMessageMimeMessage message;message.setSender(EmailAddress("your_email_address@gmail.com", "Your Name"));message.addRecipient(EmailAddress("recipient@host.com", "Recipient's Name"));message.setSubject("SmtpClient for Qt - Example 3 - Html email with images");// 現在我們需要為HTML內容創建一個MimeHtml對象。MimeHtml html;html.setHtml("<h1> Hello! </h1>""<h2> This is the first image </h2>""<img src='cid:image1' />""<h2> This is the second image </h2>""<img src='cid:image2' />");// 為每個圖像創建一個MimeInlineFile對象QFile imageFile1("image1.jpg");MimeInlineFile image1 (&imageFile1);// 必須設置唯一的內容idimage1.setContentId("image1");image1.setContentType("image/jpg");QFile imageFile2("image2.jpg");MimeInlineFile image2 (&imageFile2);image2.setContentId("image2");image2.setContentType("image/jpg");message.addPart(&html);message.addPart(&image1);message.addPart(&image2);// 現在可以發送郵件了smtp.connectToHost();smtp.login();smtp.sendMail(message);smtp.quit(); }使用方法:
1. 我這里下載的版本是SmtpClient-for-Qt v2.0的,首先使用Qt打開SMTPEmail.pro文件,編譯出SmtpMime2.dll動態庫,編譯動態庫的原因是因為里面的demo運行時需要鏈接這個動態庫。我編的是debug版的,你也可以編release的不過要放到對應的文件夾下。
如下圖所示:
2. 再把步驟1中生成的SmtpMime2.dll文件拷貝到對應的debug或release目錄下,我這里使用是debug的所以拷到debug文件下。
如下圖所示:
?本文福利,莬費領取Qt開發學習資料包、技術視頻,內容包括(C++語言基礎,Qt編程入門,QT信號與槽機制,QT界面開發-圖像繪制,QT網絡,QT數據庫編程,QT項目實戰,QT嵌入式開發,Quick模塊等等)↓↓↓↓↓↓見下面↓↓文章底部點擊莬費領取↓↓
3. 雙擊打開demo2.pro文件,修改成SmtpMime2.dll庫的路徑即可。注意 : 路徑一定要對否則編譯會報錯
如下圖所示:
?
4.最后編譯+運行,就可以成功地把demo2跑起來了,其他demo的使用方法應該也類似。
如下圖所示:
?
5. 當你點擊發送郵件的時候可能會報錯以下錯誤: qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed ,這個時候需要安裝OpenSSL。
?
6. 安裝OpenSSL
6.1 背景
Qt 使用QNetwork 模塊,進行api請求時發生錯誤,錯誤信息:qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed
6.2 原因
當你用HTTP形式的時候,會發現沒有問題,而使用HTTPS時,則會報錯。如果對計算機網絡有所了解的人,應該大致懂原因。因為HTTP 是超文本傳輸協議,信息是明文傳輸,存在安全風險的問題。HTTPS 則解決 HTTP 不安全的缺陷,在 TCP 和 HTTP 網絡層之間加入了 SSL/TLS 安全協議,使得報文能夠加密傳輸。
SSL/TLS 協議建立的詳細流程:
Client
首先,由客戶端向服務器發起加密通信請求,也就是 Client的請求。在這一步,客戶端主要向服務器發送以下信息:
(1)客戶端支持的 SSL/TLS 協議版本,如 TLS 1.2 版本。
(2)客戶端生產的隨機數( Client Random ),后面用于生產「會話秘鑰」。
(3)客戶端支持的密碼套件列表,如 RSA 加密算法。
Sever
服務器收到客戶端請求后,向客戶端發出響應 。服務器回應的內容有如下內容:
(1)確認 SSL/ TLS 協議版本,如果瀏覽器不支持,則關閉加密通信。
(2)服務器生產的隨機數( Server Random ),后面用于生產「會話秘鑰」。
(3)確認的密碼套件列表,如 RSA 加密算法。
(4)服務器的數字證書。
客戶端回應
客戶端收到服務器的回應之后,首先通過瀏覽器或者操作系統中的 CA 公鑰,確認服務器的數字證書的真實性。如果證書沒有問題,客戶端會從數字證書中取出服務器的公鑰,然后使用它加密報文,向服務器發送如下信息:
(1)一個隨機數( pre-master key )。該隨機數會被服務器公鑰加密。
(2)加密通信算法改變通知,表示隨后的信息都將用「會話秘鑰」加密通信。
(3)客戶端握手結束通知,表示客戶端的握手階段已經結束。這一項同時把之前所有內容的發生的數據做個摘要,用來供服務端校驗。
上面第一項的隨機數是整個握手階段的第三個隨機數,這樣服務器和客戶端就同時有三個隨機數,接著就用雙方協商的加密算法,各自生成本次通信的「會話秘鑰」。
服務器的最后回應
服務器收到客戶端的第三個隨機數( pre-master key )之后,通過協商的加密算法,計算出本次通信的「會話秘鑰」。然后,向客戶端發生最后的信息:
(1)加密通信算法改變通知,表示隨后的信息都將用「會話秘鑰」加密通信。
(2)服務器握手結束通知,表示服務器的握手階段已經結束。這一項同時把之前所有內容的發生的數據做個摘要,用來供客戶端校驗。
至此,整個 SSL/TLS 的握手階段全部結束。接下來,客戶端與服務器進入加密通信,就完全是使用普通的 HTTP 協議,只不過用「會話秘鑰」加密內容。
回到qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed,那么這個報錯,就是缺少加密的手段,也就是沒有提供對HTTP加密的工具,從而無法進行HTTPS通信。
6.3 解決方案
那么原因清楚了,就應該知道,我們需要把加密這一步缺少的東西給補上。先說一點,Qt本身是支持ssl的,但是因為法律原因?沒有自帶對應的dll。
我們先使用這段代碼打印當前Qt支持的ssl版本:
#include <QSslSocket> #include <QDebug> qDebug()<< QSslSocket::sslLibraryBuildVersionString();使用網絡需要加上Qt的網絡模塊,在pro文件里加上:
QT += network
我這里輸出的是
6.4 接下來就去下載OpenSSL,下載方式有兩種:
(1). 下載OpenSSL源碼,自行編譯
https://www.openssl.org/source/
(2). 直接下載dll
Openssl下載網站: http://slproweb.com/products/Win32OpenSSL.html
我推薦第二個方法,省去自己編譯的時間。
然后在這個網站找到對應的版本,比如我的版本是剛剛打印的1.1.1,同時,也要注意工程是32位還是64位,我這里選擇的是Win64 OpenSSL v1.1.1n Light,至于EXE還是MSI都沒差異。
?
6.5 安裝的時候,我選擇的是第二個,這樣可以方便的進行dll文件的拷貝。
6.6 進入OpenSSL安裝目錄。bin目錄下,拷貝這兩個dll文件到工程的exe程序所在路徑下。
6.7 比如我這里的路徑,直接放到exe根路徑下即可,然后程序即可正常運行。
6.8 填寫好正確的郵箱和密碼再次點擊發送郵件,如果說提示"Authentification Failed"或者提示"Mail sending failed"可能是你填寫的郵箱和密碼錯了.
6.9 下面是郵件發送成功的截圖:
?
qq郵箱收到的郵件:
這里我也測試了一下,不同OpenSSL 版本的dll是否可以通用,發現高低版本都不行,必須得和Qt 打印出來的OpenSSL 版本一致才行。
另外,很多帖子都是說,把這兩個dll文件放到E:\QT\5.12.3\mingw73_64\bin路徑下,即Qt的安裝路徑下。這樣也可以,但是我覺得不好,個人認為,盡量別去動Qt安裝路徑下的文件,保證不會被認為破壞開發環境,或者以后排錯,不會導致當時自己把文件放到了Qt安裝路徑下太久忘記,而在別的電腦上無法正常使用的情況。
本文福利,莬費領取Qt開發學習資料包、技術視頻,內容包括(C++語言基礎,Qt編程入門,QT信號與槽機制,QT界面開發-圖像繪制,QT網絡,QT數據庫編程,QT項目實戰,QT嵌入式開發,Quick模塊等等)↓↓↓↓↓↓見下面↓↓文章底部點擊莬費領取↓↓
總結
以上是生活随笔為你收集整理的Qt编写的SMTP客户端(库)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用selenium获取网页源码
- 下一篇: 4.live555mediaserver