From 5948dfeef0685477c9bd98f7d08508a6688c04d1 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sun, 8 Oct 2017 13:36:05 +0200 Subject: Assembling html mails --- framework/src/domain/composercontroller.cpp | 2 +- framework/src/domain/composercontroller.h | 1 + framework/src/domain/mime/mailtemplates.cpp | 24 +++++++++++++++-- framework/src/domain/mime/mailtemplates.h | 2 +- .../src/domain/mime/tests/mailtemplatetest.cpp | 30 +++++++++++++++++++--- 5 files changed, 51 insertions(+), 8 deletions(-) (limited to 'framework') diff --git a/framework/src/domain/composercontroller.cpp b/framework/src/domain/composercontroller.cpp index b6380f50..abb4fdf4 100644 --- a/framework/src/domain/composercontroller.cpp +++ b/framework/src/domain/composercontroller.cpp @@ -427,7 +427,7 @@ KMime::Message::Ptr ComposerController::assembleMessage() }; } } - return MailTemplates::createMessage(mExistingMessage, mToModel->stringList(), mCcModel->stringList(), mBccModel->stringList(), getIdentity(), getSubject(), getBody(), attachments); + return MailTemplates::createMessage(mExistingMessage, mToModel->stringList(), mCcModel->stringList(), mBccModel->stringList(), getIdentity(), getSubject(), getBody(), getHtmlBody(), attachments); } void ComposerController::updateSendAction() diff --git a/framework/src/domain/composercontroller.h b/framework/src/domain/composercontroller.h index b2486cee..784591eb 100644 --- a/framework/src/domain/composercontroller.h +++ b/framework/src/domain/composercontroller.h @@ -51,6 +51,7 @@ class ComposerController : public Kube::Controller //Interface properties KUBE_CONTROLLER_PROPERTY(QString, Subject, subject) KUBE_CONTROLLER_PROPERTY(QString, Body, body) + KUBE_CONTROLLER_PROPERTY(bool, HtmlBody, htmlBody) //Set by identitySelector KUBE_CONTROLLER_PROPERTY(KMime::Types::Mailbox, Identity, identity) diff --git a/framework/src/domain/mime/mailtemplates.cpp b/framework/src/domain/mime/mailtemplates.cpp index dc4f93b5..25ce1385 100644 --- a/framework/src/domain/mime/mailtemplates.cpp +++ b/framework/src/domain/mime/mailtemplates.cpp @@ -913,6 +913,13 @@ static KMime::Content *createBodyPart(const QByteArray &body) { return mainMessage; } +static KMime::Content *createHtmlBodyPart(const QByteArray &body) { + auto mainMessage = new KMime::Content; + mainMessage->setBody(body); + mainMessage->contentType(true)->setMimeType("text/html"); + return mainMessage; +} + static KMime::Types::Mailbox::List stringListToMailboxes(const QStringList &list) { KMime::Types::Mailbox::List mailboxes; @@ -924,7 +931,7 @@ static KMime::Types::Mailbox::List stringListToMailboxes(const QStringList &list return mailboxes; } -KMime::Message::Ptr MailTemplates::createMessage(KMime::Message::Ptr existingMessage, const QStringList &to, const QStringList &cc, const QStringList &bcc, const KMime::Types::Mailbox &from, const QString &subject, const QString &body, const QList &attachments, const std::vector &signingKeys) +KMime::Message::Ptr MailTemplates::createMessage(KMime::Message::Ptr existingMessage, const QStringList &to, const QStringList &cc, const QStringList &bcc, const KMime::Types::Mailbox &from, const QString &subject, const QString &body, bool htmlBody, const QList &attachments, const std::vector &signingKeys) { auto mail = existingMessage; if (!mail) { @@ -968,12 +975,25 @@ KMime::Message::Ptr MailTemplates::createMessage(KMime::Message::Ptr existingMes bodyPart->contentType()->setBoundary(KMime::multiPartBoundary()); bodyPart->contentTransferEncoding()->setEncoding(KMime::Headers::CE7Bit); bodyPart->setPreamble("This is a multi-part message in MIME format.\n"); + //TODO deal with html bodyPart->addContent(createBodyPart(body.toUtf8())); for (const auto &attachment : attachments) { bodyPart->addContent(createAttachmentPart(attachment.data, attachment.filename, attachment.isInline, attachment.mimeType, attachment.name)); } } else { - bodyPart = createBodyPart(body.toUtf8()); + if (htmlBody) { + bodyPart = new KMime::Content; + bodyPart->contentType(true)->setMimeType("multipart/alternative"); + bodyPart->contentType()->setBoundary(KMime::multiPartBoundary()); + + QTextDocument doc; + doc.setHtml(body); + + bodyPart->addContent(createBodyPart(doc.toPlainText().toUtf8())); + bodyPart->addContent(createHtmlBodyPart(body.toUtf8())); + } else { + bodyPart = createBodyPart(body.toUtf8()); + } } bodyPart->assemble(); diff --git a/framework/src/domain/mime/mailtemplates.h b/framework/src/domain/mime/mailtemplates.h index edcc982a..d28b100e 100644 --- a/framework/src/domain/mime/mailtemplates.h +++ b/framework/src/domain/mime/mailtemplates.h @@ -36,5 +36,5 @@ namespace MailTemplates { void reply(const KMime::Message::Ptr &origMsg, const std::function &callback, const KMime::Types::AddrSpecList &me = {}); QString plaintextContent(const KMime::Message::Ptr &origMsg); - KMime::Message::Ptr createMessage(KMime::Message::Ptr existingMessage, const QStringList &to, const QStringList &cc, const QStringList &bcc, const KMime::Types::Mailbox &from, const QString &subject, const QString &body, const QList &attachments, const std::vector &signingKeys = {}); + KMime::Message::Ptr createMessage(KMime::Message::Ptr existingMessage, const QStringList &to, const QStringList &cc, const QStringList &bcc, const KMime::Types::Mailbox &from, const QString &subject, const QString &body, bool htmlBody, const QList &attachments, const std::vector &signingKeys = {}); }; diff --git a/framework/src/domain/mime/tests/mailtemplatetest.cpp b/framework/src/domain/mime/tests/mailtemplatetest.cpp index 700ae7a3..0ea5305f 100644 --- a/framework/src/domain/mime/tests/mailtemplatetest.cpp +++ b/framework/src/domain/mime/tests/mailtemplatetest.cpp @@ -225,7 +225,7 @@ private slots: QString body = "body"; QList attachments; - auto result = MailTemplates::createMessage({}, to, cc, bcc, from, subject, body, attachments); + auto result = MailTemplates::createMessage({}, to, cc, bcc, from, subject, body, false, attachments); QVERIFY(result); QCOMPARE(result->subject()->asUnicodeString(), subject); @@ -234,6 +234,28 @@ private slots: QVERIFY(result->contentType()->isMimeType("text/plain")); } + void testCreateHtmlMail() + { + QStringList to = {{"to@example.org"}}; + QStringList cc = {{"cc@example.org"}}; + QStringList bcc = {{"bcc@example.org"}};; + KMime::Types::Mailbox from; + from.fromUnicodeString("from@example.org"); + QString subject = "subject"; + QString body = "body"; + QList attachments; + + auto result = MailTemplates::createMessage({}, to, cc, bcc, from, subject, body, true, attachments); + + QVERIFY(result); + QCOMPARE(result->subject()->asUnicodeString(), subject); + QVERIFY(result->date(false)->dateTime().isValid()); + QVERIFY(result->contentType()->isMimeType("multipart/alternative")); + const auto contents = result->contents(); + //1 Plain + 1 Html + QCOMPARE(contents.size(), 2); + } + void testCreatePlainMailWithAttachments() { QStringList to = {{"to@example.org"}}; @@ -245,7 +267,7 @@ private slots: QString body = "body"; QList attachments = {{"name", "filename", "mimetype", true, "inlineAttachment"}, {"name", "filename", "mimetype", false, "nonInlineAttachment"}}; - auto result = MailTemplates::createMessage({}, to, cc, bcc, from, subject, body, attachments); + auto result = MailTemplates::createMessage({}, to, cc, bcc, from, subject, body, false, attachments); QVERIFY(result); QCOMPARE(result->subject()->asUnicodeString(), subject); @@ -269,7 +291,7 @@ private slots: std::vector keys = getKeys(); - auto result = MailTemplates::createMessage({}, to, cc, bcc, from, subject, body, attachments, keys); + auto result = MailTemplates::createMessage({}, to, cc, bcc, from, subject, body, false, attachments, keys); QVERIFY(result); // qWarning() << "---------------------------------"; @@ -304,7 +326,7 @@ private slots: std::vector keys = getKeys(); - auto result = MailTemplates::createMessage({}, to, cc, bcc, from, subject, body, attachments, keys); + auto result = MailTemplates::createMessage({}, to, cc, bcc, from, subject, body, false, attachments, keys); QVERIFY(result); QCOMPARE(result->subject()->asUnicodeString(), subject); -- cgit v1.2.3