From 890b12ba3b2889dd0d5331534c8c1f22abf4a80b Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Mon, 19 Dec 2016 20:09:30 +0100 Subject: Get mailtransport to work with kolab container. --- examples/mailtransportresource/CMakeLists.txt | 8 +++-- examples/mailtransportresource/mailtransport.cpp | 39 ++++++++++++++++------ examples/mailtransportresource/mailtransport.h | 14 +++++++- .../mailtransportresource.cpp | 7 +++- examples/mailtransportresource/smtptest.cpp | 20 +++++++++++ 5 files changed, 73 insertions(+), 15 deletions(-) create mode 100644 examples/mailtransportresource/smtptest.cpp (limited to 'examples/mailtransportresource') diff --git a/examples/mailtransportresource/CMakeLists.txt b/examples/mailtransportresource/CMakeLists.txt index d16e779..03b89db 100644 --- a/examples/mailtransportresource/CMakeLists.txt +++ b/examples/mailtransportresource/CMakeLists.txt @@ -12,7 +12,11 @@ include_directories(${CURL_INCLUDE_DIRS}) add_library(${PROJECT_NAME} SHARED mailtransportresource.cpp mailtransport.cpp) qt5_use_modules(${PROJECT_NAME} Core Network) target_link_libraries(${PROJECT_NAME} sink KF5::Mime ${CURL_LIBRARIES}) +install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION ${SINK_RESOURCE_PLUGINS_PATH}) -add_subdirectory(tests) +add_executable(sink_smtp_test smtptest.cpp mailtransport.cpp) +qt5_use_modules(sink_smtp_test Core Network) +target_link_libraries(sink_smtp_test sink KF5::Mime ${CURL_LIBRARIES}) +install(TARGETS sink_smtp_test ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}) -install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION ${SINK_RESOURCE_PLUGINS_PATH}) +add_subdirectory(tests) diff --git a/examples/mailtransportresource/mailtransport.cpp b/examples/mailtransportresource/mailtransport.cpp index 4f7e59b..3d56af9 100644 --- a/examples/mailtransportresource/mailtransport.cpp +++ b/examples/mailtransportresource/mailtransport.cpp @@ -21,6 +21,9 @@ #include #include #include +#include + +SINK_DEBUG_AREA("mailtransport") extern "C" { @@ -57,12 +60,18 @@ static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp) return 0; } - -bool sendMessageCurl(const char *to[], int numTos, const char *cc[], int numCcs, const char *msg, bool useTls, const char* from, const char *username, const char *password, const char *server, bool verifyPeer) +static int progress_callback(void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) { - //For ssl use "smtps://mainserver.example.net - const char* cacert = 0; // = "/path/to/certificate.pem"; + if (ultotal > 0) { + auto progress = ulnow * 100.0/ ultotal; + fprintf(stdout, "Upload progress: %d \n", int(progress)); + } + return 0; +} + +bool sendMessageCurl(const char *to[], int numTos, const char *cc[], int numCcs, const char *msg, bool useTls, const char* from, const char *username, const char *password, const char *server, bool verifyPeer, const QByteArray &cacert) +{ CURL *curl; CURLcode res = CURLE_OK; struct curl_slist *recipients = NULL; @@ -86,8 +95,8 @@ bool sendMessageCurl(const char *to[], int numTos, const char *cc[], int numCcs, curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L); } - if (cacert) { - curl_easy_setopt(curl, CURLOPT_CAINFO, cacert); + if (!cacert.isEmpty()) { + curl_easy_setopt(curl, CURLOPT_CAINFO, cacert.constData()); } if (from) { @@ -114,6 +123,13 @@ bool sendMessageCurl(const char *to[], int numTos, const char *cc[], int numCcs, */ curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); + // curl_easy_setopt(curl, CURLOPT_TIMEOUT, 1L); + //Connection timeout of 10s + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10L); + + curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0); + curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, progress_callback); + res = curl_easy_perform(curl); if(res != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", @@ -128,10 +144,11 @@ bool sendMessageCurl(const char *to[], int numTos, const char *cc[], int numCcs, }; -bool MailTransport::sendMessage(const KMime::Message::Ptr &message, const QByteArray &server, const QByteArray &username, const QByteArray &password, const QByteArray &cacert) +bool MailTransport::sendMessage(const KMime::Message::Ptr &message, const QByteArray &server, const QByteArray &username, const QByteArray &password, const QByteArray &cacert, MailTransport::Options options) { QByteArray msg = message->encodedContent(); - qDebug() << "Sending message " << msg; + SinkLog() << "Sending message " << server << username << password << cacert; + SinkTrace() << "Sending message " << msg; QByteArray from(message->from(true)->mailboxes().isEmpty() ? QByteArray() : message->from(true)->mailboxes().first().address()); QList toList; @@ -142,8 +159,8 @@ bool MailTransport::sendMessage(const KMime::Message::Ptr &message, const QByteA for (const auto &mb : message->cc(true)->mailboxes()) { ccList << mb.address(); } - bool useTls = true; - bool verifyPeer = false; + bool verifyPeer = options & VerifyPeers; + bool useTls = options & UseTls; const int numTos = toList.size(); const char* to[numTos]; @@ -157,5 +174,5 @@ bool MailTransport::sendMessage(const KMime::Message::Ptr &message, const QByteA cc[i] = ccList.at(i); } - return sendMessageCurl(to, numTos, cc, numCcs, msg, useTls, from.isEmpty() ? nullptr : from, username, password, server, verifyPeer); + return sendMessageCurl(to, numTos, cc, numCcs, msg, useTls, from.isEmpty() ? nullptr : from, username, password, server, verifyPeer, cacert); } diff --git a/examples/mailtransportresource/mailtransport.h b/examples/mailtransportresource/mailtransport.h index 6cd3452..3ef4a6d 100644 --- a/examples/mailtransportresource/mailtransport.h +++ b/examples/mailtransportresource/mailtransport.h @@ -20,9 +20,21 @@ #pragma once #include +#include #include namespace MailTransport { - bool sendMessage(const KMime::Message::Ptr &message, const QByteArray &server, const QByteArray &username, const QByteArray &password, const QByteArray &cacert); + enum Option { + UseTls, + VerifyPeers + }; + Q_DECLARE_FLAGS(Options, Option); + + /* + * For ssl use "smtps://mainserver.example.net + * @param cacert: "/path/to/certificate.pem"; + */ + bool sendMessage(const KMime::Message::Ptr &message, const QByteArray &server, const QByteArray &username, const QByteArray &password, const QByteArray &cacert, Options flags); }; +Q_DECLARE_OPERATORS_FOR_FLAGS(MailTransport::Options) diff --git a/examples/mailtransportresource/mailtransportresource.cpp b/examples/mailtransportresource/mailtransportresource.cpp index cf657f3..e475139 100644 --- a/examples/mailtransportresource/mailtransportresource.cpp +++ b/examples/mailtransportresource/mailtransportresource.cpp @@ -70,7 +70,11 @@ public: f.write("foo"); f.close(); } else { - if (MailTransport::sendMessage(msg, settings.server.toUtf8(), settings.username.toUtf8(), settings.password.toUtf8(), settings.cacert.toUtf8())) { + MailTransport::Options options; + if (settings.server.contains("smtps")) { + options &= MailTransport::UseTls; + } + if (MailTransport::sendMessage(msg, settings.server.toUtf8(), settings.username.toUtf8(), settings.password.toUtf8(), settings.cacert.toUtf8(), options)) { SinkLog() << "Sent message successfully"; } else { SinkLog() << "Failed to send message"; @@ -97,6 +101,7 @@ public: for (const auto &m : toSend) { job = job.then(send(m, mSettings)) .then([this, m] { + SinkLog() << "Sent mail, and triggering move to sent mail folder: " << m.identifier(); auto modifiedMail = ApplicationDomain::Mail(mResourceInstanceIdentifier, m.identifier(), m.revision(), QSharedPointer::create()); modifiedMail.setSent(true); diff --git a/examples/mailtransportresource/smtptest.cpp b/examples/mailtransportresource/smtptest.cpp new file mode 100644 index 0000000..079150f --- /dev/null +++ b/examples/mailtransportresource/smtptest.cpp @@ -0,0 +1,20 @@ + +#include +#include +#include "mailtransport.h" + +int main(int argc, char *argv[]) +{ + QCoreApplication app(argc, argv); + app.setApplicationName(argv[0]); + + auto args = app.arguments(); + + auto msg = KMime::Message::Ptr::create(); + msg->to(true)->from7BitString("doe2@example.org"); + msg->from(true)->from7BitString("doe@example.org"); + msg->subject(true)->from7BitString("Subject"); + msg->assemble(); + + MailTransport::sendMessage(msg, "smtp://kolab:25", "doe@example.org", "Welcome2KolabSystems", QByteArray{}, MailTransport::Options{}); +} -- cgit v1.2.3