/**
* This file is part of GpgFrontend.
*
* GpgFrontend is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Foobar is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Foobar. If not, see .
*
* The initial version of the source code is inherited from gpg4usb-team.
* Their source code version also complies with GNU General Public License.
*
* The source code version of this software was modified and released
* by Saturneric starting on May 12, 2021.
*
*/
#include "SendMailDialog.h"
#include
#include "ui_SendMailDialog.h"
#ifdef SMTP_SUPPORT
#include "smtp/SmtpMime"
#include "ui/settings/GlobalSettingStation.h"
#endif
namespace GpgFrontend::UI {
SendMailDialog::SendMailDialog(const QString& text, QWidget* parent)
: QDialog(parent), ui(std::make_shared()) {
// read from settings
initSettings();
if (smtpAddress.isEmpty()) {
QMessageBox::critical(
this, _("Incomplete configuration"),
_("The SMTP address is empty, please go to the setting interface to "
"complete the configuration."));
deleteLater();
return;
}
ui->setupUi(this);
ui->ccInputWidget->setHidden(true);
ui->bccInputWidget->setHidden(true);
ui->textEdit->setText(text);
ui->errorLabel->setHidden(true);
ui->senderEdit->setText(defaultSender);
connect(ui->ccButton, &QPushButton::clicked, [=]() {
ui->ccInputWidget->setHidden(!ui->ccInputWidget->isHidden());
ui->ccEdit->clear();
});
connect(ui->bccButton, &QPushButton::clicked, [=]() {
ui->bccInputWidget->setHidden(!ui->bccInputWidget->isHidden());
ui->bccEdit->clear();
});
#ifdef SMTP_SUPPORT
connect(ui->sendMailButton, &QPushButton::clicked, this,
&SendMailDialog::slotConfirm);
#endif
ui->ccButton->setText(_("CC"));
ui->bccButton->setText(_("BCC"));
ui->senderLabel->setText(_("Sender"));
ui->recipientLabel->setText(_("Recipient"));
ui->subjectLabel->setText(_("Mail Subject"));
ui->bccLabel->setText(_("BCC"));
ui->ccLabel->setText(_("CC"));
ui->tipsLabel->setText(
_("Tips: You can fill in multiple email addresses, please separate them "
"with \";\"."));
ui->sendMailButton->setText(_("Send Mail"));
this->setWindowTitle(_("Send Mail"));
this->setAttribute(Qt::WA_DeleteOnClose);
}
bool SendMailDialog::check_email_address(const QString& str) {
return re_email.match(str).hasMatch();
}
#ifdef SMTP_SUPPORT
void SendMailDialog::slotConfirm() {
QString errString;
ui->errorLabel->clear();
ui->errorLabel->setHidden(true);
QStringList rcpt_string_list = ui->recipientEdit->text().split(';');
QStringList cc_string_list = ui->ccEdit->text().split(';');
QStringList bcc_string_list = ui->bccEdit->text().split(';');
if (rcpt_string_list.isEmpty()) {
errString.append(QString(" ") + _("Recipient cannot be empty") + " \n");
} else {
for (const auto& reci : rcpt_string_list) {
LOG(INFO) << "Receiver" << reci.trimmed().toStdString();
if (!check_email_address(reci.trimmed())) {
errString.append(QString(" ") +
_("One or more recipient's email is invalid") +
" \n");
break;
}
}
}
if (ui->senderEdit->text().isEmpty()) {
errString.append(QString(" ") + _("Sender cannot be empty") + " \n");
} else if (!check_email_address(ui->senderEdit->text())) {
errString.append(QString(" ") + _("Sender's email is invalid") + " \n");
}
if (ui->subjectEdit->text().isEmpty()) {
errString.append(QString(" ") + _("Subject cannot be empty") + " \n");
}
if (!ui->ccEdit->text().isEmpty())
for (const auto& cc : cc_string_list) {
LOG(INFO) << "cc" << cc.trimmed().toStdString();
if (!check_email_address(cc.trimmed())) {
errString.append(QString(" ") + _("One or more cc email is invalid") +
" \n");
break;
}
}
if (!ui->bccEdit->text().isEmpty())
for (const auto& bcc : bcc_string_list) {
LOG(INFO) << "bcc" << bcc.trimmed().toStdString();
if (!check_email_address(bcc.trimmed())) {
errString.append(QString(" ") + _("One or more bcc email is invalid") +
" \n");
break;
}
}
if (!errString.isEmpty()) {
ui->errorLabel->setAutoFillBackground(true);
QPalette error = ui->errorLabel->palette();
error.setColor(QPalette::Window, "#ff8080");
ui->errorLabel->setPalette(error);
ui->errorLabel->setText(errString);
ui->errorLabel->setHidden(false);
return;
}
SmtpClient::ConnectionType connectionType =
SmtpClient::ConnectionType::TcpConnection;
if (connectionTypeSettings == "SSL") {
connectionType = SmtpClient::ConnectionType::SslConnection;
} else if (connectionTypeSettings == "TLS") {
connectionType = SmtpClient::ConnectionType::TlsConnection;
} else if (connectionTypeSettings == "STARTTLS") {
connectionType = SmtpClient::ConnectionType::TlsConnection;
} else {
connectionType = SmtpClient::ConnectionType::TcpConnection;
}
SmtpClient smtp(smtpAddress, port, connectionType);
// We need to set the username (your email address) and the password
// for smtp authentification.
smtp.setUser(username);
smtp.setPassword(password);
// Now we create a MimeMessage object. This will be the email.
MimeMessage message;
message.setSender(new EmailAddress(ui->senderEdit->text()));
for (const auto& reci : rcpt_string_list) {
if (!reci.isEmpty()) message.addRecipient(new EmailAddress(reci.trimmed()));
}
for (const auto& cc : cc_string_list) {
if (!cc.isEmpty()) message.addCc(new EmailAddress(cc.trimmed()));
}
for (const auto& bcc : cc_string_list) {
if (!bcc.isEmpty()) message.addBcc(new EmailAddress(bcc.trimmed()));
}
message.setSubject(ui->subjectEdit->text());
// Now add some text to the email.
// First we create a MimeText object.
MimeText text;
text.setText(ui->textEdit->toPlainText());
// Now add it to the mail
message.addPart(&text);
// Now we can send the mail
if (!smtp.connectToHost()) {
qDebug() << "Connect to SMTP Server Failed";
QMessageBox::critical(this, _("Fail"), _("Fail to Connect SMTP Server"));
return;
}
if (!smtp.login()) {
qDebug() << "Login to SMTP Server Failed";
QMessageBox::critical(this, _("Fail"), _("Fail to Login into SMTP Server"));
return;
}
if (!smtp.sendMail(message)) {
qDebug() << "Send Mail to SMTP Server Failed";
QMessageBox::critical(this, _("Fail"),
_("Fail to Send Mail to SMTP Server"));
return;
}
smtp.quit();
// Close after sending email
QMessageBox::information(this, _("Success"),
_("Succeed in Sending Mail to SMTP Server"));
deleteLater();
}
void SendMailDialog::initSettings() {
auto& settings = GlobalSettingStation::GetInstance().GetUISettings();
try {
ability_enable = settings.lookup("smtp.enable");
} catch (...) {
LOG(ERROR) << _("Setting Operation Error") << _("save_key_checked");
}
try {
identity_enable = settings.lookup("smtp.identity_enable");
} catch (...) {
LOG(ERROR) << _("Setting Operation Error") << _("identity_enable");
}
try {
smtpAddress = settings.lookup("smtp.mail_address").c_str();
} catch (...) {
LOG(ERROR) << _("Setting Operation Error") << _("mail_address");
}
try {
username = settings.lookup("smtp.username").c_str();
} catch (...) {
LOG(ERROR) << _("Setting Operation Error") << _("username");
}
try {
password = settings.lookup("smtp.password").c_str();
} catch (...) {
LOG(ERROR) << _("Setting Operation Error") << _("password");
}
try {
port = settings.lookup("smtp.port");
} catch (...) {
LOG(ERROR) << _("Setting Operation Error") << _("port");
}
try {
connectionTypeSettings = settings.lookup("smtp.connection_type").c_str();
} catch (...) {
LOG(ERROR) << _("Setting Operation Error") << _("connection_type");
}
try {
defaultSender = settings.lookup("smtp.default_sender").c_str();
} catch (...) {
LOG(ERROR) << _("Setting Operation Error") << _("default_sender");
}
}
#endif
} // namespace GpgFrontend::UI