Не отправляется файл по SMTP-протоколу на Qt

Рейтинг: 0Ответов: 0Опубликовано: 22.03.2023

Всем привет! Проблема в том, что никак не могу отправить файл 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();

    
}

Ответы

Ответов пока нет.