Не отправляется файл по SMTP-протоколу на Qt
Всем привет! Проблема в том, что никак не могу отправить файл Excel по SMTP-протоколу. Помогите пожалуйста, а то сил вообще уже не осталось. Буду очень благодарен
Код работает везде, кроме отправки файла
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->btn_transFile, &QPushButton::clicked, this, &MainWindow::connectAndSendMsg);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::connectAndSendMsg()
{
if(ui->lEdit_addrFrom->text().isEmpty()) {
QMessageBox::warning(this, tr("info"), tr("Получатель не введён"), QMessageBox::Ok);
return;
}
QByteArray fileData;
QString fileName = QFileDialog::getOpenFileName(this, "Excel документ", QDir::homePath(), QString("Excel *xlsx"));
QFile file(fileName);
if(!file.open(QIODevice::ReadOnly)) {
QMessageBox::warning(this, tr("info"), tr("Ошибка открытия файла: ") + file.errorString(), QMessageBox::Ok);
return;
} else {
fileData = file.readAll();
file.close();
}
QMimeDatabase db;
QMimeType mime = db.mimeTypeForFile(fileName);
if(!mime.isValid()) {
QMessageBox::warning(this, tr("info"), tr("Ошибка валидности файла: ") + fileName, QMessageBox::Ok);
return;
}
if(mime.name() != "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") {
QMessageBox::warning(this, tr("info"), tr("Неверный формат файла"), QMessageBox::Ok);
return;
}
// Настройки SMTP-сервера
const QString smtpServer = "mail.adm.tools";
const int smtpPort = 465;
const QString username = "ВАШ_МЭИЛ";
const QString password = "ВАШ_ПАРОЛЬ";
// Адрес отправителя и получателя
const QString from = "ВАШ_МЭИЛ";
const QString to = ui->lEdit_addrFrom->text(); //ПОЧТА КОМУ ОТПРАВЛЯТЬ ФАЙЛ
// Сообщение
QString subject = dateTime;
const QString body = "Тестовое сообщение проверки даты и времени";
// Создание SSL-сокета
QSslSocket socket;
socket.setProtocol(QSsl::TlsV1_2);
socket.setPeerVerifyMode(QSslSocket::VerifyNone);
socket.connectToHostEncrypted(smtpServer, smtpPort);
if (!socket.waitForConnected()) {
qDebug() << "Ошибка подключения к SMTP-сервера";
return;
}
// Чтение ответа от сервера
if (!socket.waitForReadyRead()) {
qDebug() << "Ошибка чтения ответа SMTP-сервера [ПОДКЛЮЧЕНИЕ]";
return;
}
QString response = QString::fromUtf8(socket.readAll());
qDebug() << response;
// Отправка команды EHLO
socket.write("EHLO localhost\r\n");
if (!socket.waitForBytesWritten()) {
qDebug() << "Ошибка отправки команды EHLO на SMTP-сервера";
return;
}
if (!socket.waitForReadyRead()) {
qDebug() << "Ошибка чтения команды EHLO с SMTP-сервера";
return;
}
response = QString::fromUtf8(socket.readAll());
qDebug() << response;
// Аутентификация на SMTP-сервере
socket.write("AUTH LOGIN\r\n");
if (!socket.waitForBytesWritten()) {
qDebug() << "Ошибка отправки команды AUTH LOGIN на SMTP-сервер";
return;
}
if (!socket.waitForReadyRead()) {
qDebug() << "Ошибка чтения команды AUTH LOGIN с SMTP-сервера";
return;
}
response = QString::fromUtf8(socket.readAll());
qDebug() << response;
// Отправка имени пользователя
QByteArray usernameBase64 = username.toUtf8().toBase64();
socket.write(usernameBase64 + "\r\n");
if (!socket.waitForBytesWritten()) {
qDebug() << "Ошибка отправки команды USERNAME на SMTP-сервер";
return;
}
if (!socket.waitForReadyRead()) {
qDebug() << "Ошибка чтения команды USERNAME с SMTP-сервера";
return;
}
response = QString::fromUtf8(socket.readAll());
qDebug() << response;
// Отправка пароля
QByteArray passwordBase64 = password.toUtf8().toBase64();
socket.write(passwordBase64 + "\r\n");
if (!socket.waitForBytesWritten()) {
qDebug() << "Ошибка отправки команды PASSWORD на SMTP-сервер";
return;
}
if (!socket.waitForReadyRead()) {
qDebug() << "Ошибка чтения команды PASSWORD с SMTP-сервера";
return;
}
response = QString::fromUtf8(socket.readAll());
qDebug() << response;
// Отправка команды MAIL FROM
socket.write(QString("MAIL FROM:<%1>\r\n").arg(from).toUtf8());
if (!socket.waitForBytesWritten()) {
qDebug() << "Ошибка отправки команды MAIL FROM на SMTP-сервер";
return;
}
if (!socket.waitForReadyRead()) {
qDebug() << "Ошибка чтения команды MAIL FROM с SMTP-сервера";
return;
}
response = QString::fromUtf8(socket.readAll());
qDebug() << response;
// Отправка команды RCPT TO
socket.write(QString("RCPT TO:<%1>\r\n").arg(to).toUtf8());
if (!socket.waitForBytesWritten()) {
qDebug() << "Ошибка отправки команды RCPT TO на SMTP-сервер";
return;
}
if (!socket.waitForReadyRead()) {
qDebug() << "Ошибка чтения команды RCPT TO с SMTP-сервера";
return;
}
response = QString::fromUtf8(socket.readAll());
qDebug() << response;
// Отправка команды DATA
socket.write("DATA\r\n");
if (!socket.waitForBytesWritten()) {
qDebug() << "Ошибка отправки команды DATA на SMTP-сервер";
return;
}
if (!socket.waitForReadyRead()) {
qDebug() << "Ошибка чтения команды DATA с SMTP-сервера";
return;
}
response = QString::fromUtf8(socket.readAll());
qDebug() << response;
// Отправка сообщения
//QTextStream message(&socket);
//message << "From: " << from << "\r\n";
//message << "To: " << to << "\r\n";
//message << "Subject: " << subject << "\r\n";
//message << "\r\n";
//message << body << "\r\n.\r\n";
//message.flush();
//====================================================================================
QByteArray boundary = "boundary_12345";
QByteArray messageData;
messageData.append("From: <ОТ_КОГО_ПИСЬМО>\r\n");
messageData.append(QString("To: <%1>\r\n").arg(ui->lEdit_addrFrom->text()).toUtf8());
messageData.append(QString("Subject: %1\r\n").arg(subject).toUtf8());
messageData.append("\r\n");
messageData.append(QString(body).toUtf8() + "\r\n.\r\n");
messageData.append(QString("Content-Type: multipart/mixed; boundary=%1\r\n").arg(boundary).toUtf8());
messageData.append("\r\n");
messageData.append(QString("--%1\r\n").arg(boundary).toUtf8());
messageData.append("Content-Type: text/plain\r\n");
messageData.append("\r\n");
messageData.append(body.toUtf8());
messageData.append("\r\n");
messageData.append(QString("--%1\r\n").arg(boundary).toUtf8());
messageData.append(QString("Content-Disposition: attachment; filename=\"%1\"\r\n").arg(QFileInfo(fileName).fileName()).toUtf8());
messageData.append(QString("Content-Type: %1\r\n").arg(mime.name()).toUtf8());
messageData.append("Content-Transfer-Encoding: base64\r\n");
messageData.append("\r\n");
messageData.append(fileData.toBase64());
messageData.append("\r\n");
messageData.append(QString("--%1--\r\n").arg(boundary).toUtf8());
socket.write(messageData);
socket.flush();
//====================================================================================
if (!socket.waitForBytesWritten()) {
qDebug() << "Ошибка отправки команды MESSAGE на SMTP-сервер";
return;
}
if (!socket.waitForReadyRead()) {
qDebug() << "Ошибка чтения команды MESSAGE с SMTP-сервера";
return;
}
response = QString::fromUtf8(socket.readAll());
qDebug() << response;
// Отправка команды QUIT
socket.write("QUIT\r\n");
if (!socket.waitForBytesWritten()) {
qDebug() << "Ошибка отправки команды QUIT на SMTP-сервер";
return;
}
if (!socket.waitForReadyRead()) {
qDebug() << "Ошибка чтения команды QUIT с SMTP-сервера";
return;
}
response = QString::fromUtf8(socket.readAll());
qDebug() << response;
// Закрытие сокета
socket.close();
}
Источник: Stack Overflow на русском