日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt编写的SMTP客户端(库)

發布時間:2023/12/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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


我這里輸出的是

"OpenSSL 1.1.1d 10 Sep 2019"


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客户端(库)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。