Qt - 基于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();
}
示例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");
// 创建一个 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 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");
// 创建一个 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 - 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);
// 必须设置唯一的内容id
image1.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();
}
项目地址
https://github.com/bluetiger9/SmtpClient-for-Qt
下载地址
https://github.com/bluetiger9/SmtpClient-for-Qt/archive/v1.1.zip
https://codeload.github.com/bluetiger9/SmtpClient-for-Qt/zip/refs/heads/v2.0
使用方法
1. 我这里下载的版本是SmtpClient-for-Qt v2.0的,首先使用Qt打开SMTPEmail.pro文件,编译出SmtpMime2.dll动态库,编译动态库的原因是因为里面的demo运行时需要链接这个动态库。我编的是debug版的,你也可以编release的不过要放到对应的文件夹下。
如下图所示:
2. 再把步骤1中生成的SmtpMime2.dll文件拷贝到对应的debug或release目录下,我这里使用是debug的所以拷到debug文件下。
如下图所示:
3. 双击打开demo2.pro文件,修改成SmtpMime2.dll库的路径即可。注意 : 路径一定要对否则编译会报错
如下图所示:
4.最后编译+运行,就可以成功地把demo2跑起来了,其他demo的使用方法应该也类似。
如下图所示:
5. 当你点击发送邮件的时候可能会报错以下错误: qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed ,这个时候需要安装OpenSSL。
6 解决方案
那么原因清楚了,就应该知道,我们需要把加密这一步缺少的东西给补上。先说一点,Qt本身是支持ssl的,但是因为法律原因?没有自带对应的dll。
我们先使用这段代码打印当前Qt支持的ssl版本:
#include <QSslSocket>
#include <QDebug>
qDebug()<< QSslSocket::sslLibraryBuildVersionString();
使用网络需要加上Qt的网络模块,在pro文件里加上:
QT += network
我这里输出的是
"OpenSSL 1.1.1d 10 Sep 2019"
6.1 接下来就去下载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.2 安装的时候,我选择的是第二个,这样可以方便的进行dll文件的拷贝。
6.3 进入OpenSSL安装目录。bin目录下,拷贝这两个dll文件到工程的exe程序所在路径下。
6.4 比如我这里的路径,直接放到exe根路径下即可,然后程序即可正常运行。
7 填写好正确的邮箱和密码再次点击发送邮件,如果说提示"Authentification Failed"或者提示"Mail sending failed"可能是你填写的邮箱和密码错了.
8 下面是邮件发送成功的截图:
qq邮箱收到的邮件:
这里我也测试了一下,不同OpenSSL 版本的dll是否可以通用,发现高低版本都不行,必须得和Qt 打印出来的OpenSSL 版本一致才行。
另外,很多帖子都是说,把这两个dll文件放到E:\QT\5.12.3\mingw73_64\bin路径下,即Qt的安装路径下。这样也可以,但是我觉得不好,个人认为,尽量别去动Qt安装路径下的文件,保证不会被认为破坏开发环境,或者以后排错,不会导致当时自己把文件放到了Qt安装路径下太久忘记,而在别的电脑上无法正常使用的情况。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端