From 3c43330dddcd71c3251a55d5211edf506d3ec767 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Wed, 15 Aug 2018 13:19:20 +0200 Subject: Fix smtps over port 465 465 is for tls only 587 is for plain with upgrade via starttls curl recognizes tls by a smtps:// protocol, for start tls we must start with smtp:// but set the flag to upgrade. --- examples/mailtransportresource/mailtransport.cpp | 22 ++++++++++++++++------ examples/mailtransportresource/mailtransport.h | 3 ++- .../mailtransportresource.cpp | 6 +++++- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/examples/mailtransportresource/mailtransport.cpp b/examples/mailtransportresource/mailtransport.cpp index ce24d7f..c455b7c 100644 --- a/examples/mailtransportresource/mailtransport.cpp +++ b/examples/mailtransportresource/mailtransport.cpp @@ -83,7 +83,7 @@ CurlVersionInfo getVersionInfo() bool sendMessageCurl(const char *to[], int numTos, const char *cc[], int numCcs, const char *msg, - bool useTls, + bool useStarttls, const char* from, const char *username, const char *password, const char *server, bool verifyPeer, const QByteArray &cacert, QByteArray &errorMessage, @@ -107,7 +107,7 @@ bool sendMessageCurl(const char *to[], int numTos, curl_easy_setopt(curl, CURLOPT_URL, server); - if (useTls) { + if (useStarttls) { curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL); } @@ -186,6 +186,7 @@ MailTransport::SendResult MailTransport::sendMessage(const KMime::Message::Ptr & ccList << mb.address(); } const bool verifyPeer = options.testFlag(VerifyPeers); + const bool useStarttls = options.testFlag(UseStarttls); const bool useTls = options.testFlag(UseTls); const int numTos = toList.size(); @@ -199,12 +200,21 @@ MailTransport::SendResult MailTransport::sendMessage(const KMime::Message::Ptr & for (int i = 0; i < numCcs; i++) { cc[i] = ccList.at(i); } - //Because curl will fail with smtps, but it won't tell you why. auto serverAddress = server; - serverAddress.replace("smtps://", "smtp://"); + if (serverAddress.startsWith("smtps://")) { + serverAddress = serverAddress.mid(8); + } + if (serverAddress.startsWith("smtp://")) { + serverAddress = serverAddress.mid(7); + } + if (useStarttls) { + serverAddress = "smtp://" + serverAddress; + } else if (useTls) { + serverAddress = "smtps://" + serverAddress; + } const auto versionInfo = getVersionInfo(); - if (useTls && !versionInfo.supportsSsl) { + if ((useTls || useStarttls) && !versionInfo.supportsSsl) { qCWarning(mailtransportCategory) << "libcurl built without ssl support: " << versionInfo.info; } @@ -212,7 +222,7 @@ MailTransport::SendResult MailTransport::sendMessage(const KMime::Message::Ptr & QByteArray errorMessage; auto ret = sendMessageCurl(to, numTos, cc, numCcs, message->encodedContent(), - useTls, + useStarttls, from.isEmpty() ? nullptr : from, username, password, serverAddress, verifyPeer, cacert, diff --git a/examples/mailtransportresource/mailtransport.h b/examples/mailtransportresource/mailtransport.h index 0fa5a66..0f53c2b 100644 --- a/examples/mailtransportresource/mailtransport.h +++ b/examples/mailtransportresource/mailtransport.h @@ -27,7 +27,8 @@ namespace MailTransport { enum Option { UseTls = 1, - VerifyPeers = 2 + UseStarttls = 2, + VerifyPeers = 4 }; Q_DECLARE_FLAGS(Options, Option); diff --git a/examples/mailtransportresource/mailtransportresource.cpp b/examples/mailtransportresource/mailtransportresource.cpp index 10d94bc..9163d3b 100644 --- a/examples/mailtransportresource/mailtransportresource.cpp +++ b/examples/mailtransportresource/mailtransportresource.cpp @@ -127,7 +127,11 @@ public: } else { MailTransport::Options options; if (settings.server.contains("smtps")) { - options |= MailTransport::UseTls; + if (settings.server.contains("465")) { + options |= MailTransport::UseTls; + } else { + options |= MailTransport::UseStarttls; + } } SinkLog() << "Sending message " << settings.server << settings.username << "CaCert: " << settings.cacert << "Using tls: " << bool(options & MailTransport::UseTls); -- cgit v1.2.3