From 1b5dc7f3744270e45f1c24c4c2a75e9bb25798e8 Mon Sep 17 00:00:00 2001 From: Daniel Nicoletti Date: Fri, 29 Dec 2023 13:41:52 -0300 Subject: [PATCH] Proper error handlying like when auth fails --- .gitignore | 1 + demos/demo2/sendemail.cpp | 9 +++++---- src/server.cpp | 27 +++++++++++++++++++++------ src/server_p.h | 1 + 4 files changed, 28 insertions(+), 10 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a5309e6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +build*/ diff --git a/demos/demo2/sendemail.cpp b/demos/demo2/sendemail.cpp index a8fbb0e..bd8bb2a 100644 --- a/demos/demo2/sendemail.cpp +++ b/demos/demo2/sendemail.cpp @@ -19,6 +19,7 @@ #include #include +#include #include #include "server.h" @@ -66,10 +67,7 @@ void SendEmail::on_sendEmail_clicked() message.addTo(to); } - auto content = std::make_shared(); - content->setHtml(ui->texteditor->toHtml()); - - message.addPart(content); + message.addPart(std::make_shared(ui->texteditor->toHtml())); for (int i = 0; i < ui->attachments->count(); ++i) { message.addPart(std::make_shared(std::make_shared(ui->attachments->item(i)->text()))); @@ -105,6 +103,9 @@ void SendEmail::sendMailAsync(const MimeMessage &msg) if (!server) { server = new Server(this); + connect(server, &Server::sslErrors, this, [](const QList &errors) { + qDebug() << "Server SSL errors" << errors.size(); + }); server->setHost(host); server->setPort(port); server->setConnectionType(ct); diff --git a/src/server.cpp b/src/server.cpp index ce140af..b1fb657 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -574,14 +574,12 @@ bool ServerPrivate::parseResponseCode(int expectedCode, Server::SmtpError defaul const int responseCode = responseText.left(3).toInt(); if (responseCode / 100 == 4) { - // lastError = QString::fromLatin1(responseText); - Q_EMIT q->smtpError(Server::ServerError, QString::fromLatin1(responseText)); + failConnection(Server::ServerError, responseCode, QString::fromLatin1(responseText)); return false; } if (responseCode / 100 == 5) { - // lastError = QString::fromLatin1(responseText); - Q_EMIT q->smtpError(Server::ClientError, QString::fromLatin1(responseText)); + failConnection(Server::ClientError, responseCode, QString::fromLatin1(responseText)); return false; } @@ -589,7 +587,7 @@ bool ServerPrivate::parseResponseCode(int expectedCode, Server::SmtpError defaul if (responseCode != expectedCode) { const QString lastError = QString::fromLatin1(responseText); qCWarning(SIMPLEMAIL_SERVER) << "Unexpected server response" << lastError << expectedCode; - Q_EMIT q->smtpError(defaultError, lastError); + failConnection(defaultError, responseCode, lastError); return false; } if (responseMessage) { @@ -600,7 +598,7 @@ bool ServerPrivate::parseResponseCode(int expectedCode, Server::SmtpError defaul const QString lastError = QString::fromLatin1(responseText); qCWarning(SIMPLEMAIL_SERVER) << "Unexpected server response" << lastError << expectedCode; - Q_EMIT q->smtpError(defaultError, lastError); + failConnection(defaultError, responseCode, lastError); return false; } @@ -678,4 +676,21 @@ void ServerPrivate::commandQuit() socket->write(QByteArrayLiteral("QUIT\r\n")); } +void ServerPrivate::failConnection(Server::SmtpError defaultError, int responseCode, const QString &error) +{ + Q_Q(Server); + + qCDebug(SIMPLEMAIL_SERVER) << "failConnection" << defaultError << responseCode << error; + // Call this when the connection should be closed due an error + for (auto &mail : queue) { + ServerReply *reply = mail.reply; + reply->finish(true, responseCode, error); + } + queue.clear(); + + socket->close(); + + Q_EMIT q->smtpError(defaultError, error); +} + #include "moc_server.cpp" diff --git a/src/server_p.h b/src/server_p.h index 6b1dcb1..aa8143a 100644 --- a/src/server_p.h +++ b/src/server_p.h @@ -78,6 +78,7 @@ class ServerPrivate inline void commandReset(); inline void commandNoop(); inline void commandQuit(); + void failConnection(Server::SmtpError defaultError, int responseCode, const QString &error); QList queue; Server *q_ptr;