From a290f7f5228d6447611f304815baa0baca72e5e2 Mon Sep 17 00:00:00 2001 From: Minijackson Date: Fri, 2 Mar 2018 15:45:19 +0100 Subject: Make encrypted forwarding with attachement work + encoding --- framework/src/domain/mime/mailtemplates.cpp | 39 +++++++++++++---------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/framework/src/domain/mime/mailtemplates.cpp b/framework/src/domain/mime/mailtemplates.cpp index 513f0353..30f9a48d 100644 --- a/framework/src/domain/mime/mailtemplates.cpp +++ b/framework/src/domain/mime/mailtemplates.cpp @@ -227,7 +227,7 @@ KMime::Content *createMultipartAlternativeContent(const QString &plainBody, cons //FIXME This is supposed to select a charset out of the available charsets that contains all necessary characters to render the text // QTextCodec *charset = selectCharset(m_charsets, htmlBody); // htmlPart->contentType()->setCharset(charset->name()); - textPart->contentType()->setCharset("utf-8"); + htmlPart->contentType()->setCharset("utf-8"); htmlPart->contentTransferEncoding()->setEncoding(KMime::Headers::CE8Bit); htmlPart->fromUnicodeString(htmlBody); multipartAlternative->addContent(htmlPart); @@ -235,9 +235,9 @@ KMime::Content *createMultipartAlternativeContent(const QString &plainBody, cons return multipartAlternative; } -KMime::Message *createMultipartMixedContent(QVector contents) +KMime::Content *createMultipartMixedContent(QVector contents) { - KMime::Message *multiPartMixed = new KMime::Message(); + KMime::Content *multiPartMixed = new KMime::Content(); multiPartMixed->contentType()->setMimeType("multipart/mixed"); multiPartMixed->contentType()->setBoundary(KMime::multiPartBoundary()); @@ -899,7 +899,7 @@ void MailTemplates::forward(const KMime::Message::Ptr &origMsg, // Decrypt the original message, it will be encrypted again in the composer // for the right recipient - KMime::Message::Ptr forwardedMessage; + KMime::Message::Ptr forwardedMessage(new KMime::Message()); if (isEncrypted(origMsg.data())) { qDebug() << "Original message was encrypted, decrypting it"; MimeTreeParser::ObjectTreeParser otp; @@ -907,34 +907,31 @@ void MailTemplates::forward(const KMime::Message::Ptr &origMsg, otp.decryptParts(); auto htmlContent = otp.htmlContent(); + KMime::Content *recreatedMsg = htmlContent.isEmpty() ? createPlainPartContent(otp.plainTextContent()) : createMultipartAlternativeContent(otp.plainTextContent(), htmlContent); - if (hasAttachment(origMsg.data())) { + KMime::Message::Ptr tmpForwardedMessage; + auto attachments = otp.collectAttachmentParts(); + if (!attachments.isEmpty()) { QVector contents = {recreatedMsg}; - contents.append(origMsg->attachments()); + for (const auto &attachment : attachments) { + contents.append(attachment->node()); + } auto msg = createMultipartMixedContent(contents); - forwardedMessage.reset(KMime::contentToMessage(msg)); + tmpForwardedMessage.reset(KMime::contentToMessage(msg)); } else { - forwardedMessage.reset(KMime::contentToMessage(recreatedMsg)); + tmpForwardedMessage.reset(KMime::contentToMessage(recreatedMsg)); } - forwardedMessage->subject()->from7BitString(origMsg->subject()->as7BitString()); - - for (const auto &addr : origMsg->to()->mailboxes()) { - forwardedMessage->to()->addAddress(addr); - } - - for (const auto &addr : origMsg->cc()->mailboxes()) { - forwardedMessage->cc()->addAddress(addr); - } - - for (const auto &addr : origMsg->bcc()->mailboxes()) { - forwardedMessage->bcc()->addAddress(addr); - } + origMsg->contentType()->fromUnicodeString(tmpForwardedMessage->contentType()->asUnicodeString(), "utf-8"); + origMsg->assemble(); + forwardedMessage->setHead(origMsg->head()); + forwardedMessage->setBody(tmpForwardedMessage->encodedBody()); + forwardedMessage->parse(); } else { qDebug() << "Original message was not encrypted, using it as-is"; -- cgit v1.2.3