From fb849596bcc70844ad5c10e57da768fff324863d Mon Sep 17 00:00:00 2001 From: LangeSebastian Date: Fri, 31 Jan 2025 13:55:11 +0100 Subject: [PATCH] Added multiline support in mailserver response (220-/250-) Signed-off-by: LangeSebastian --- src/server.cpp | 68 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 41 insertions(+), 27 deletions(-) diff --git a/src/server.cpp b/src/server.cpp index 2a88ca6..126408f 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -577,40 +577,54 @@ bool ServerPrivate::parseResponseCode(int expectedCode, Server::SmtpError defaultError, QByteArray *responseMessage) { - // Save the server's response - const QByteArray responseText = socket->readLine().trimmed(); - qCDebug(SIMPLEMAIL_SERVER) << "Got response" << responseText << "expected" << expectedCode; + while (socket->canReadLine()) { + // Save the server's response + const QByteArray responseText = socket->readLine().trimmed(); + qCDebug(SIMPLEMAIL_SERVER) << "Got response" << responseText << "expected" << expectedCode; - // Extract the respose code from the server's responce (first 3 digits) - const int responseCode = responseText.left(3).toInt(); + // Extract the respose code from the server's responce (first 3 digits) + const int responseCode = responseText.left(3).toInt(); - if (responseCode / 100 == 4) { - failConnection(Server::ServerError, responseCode, QString::fromLatin1(responseText)); - return false; - } - - if (responseCode / 100 == 5) { - failConnection(Server::ClientError, responseCode, QString::fromLatin1(responseText)); - return false; - } + if (responseCode / 100 == 4) { + failConnection(Server::ServerError, responseCode, QString::fromLatin1(responseText)); + return false; + } - if (responseText[3] == ' ') { - if (responseCode != expectedCode) { - const QString lastError = QString::fromLatin1(responseText); - qCWarning(SIMPLEMAIL_SERVER) - << "Unexpected server response" << lastError << expectedCode; - failConnection(defaultError, responseCode, lastError); + if (responseCode / 100 == 5) { + failConnection(Server::ClientError, responseCode, QString::fromLatin1(responseText)); return false; } - if (responseMessage) { - *responseMessage = responseText.mid(4); + + if (responseText[3] == '-') { + if (responseCode != expectedCode) { + const QString lastError = QString::fromLatin1(responseText); + qCWarning(SIMPLEMAIL_SERVER) + << "Unexpected server response" << lastError << expectedCode; + failConnection(defaultError, responseCode, lastError); + return false; + } + continue; + } + + if (responseText[3] == ' ') { + if (responseCode != expectedCode) { + const QString lastError = QString::fromLatin1(responseText); + qCWarning(SIMPLEMAIL_SERVER) + << "Unexpected server response" << lastError << expectedCode; + failConnection(defaultError, responseCode, lastError); + return false; + } + if (responseMessage) { + *responseMessage = responseText.mid(4); + } + return true; } - return true; - } - const QString lastError = QString::fromLatin1(responseText); - qCWarning(SIMPLEMAIL_SERVER) << "Unexpected server response" << lastError << expectedCode; - failConnection(defaultError, responseCode, lastError); + const QString lastError = QString::fromLatin1(responseText); + qCWarning(SIMPLEMAIL_SERVER) << "Unexpected server response" << lastError << expectedCode; + failConnection(defaultError, responseCode, lastError); + return false; + } return false; }