/** * 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 "SettingsSendMail.h" #ifdef SMTP_SUPPORT #include "smtp/SmtpMime" #endif #include "ui/settings/GlobalSettingStation.h" #include "ui_SendMailSettings.h" namespace GpgFrontend::UI { SendMailTab::SendMailTab(QWidget* parent) : QWidget(parent), ui(std::make_shared()) { ui->setupUi(this); connect(ui->enableCheckBox, &QCheckBox::stateChanged, this, [=](int state) { ui->smtpServerAddressEdit->setDisabled(state != Qt::Checked); ui->portSpin->setDisabled(state != Qt::Checked); ui->connextionSecurityComboBox->setDisabled(state != Qt::Checked); ui->identityCheckBox->setDisabled(state != Qt::Checked); ui->usernameEdit->setDisabled(state != Qt::Checked); ui->passwordEdit->setDisabled(state != Qt::Checked); ui->defaultSenderEmailEdit->setDisabled(state != Qt::Checked); ui->checkConnectionButton->setDisabled(state != Qt::Checked); }); #ifdef SMTP_SUPPORT connect(ui->checkConnectionButton, &QPushButton::clicked, this, &SendMailTab::slotCheckConnection); connect(ui->senTestMailButton, &QPushButton::clicked, this, &SendMailTab::slotSendTestMail); #endif connect(ui->identityCheckBox, &QCheckBox::stateChanged, this, [=](int state) { ui->usernameEdit->setDisabled(state != Qt::Checked); ui->passwordEdit->setDisabled(state != Qt::Checked); }); ui->generalGroupBox->setTitle(_("General")); ui->identityGroupBox->setTitle(_("Identity Information")); ui->preferenceGroupBox->setTitle(_("Preference")); ui->operationsGroupBox->setTitle(_("Operations")); ui->enableCheckBox->setText(_("Enable Send Mail Ability")); ui->identityCheckBox->setText(_("Need Auth")); ui->smtpServerAddressLabel->setText(_("SMTP Server Address")); ui->smtpServerPortLabel->setText(_("SMTP Server Port")); ui->connectionSecurityLabel->setText(_("SMTP Connection Security")); ui->usernameLabel->setText(_("Username")); ui->passwordLabel->setText(_("Password")); ui->senderLabel->setText(_("Default Sender Email")); ui->checkConnectionButton->setText(_("Check Connection")); ui->senTestMailButton->setText(_("Send Test Email")); ui->tipsLabel->setText( _("Tips: It is recommended that you build your own mail server or use " "a trusted mail server. If you don't know the detailed configuration " "information, you can get it from the mail service provider.")); ui->senTestMailButton->setDisabled(true); auto* email_validator = new QRegularExpressionValidator(re_email, ui->defaultSenderEmailEdit); ui->defaultSenderEmailEdit->setValidator(email_validator); setSettings(); } void SendMailTab::setSettings() { auto& settings = GlobalSettingStation::GetInstance().GetUISettings(); try { std::string mail_address = settings.lookup("smtp.mail_address"); ui->smtpServerAddressEdit->setText(mail_address.c_str()); } catch (...) { LOG(ERROR) << _("Setting Operation Error") << _("mail_address"); } try { std::string std_username = settings.lookup("smtp.username"); ui->usernameEdit->setText(std_username.c_str()); } catch (...) { LOG(ERROR) << _("Setting Operation Error") << _("username"); } try { std::string std_password = settings.lookup("smtp.password"); ui->passwordEdit->setText(std_password.c_str()); } catch (...) { LOG(ERROR) << _("Setting Operation Error") << _("password"); } try { int port = settings.lookup("smtp.port"); ui->portSpin->setValue(port); } catch (...) { LOG(ERROR) << _("Setting Operation Error") << _("port"); } ui->connextionSecurityComboBox->setCurrentText("None"); try { std::string connection_type = settings.lookup("smtp.connection_type"); ui->connextionSecurityComboBox->setCurrentText(connection_type.c_str()); } catch (...) { LOG(ERROR) << _("Setting Operation Error") << _("connection_type"); } try { std::string default_sender = settings.lookup("smtp.default_sender"); ui->defaultSenderEmailEdit->setText(default_sender.c_str()); } catch (...) { LOG(ERROR) << _("Setting Operation Error") << _("default_sender"); } ui->identityCheckBox->setCheckState(Qt::Unchecked); try { bool identity_enable = settings.lookup("smtp.identity_enable"); if (identity_enable) ui->identityCheckBox->setCheckState(Qt::Checked); else ui->identityCheckBox->setCheckState(Qt::Unchecked); } catch (...) { LOG(ERROR) << _("Setting Operation Error") << _("identity_enable"); } ui->enableCheckBox->setCheckState(Qt::Unchecked); try { bool smtp_enable = settings.lookup("smtp.enable"); if (smtp_enable) ui->enableCheckBox->setCheckState(Qt::Checked); else ui->enableCheckBox->setCheckState(Qt::Unchecked); } catch (...) { LOG(ERROR) << _("Setting Operation Error") << _("save_key_checked"); } } void SendMailTab::applySettings() { auto& settings = GpgFrontend::UI::GlobalSettingStation::GetInstance().GetUISettings(); if (!settings.exists("smtp") || settings.lookup("smtp").getType() != libconfig::Setting::TypeGroup) settings.add("smtp", libconfig::Setting::TypeGroup); auto& smtp = settings["smtp"]; if (!smtp.exists("mail_address")) smtp.add("mail_address", libconfig::Setting::TypeString) = ui->smtpServerAddressEdit->text().toStdString(); else { smtp["mail_address"] = ui->smtpServerAddressEdit->text().toStdString(); } if (!smtp.exists("username")) smtp.add("username", libconfig::Setting::TypeString) = ui->usernameEdit->text().toStdString(); else { smtp["username"] = ui->usernameEdit->text().toStdString(); } if (!smtp.exists("password")) smtp.add("password", libconfig::Setting::TypeString) = ui->passwordEdit->text().toStdString(); else { smtp["password"] = ui->passwordEdit->text().toStdString(); } if (!smtp.exists("port")) smtp.add("port", libconfig::Setting::TypeInt) = ui->portSpin->value(); else { smtp["port"] = ui->portSpin->value(); } if (!smtp.exists("connection_type")) smtp.add("connection_type", libconfig::Setting::TypeString) = ui->connextionSecurityComboBox->currentText().toStdString(); else { smtp["connection_type"] = ui->connextionSecurityComboBox->currentText().toStdString(); } if (!smtp.exists("default_sender")) smtp.add("default_sender", libconfig::Setting::TypeString) = ui->defaultSenderEmailEdit->text().toStdString(); else { smtp["default_sender"] = ui->defaultSenderEmailEdit->text().toStdString(); } if (!smtp.exists("identity_enable")) smtp.add("identity_enable", libconfig::Setting::TypeBoolean) = ui->identityCheckBox->isChecked(); else { smtp["identity_enable"] = ui->identityCheckBox->isChecked(); } if (!smtp.exists("enable")) smtp.add("enable", libconfig::Setting::TypeBoolean) = ui->enableCheckBox->isChecked(); else { smtp["enable"] = ui->enableCheckBox->isChecked(); } } #ifdef SMTP_SUPPORT void SendMailTab::slotCheckConnection() { SmtpClient::ConnectionType connectionType; const auto selectedConnType = ui->connextionSecurityComboBox->currentText(); if (selectedConnType == "SSL") { connectionType = SmtpClient::ConnectionType::SslConnection; } else if (selectedConnType == "TLS" || selectedConnType == "STARTTLS") { connectionType = SmtpClient::ConnectionType::TlsConnection; } else { connectionType = SmtpClient::ConnectionType::TcpConnection; } SmtpClient smtp(ui->smtpServerAddressEdit->text(), ui->portSpin->value(), connectionType); if (ui->identityCheckBox->isChecked()) { smtp.setUser(ui->usernameEdit->text()); smtp.setPassword(ui->passwordEdit->text()); } if (!smtp.connectToHost()) { QMessageBox::critical(this, _("Fail"), _("Fail to Connect SMTP Server")); ui->senTestMailButton->setDisabled(true); return; } if (!smtp.login()) { QMessageBox::critical(this, _("Fail"), _("Fail to Login")); ui->senTestMailButton->setDisabled(true); return; } QMessageBox::information(this, _("Success"), _("Succeed in connecting and login")); ui->senTestMailButton->setDisabled(false); } #endif #ifdef SMTP_SUPPORT void SendMailTab::slotSendTestMail() { if (ui->defaultSenderEmailEdit->text().isEmpty()) { QMessageBox::critical(this, _("Fail"), _("Given a default sender first")); return; } SmtpClient::ConnectionType connectionType; const auto selectedConnType = ui->connextionSecurityComboBox->currentText(); if (selectedConnType == "SSL") { connectionType = SmtpClient::ConnectionType::SslConnection; } else if (selectedConnType == "TLS" || selectedConnType == "STARTTLS") { connectionType = SmtpClient::ConnectionType::TlsConnection; } else { connectionType = SmtpClient::ConnectionType::TcpConnection; } SmtpClient smtp(ui->smtpServerAddressEdit->text(), ui->portSpin->value(), connectionType); if (ui->identityCheckBox->isChecked()) { smtp.setUser(ui->usernameEdit->text()); smtp.setPassword(ui->passwordEdit->text()); } MimeMessage message; auto sender_address = ui->defaultSenderEmailEdit->text(); message.setSender(new EmailAddress(sender_address)); message.addRecipient(new EmailAddress(sender_address)); message.setSubject(_("Test Email from GpgFrontend")); MimeText text; text.setText(_("Hello, this is a test email from GpgFrontend.")); // Now add it to the mail message.addPart(&text); // Now we can send the mail if (!smtp.connectToHost()) { LOG(INFO) << "Connect to SMTP Server Failed"; QMessageBox::critical(this, _("Fail"), _("Fail to Connect SMTP Server")); ui->senTestMailButton->setDisabled(true); return; } if (!smtp.login()) { LOG(INFO) << "Login to SMTP Server Failed"; QMessageBox::critical(this, _("Fail"), _("Fail to Login into SMTP Server")); ui->senTestMailButton->setDisabled(true); return; } if (!smtp.sendMail(message)) { LOG(INFO) << "Send Mail to SMTP Server Failed"; QMessageBox::critical( this, _("Fail"), _("Fail to send a test email to the SMTP Server, please " "recheck your configuration.")); ui->senTestMailButton->setDisabled(true); return; } smtp.quit(); // Close after sending email QMessageBox::information( this, _("Success"), _("Succeed in sending a test email to the SMTP Server")); } #endif } // namespace GpgFrontend::UI