• 在Qt中使用SmtpClient发送邮件


    前言

            邮件发送功能是一个非常常规的功能,Qt中貌似没有提供直接发送邮件的库,基于此,本文介绍一个发送邮件的库,用起来还不错。

    下载

    下载:在Qt中发送邮件的库。-C++文档类资源-CSDN下载发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送邮件的库发送更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/qianlixiaomage/86393739

    编译

            常规编译,没什么值得注意的。

    使用

    pro中引入库文件

    1. win32:CONFIG(release, debug|release): LIBS += -L$$PWD/thirdpart/emailtool/mingw/x64/lib/ -lSMTPEmail
    2. else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/thirdpart/emailtool/mingw/x64/lib/ -lSMTPEmaild
    3. INCLUDEPATH += $$PWD/thirdpart/emailtool/mingw/x64/include
    4. DEPENDPATH += $$PWD/thirdpart/emailtool/mingw/x64/include

    代码文件

    头文件

    1. #ifndef EMAILVIEW_H
    2. #define EMAILVIEW_H
    3. #include
    4. #include "smtpclient.h"
    5. #include "mimemessage.h"
    6. #include "emailaddress.h"
    7. #include "emailaddress.h"
    8. #include "mimeattachment.h"
    9. #include "mimehtml.h"
    10. namespace Ui {
    11. class EmailView;
    12. }
    13. class EmailView : public QDialog
    14. {
    15. Q_OBJECT
    16. public:
    17. explicit EmailView(QWidget *parent = nullptr);
    18. ~EmailView();
    19. void initParams(QString emailServer, QString emailPort, bool usessl, QString sender, QString pswd, QString nickName, QMap nickMap);
    20. void initUI(QString sender, QString nickName, QString recvier, QString cc, QString subject, QString content, bool isTest);
    21. void initSlots();
    22. void addWindowBtns();
    23. void setUIVisible(bool flag);
    24. private slots:
    25. void onTextEditChanged();
    26. void on_comboBox_currentTextChanged(const QString &arg1);
    27. void on_pushButtonSend_clicked();
    28. void on_pushButtonCancel_clicked();
    29. private:
    30. Ui::EmailView *ui;
    31. QMap m_nickMap;
    32. QString m_email_nickName;
    33. bool m_isPart = false;
    34. QString m_emailServer;
    35. QString m_emailPort;
    36. bool m_emailUseSSL;
    37. QString m_emailSender;
    38. QString m_emailPswd;
    39. };
    40. #endif // EMAILVIEW_H

    源文件

    1. #include "emailview.h"
    2. #include "ui_emailview.h"
    3. #include
    4. EmailView::EmailView(QWidget *parent) :
    5. QDialog(parent),
    6. ui(new Ui::EmailView)
    7. {
    8. ui->setupUi(this);
    9. initSlots();
    10. addWindowBtns();
    11. ui->pushButtonSend->setIcon(QIcon(":/images/send.png"));
    12. ui->pushButtonCancel->setIcon(QIcon(":/images/cancel.png"));
    13. }
    14. EmailView::~EmailView()
    15. {
    16. delete ui;
    17. }
    18. void EmailView::initParams(QString emailServer, QString emailPort, bool usessl, QString sender, QString pswd, QString nickName, QMap nickMap)
    19. {
    20. m_emailPort = emailPort;
    21. m_emailServer = emailServer;
    22. m_emailSender = sender;
    23. m_emailUseSSL = usessl;
    24. m_emailPswd = pswd;
    25. ui->lineEditSender->setText(sender);
    26. ui->lineEditEmailServer->setText(emailServer);
    27. ui->lineEditEmailPort->setText(emailPort);
    28. ui->lineEditEmailPswd->setText(pswd);
    29. ui->lineEditNick->setText(nickName);
    30. ui->checkBoxUseSSL->setChecked(usessl);
    31. m_email_nickName = nickName;
    32. m_nickMap = nickMap;
    33. }
    34. void EmailView::addWindowBtns()
    35. {
    36. Qt::WindowFlags windowFlag = Qt::Dialog;
    37. windowFlag |= Qt::WindowMinimizeButtonHint;
    38. windowFlag |= Qt::WindowMaximizeButtonHint;
    39. windowFlag |= Qt::WindowCloseButtonHint;
    40. setWindowFlags(windowFlag);
    41. }
    42. void EmailView::setUIVisible(bool flag)
    43. {
    44. ui->labelEmailPort->setVisible(flag);
    45. ui->labelEmailPswd->setVisible(flag);
    46. ui->labelEmailServer->setVisible(flag);
    47. ui->labelNick->setVisible(flag);
    48. ui->checkBoxUseSSL->setVisible(flag);
    49. ui->lineEditEmailPort->setVisible(flag);
    50. ui->lineEditEmailServer->setVisible(flag);
    51. ui->lineEditEmailPswd->setVisible(flag);
    52. ui->lineEditNick->setVisible(flag);
    53. }
    54. void EmailView::initUI(QString sender, QString nickName, QString recvier, QString cc, QString subject, QString content, bool isTest)
    55. {
    56. ui->lineEditSender->setText(sender);
    57. ui->lineEditRecvier->setText(recvier);
    58. ui->lineEditCc->setText(cc);
    59. ui->textEdit->setPlainText(content);
    60. if(isTest)
    61. {
    62. subject += "【测试邮件】";
    63. }
    64. ui->lineEditSubject->setText(subject);
    65. m_email_nickName = nickName;
    66. m_isPart = true;
    67. }
    68. void EmailView::initSlots()
    69. {
    70. connect(ui->textEdit, &QTextEdit::textChanged, this, &EmailView::onTextEditChanged);
    71. }
    72. void EmailView::onTextEditChanged()
    73. {
    74. ui->textEdit->setToolTip(ui->textEdit->toHtml());
    75. }
    76. void EmailView::on_comboBox_currentTextChanged(const QString &text)
    77. {
    78. // 根据不同类别设置文本内容及主题
    79. if(text=="请假模板")
    80. {
    81. ui->textEdit->setHtml("xx,您好!
      以下是我的请假申请,请批准!

      请假缘由:xxxxx
      工作交接:暂无工作交接
      请假时间:9:00~12:00(共计3小时)
      "
      );
    82. ui->lineEditSubject->setText(QString("开发十三部_XX_请假信息_%1").arg(QDate::currentDate().toString("yyyyMMdd")));
    83. }
    84. else if(text=="日常模板")
    85. {
    86. ui->textEdit->setHtml("各位领导、同事,大家好!
      以下是xxxxxxx,请查收!
      "
      );
    87. ui->lineEditSubject->setText("开发十三部_XXXXXXXXXXXXX");
    88. }
    89. else
    90. {
    91. ui->textEdit->clear();
    92. ui->lineEditSubject->clear();
    93. }
    94. }
    95. void EmailView::on_pushButtonSend_clicked()
    96. {
    97. QString server = "";
    98. QString port = "";
    99. bool usessl = false;
    100. QString sender = "";
    101. QString pswd = "";
    102. if(m_isPart)
    103. {
    104. server = m_emailServer;
    105. port = m_emailPort;
    106. usessl = m_emailUseSSL;
    107. sender = m_emailSender;
    108. pswd = m_emailPswd;
    109. }
    110. else
    111. {
    112. server = ui->lineEditEmailServer->text();
    113. port = ui->lineEditEmailPort->text();
    114. usessl = ui->checkBoxUseSSL->isChecked();
    115. sender = ui->lineEditSender->text();
    116. pswd = ui->lineEditEmailPswd->text();
    117. }
    118. SmtpClient m_smtp(server, port.toInt(), usessl?SmtpClient::SslConnection:SmtpClient::TcpConnection);
    119. m_smtp.setUser(sender);
    120. m_smtp.setPassword(pswd);
    121. MimeMessage message;
    122. if(m_isPart)
    123. {
    124. message.setSender(new EmailAddress(ui->lineEditSender->text(), m_email_nickName));
    125. }
    126. else
    127. {
    128. message.setSender(new EmailAddress(ui->lineEditSender->text(), ui->lineEditNick->text()));
    129. }
    130. //构建邮件标题
    131. QString subject = ui->lineEditSubject->text();
    132. if(!m_smtp.connectToHost())
    133. {
    134. QMessageBox::information(this, "warn", "邮件服务连接失败");
    135. return;
    136. }
    137. if(!m_smtp.login())
    138. {
    139. QMessageBox::information(this, "warn", "邮件服务登录失败");
    140. return;
    141. }
    142. if(ui->lineEditRecvier->text().trimmed()!="")
    143. {
    144. QStringList recviers = ui->lineEditRecvier->text().split(";");
    145. for(int i = 0; i< recviers.size(); i++)
    146. {
    147. if(m_nickMap.contains(recviers.at(i)))
    148. {
    149. message.addRecipient(new EmailAddress(recviers.at(i),m_nickMap.find(recviers.at(i)).value()));
    150. }
    151. else
    152. {
    153. message.addRecipient(new EmailAddress(recviers.at(i)));
    154. }
    155. }
    156. }
    157. if(ui->lineEditCc->text().trimmed()!="")
    158. {
    159. QStringList ccs = ui->lineEditCc->text().split(";");
    160. for(int i = 0; i< ccs.size(); i++)
    161. {
    162. if(m_nickMap.contains(ccs.at(i)))
    163. {
    164. message.addCc(new EmailAddress(ccs.at(i),m_nickMap.find(ccs.at(i)).value()));
    165. }
    166. else
    167. {
    168. message.addCc(new EmailAddress(ccs.at(i)));
    169. }
    170. }
    171. }
    172. if(message.getRecipients().size()==0)
    173. {
    174. QMessageBox::information(this, "warn", "收件人为空");
    175. m_smtp.quit();
    176. return;
    177. }
    178. message.setSubject(subject);
    179. QString emailHtml = "";
    180. if(m_isPart)
    181. {
    182. emailHtml = ui->textEdit->toPlainText();
    183. }
    184. else
    185. {
    186. emailHtml = ui->textEdit->toHtml();
    187. }
    188. //构建邮件正文
    189. MimeHtml text;
    190. text.setHtml(emailHtml);
    191. message.addPart(&text);
    192. if(!m_smtp.sendMail(message))
    193. {
    194. m_smtp.quit();
    195. QMessageBox::information(this, "warn", "邮件发送失败");
    196. } else{
    197. m_smtp.quit();
    198. QMessageBox::information(this, "info", "邮件发送成功");
    199. }
    200. this->close();
    201. }
    202. void EmailView::on_pushButtonCancel_clicked()
    203. {
    204. this->close();
    205. }

    界面展示

    核心

    重点类:

    SmtpClient
    MimeMessage
    EmailAddress  p1为邮箱地址 p2为昵称

    重点函数

    addCc() 添加抄送人 p1为邮箱地址 p2为昵称
    addRecipient() 添加收件人 p1为邮箱地址 p2为昵称
    sendMail() 发送邮件
    

    结语

    再见! 

  • 相关阅读:
    2022年全球市场刷脸支付系统总体规模、主要企业、主要地区、产品和应用细分研究报告
    嵌入式Linux入门-输入系统应用编程(鼠标、键盘、触摸屏)
    Java项目:SSM网上鲜花商城
    MySQL数据库——主从复制及读写分离
    【HarmonyOS】鸿蒙操作系统架构
    matlab中narginchk函数用法及其举例
    OpenCV之九宫格图像
    算法模型总结:单调栈
    创意电子学-小知识:晶体管
    网课查题公众号搭建-附带查题接口
  • 原文地址:https://blog.csdn.net/qianlixiaomage/article/details/126241369