邮件发送功能是一个非常常规的功能,Qt中貌似没有提供直接发送邮件的库,基于此,本文介绍一个发送邮件的库,用起来还不错。
常规编译,没什么值得注意的。
- win32:CONFIG(release, debug|release): LIBS += -L$$PWD/thirdpart/emailtool/mingw/x64/lib/ -lSMTPEmail
- else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/thirdpart/emailtool/mingw/x64/lib/ -lSMTPEmaild
-
- INCLUDEPATH += $$PWD/thirdpart/emailtool/mingw/x64/include
- DEPENDPATH += $$PWD/thirdpart/emailtool/mingw/x64/include
头文件
- #ifndef EMAILVIEW_H
- #define EMAILVIEW_H
-
- #include
- #include "smtpclient.h"
- #include "mimemessage.h"
- #include "emailaddress.h"
- #include "emailaddress.h"
- #include "mimeattachment.h"
- #include "mimehtml.h"
-
- namespace Ui {
- class EmailView;
- }
-
- class EmailView : public QDialog
- {
- Q_OBJECT
-
- public:
- explicit EmailView(QWidget *parent = nullptr);
- ~EmailView();
- void initParams(QString emailServer, QString emailPort, bool usessl, QString sender, QString pswd, QString nickName, QMap
nickMap) ; - void initUI(QString sender, QString nickName, QString recvier, QString cc, QString subject, QString content, bool isTest);
- void initSlots();
- void addWindowBtns();
- void setUIVisible(bool flag);
- private slots:
- void onTextEditChanged();
-
- void on_comboBox_currentTextChanged(const QString &arg1);
-
- void on_pushButtonSend_clicked();
-
- void on_pushButtonCancel_clicked();
-
- private:
- Ui::EmailView *ui;
- QMap
m_nickMap; - QString m_email_nickName;
-
- bool m_isPart = false;
-
- QString m_emailServer;
- QString m_emailPort;
- bool m_emailUseSSL;
- QString m_emailSender;
- QString m_emailPswd;
- };
-
- #endif // EMAILVIEW_H
源文件
- #include "emailview.h"
- #include "ui_emailview.h"
- #include
-
- EmailView::EmailView(QWidget *parent) :
- QDialog(parent),
- ui(new Ui::EmailView)
- {
- ui->setupUi(this);
- initSlots();
- addWindowBtns();
- ui->pushButtonSend->setIcon(QIcon(":/images/send.png"));
- ui->pushButtonCancel->setIcon(QIcon(":/images/cancel.png"));
- }
-
- EmailView::~EmailView()
- {
- delete ui;
- }
-
- void EmailView::initParams(QString emailServer, QString emailPort, bool usessl, QString sender, QString pswd, QString nickName, QMap
nickMap) - {
- m_emailPort = emailPort;
- m_emailServer = emailServer;
- m_emailSender = sender;
- m_emailUseSSL = usessl;
- m_emailPswd = pswd;
-
- ui->lineEditSender->setText(sender);
-
- ui->lineEditEmailServer->setText(emailServer);
- ui->lineEditEmailPort->setText(emailPort);
- ui->lineEditEmailPswd->setText(pswd);
- ui->lineEditNick->setText(nickName);
- ui->checkBoxUseSSL->setChecked(usessl);
- m_email_nickName = nickName;
-
- m_nickMap = nickMap;
- }
-
- void EmailView::addWindowBtns()
- {
- Qt::WindowFlags windowFlag = Qt::Dialog;
- windowFlag |= Qt::WindowMinimizeButtonHint;
- windowFlag |= Qt::WindowMaximizeButtonHint;
- windowFlag |= Qt::WindowCloseButtonHint;
- setWindowFlags(windowFlag);
- }
-
- void EmailView::setUIVisible(bool flag)
- {
- ui->labelEmailPort->setVisible(flag);
- ui->labelEmailPswd->setVisible(flag);
- ui->labelEmailServer->setVisible(flag);
- ui->labelNick->setVisible(flag);
- ui->checkBoxUseSSL->setVisible(flag);
-
- ui->lineEditEmailPort->setVisible(flag);
- ui->lineEditEmailServer->setVisible(flag);
- ui->lineEditEmailPswd->setVisible(flag);
- ui->lineEditNick->setVisible(flag);
- }
-
-
- void EmailView::initUI(QString sender, QString nickName, QString recvier, QString cc, QString subject, QString content, bool isTest)
- {
- ui->lineEditSender->setText(sender);
- ui->lineEditRecvier->setText(recvier);
- ui->lineEditCc->setText(cc);
- ui->textEdit->setPlainText(content);
- if(isTest)
- {
- subject += "【测试邮件】";
- }
- ui->lineEditSubject->setText(subject);
- m_email_nickName = nickName;
-
- m_isPart = true;
- }
-
- void EmailView::initSlots()
- {
- connect(ui->textEdit, &QTextEdit::textChanged, this, &EmailView::onTextEditChanged);
- }
-
- void EmailView::onTextEditChanged()
- {
- ui->textEdit->setToolTip(ui->textEdit->toHtml());
- }
-
-
- void EmailView::on_comboBox_currentTextChanged(const QString &text)
- {
- // 根据不同类别设置文本内容及主题
- if(text=="请假模板")
- {
- ui->textEdit->setHtml("xx,您好!
以下是我的请假申请,请批准!
请假缘由:xxxxx
工作交接:暂无工作交接
请假时间:9:00~12:00(共计3小时)"); - ui->lineEditSubject->setText(QString("开发十三部_XX_请假信息_%1").arg(QDate::currentDate().toString("yyyyMMdd")));
- }
- else if(text=="日常模板")
- {
- ui->textEdit->setHtml("各位领导、同事,大家好!
以下是xxxxxxx,请查收!
"); - ui->lineEditSubject->setText("开发十三部_XXXXXXXXXXXXX");
- }
- else
- {
- ui->textEdit->clear();
- ui->lineEditSubject->clear();
- }
- }
-
-
- void EmailView::on_pushButtonSend_clicked()
- {
- QString server = "";
- QString port = "";
- bool usessl = false;
- QString sender = "";
- QString pswd = "";
-
- if(m_isPart)
- {
- server = m_emailServer;
- port = m_emailPort;
- usessl = m_emailUseSSL;
- sender = m_emailSender;
- pswd = m_emailPswd;
- }
- else
- {
- server = ui->lineEditEmailServer->text();
- port = ui->lineEditEmailPort->text();
- usessl = ui->checkBoxUseSSL->isChecked();
- sender = ui->lineEditSender->text();
- pswd = ui->lineEditEmailPswd->text();
- }
-
- SmtpClient m_smtp(server, port.toInt(), usessl?SmtpClient::SslConnection:SmtpClient::TcpConnection);
- m_smtp.setUser(sender);
- m_smtp.setPassword(pswd);
-
- MimeMessage message;
- if(m_isPart)
- {
- message.setSender(new EmailAddress(ui->lineEditSender->text(), m_email_nickName));
- }
- else
- {
- message.setSender(new EmailAddress(ui->lineEditSender->text(), ui->lineEditNick->text()));
- }
-
-
- //构建邮件标题
- QString subject = ui->lineEditSubject->text();
-
-
- if(!m_smtp.connectToHost())
- {
- QMessageBox::information(this, "warn", "邮件服务连接失败");
- return;
- }
- if(!m_smtp.login())
- {
- QMessageBox::information(this, "warn", "邮件服务登录失败");
- return;
- }
-
-
- if(ui->lineEditRecvier->text().trimmed()!="")
- {
- QStringList recviers = ui->lineEditRecvier->text().split(";");
- for(int i = 0; i< recviers.size(); i++)
- {
- if(m_nickMap.contains(recviers.at(i)))
- {
- message.addRecipient(new EmailAddress(recviers.at(i),m_nickMap.find(recviers.at(i)).value()));
- }
- else
- {
- message.addRecipient(new EmailAddress(recviers.at(i)));
- }
-
- }
- }
-
-
- if(ui->lineEditCc->text().trimmed()!="")
- {
- QStringList ccs = ui->lineEditCc->text().split(";");
- for(int i = 0; i< ccs.size(); i++)
- {
- if(m_nickMap.contains(ccs.at(i)))
- {
- message.addCc(new EmailAddress(ccs.at(i),m_nickMap.find(ccs.at(i)).value()));
- }
- else
- {
- message.addCc(new EmailAddress(ccs.at(i)));
- }
- }
- }
-
-
-
- if(message.getRecipients().size()==0)
- {
- QMessageBox::information(this, "warn", "收件人为空");
- m_smtp.quit();
- return;
- }
-
- message.setSubject(subject);
-
- QString emailHtml = "";
- if(m_isPart)
- {
- emailHtml = ui->textEdit->toPlainText();
- }
- else
- {
- emailHtml = ui->textEdit->toHtml();
- }
-
- //构建邮件正文
- MimeHtml text;
- text.setHtml(emailHtml);
- message.addPart(&text);
-
- if(!m_smtp.sendMail(message))
- {
- m_smtp.quit();
- QMessageBox::information(this, "warn", "邮件发送失败");
- } else{
- m_smtp.quit();
- QMessageBox::information(this, "info", "邮件发送成功");
- }
-
- this->close();
- }
-
-
- void EmailView::on_pushButtonCancel_clicked()
- {
- this->close();
- }
-

SmtpClient
MimeMessage
EmailAddress p1为邮箱地址 p2为昵称
addCc() 添加抄送人 p1为邮箱地址 p2为昵称
addRecipient() 添加收件人 p1为邮箱地址 p2为昵称
sendMail() 发送邮件
再见!