diff options
Diffstat (limited to 'framework/src/domain/mime')
-rw-r--r-- | framework/src/domain/mime/mailtemplates.cpp | 36 | ||||
-rw-r--r-- | framework/src/domain/mime/mailtemplates.h | 1 | ||||
-rw-r--r-- | framework/src/domain/mime/tests/mailtemplatetest.cpp | 24 |
3 files changed, 59 insertions, 2 deletions
diff --git a/framework/src/domain/mime/mailtemplates.cpp b/framework/src/domain/mime/mailtemplates.cpp index 9af15e91..8e644b34 100644 --- a/framework/src/domain/mime/mailtemplates.cpp +++ b/framework/src/domain/mime/mailtemplates.cpp | |||
@@ -864,6 +864,34 @@ void MailTemplates::reply(const KMime::Message::Ptr &origMsg, const std::functio | |||
864 | }); | 864 | }); |
865 | } | 865 | } |
866 | 866 | ||
867 | void MailTemplates::forward(const KMime::Message::Ptr &origMsg, const std::function<void(const KMime::Message::Ptr &result)> &callback) | ||
868 | { | ||
869 | KMime::Message::Ptr wrapperMsg(new KMime::Message); | ||
870 | |||
871 | wrapperMsg->to()->clear(); | ||
872 | wrapperMsg->cc()->clear(); | ||
873 | |||
874 | wrapperMsg->subject()->fromUnicodeString(forwardSubject(origMsg->subject()->asUnicodeString()), "utf-8"); | ||
875 | |||
876 | const QByteArray refStr = getRefStr(origMsg); | ||
877 | if (!refStr.isEmpty()) { | ||
878 | wrapperMsg->references()->fromUnicodeString(QString::fromLocal8Bit(refStr), "utf-8"); | ||
879 | } | ||
880 | |||
881 | KMime::Content* fwdAttachment = new KMime::Content; | ||
882 | |||
883 | fwdAttachment->contentDisposition()->setDisposition(KMime::Headers::CDinline); | ||
884 | fwdAttachment->contentType()->setMimeType("message/rfc822"); | ||
885 | fwdAttachment->contentDisposition()->setFilename(origMsg->subject()->asUnicodeString() + ".eml"); | ||
886 | // The mail was parsed in loadMessage before, so no need to assemble it | ||
887 | fwdAttachment->setBody(origMsg->encodedContent()); | ||
888 | |||
889 | wrapperMsg->addContent(fwdAttachment); | ||
890 | wrapperMsg->assemble(); | ||
891 | |||
892 | callback(wrapperMsg); | ||
893 | } | ||
894 | |||
867 | QString MailTemplates::plaintextContent(const KMime::Message::Ptr &msg) | 895 | QString MailTemplates::plaintextContent(const KMime::Message::Ptr &msg) |
868 | { | 896 | { |
869 | MimeTreeParser::ObjectTreeParser otp; | 897 | MimeTreeParser::ObjectTreeParser otp; |
@@ -899,10 +927,14 @@ static KMime::Content *createAttachmentPart(const QByteArray &content, const QSt | |||
899 | } else { | 927 | } else { |
900 | part->contentDisposition(true)->setDisposition(KMime::Headers::CDattachment); | 928 | part->contentDisposition(true)->setDisposition(KMime::Headers::CDattachment); |
901 | } | 929 | } |
930 | |||
902 | part->contentType(true)->setMimeType(mimeType); | 931 | part->contentType(true)->setMimeType(mimeType); |
903 | part->contentType(true)->setName(name, "utf-8"); | 932 | part->contentType(true)->setName(name, "utf-8"); |
904 | //Just always encode attachments base64 so it's safe for binary data | 933 | // Just always encode attachments base64 so it's safe for binary data, |
905 | part->contentTransferEncoding(true)->setEncoding(KMime::Headers::CEbase64); | 934 | // except when it's another message |
935 | if(mimeType != "message/rfc822") { | ||
936 | part->contentTransferEncoding(true)->setEncoding(KMime::Headers::CEbase64); | ||
937 | } | ||
906 | part->setBody(content); | 938 | part->setBody(content); |
907 | return part; | 939 | return part; |
908 | } | 940 | } |
diff --git a/framework/src/domain/mime/mailtemplates.h b/framework/src/domain/mime/mailtemplates.h index 21efb5a0..9447e169 100644 --- a/framework/src/domain/mime/mailtemplates.h +++ b/framework/src/domain/mime/mailtemplates.h | |||
@@ -35,6 +35,7 @@ struct Attachment { | |||
35 | namespace MailTemplates | 35 | namespace MailTemplates |
36 | { | 36 | { |
37 | void reply(const KMime::Message::Ptr &origMsg, const std::function<void(const KMime::Message::Ptr &result)> &callback, const KMime::Types::AddrSpecList &me = {}); | 37 | void reply(const KMime::Message::Ptr &origMsg, const std::function<void(const KMime::Message::Ptr &result)> &callback, const KMime::Types::AddrSpecList &me = {}); |
38 | void forward(const KMime::Message::Ptr &origMsg, const std::function<void(const KMime::Message::Ptr &result)> &callback); | ||
38 | QString plaintextContent(const KMime::Message::Ptr &origMsg); | 39 | QString plaintextContent(const KMime::Message::Ptr &origMsg); |
39 | QString body(const KMime::Message::Ptr &msg, bool &isHtml); | 40 | QString body(const KMime::Message::Ptr &msg, bool &isHtml); |
40 | 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<Attachment> &attachments, const std::vector<GpgME::Key> &signingKeys = {}, const std::vector<GpgME::Key> &encryptionKeys = {}); | 41 | 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<Attachment> &attachments, const std::vector<GpgME::Key> &signingKeys = {}, const std::vector<GpgME::Key> &encryptionKeys = {}); |
diff --git a/framework/src/domain/mime/tests/mailtemplatetest.cpp b/framework/src/domain/mime/tests/mailtemplatetest.cpp index 302fae95..8d044608 100644 --- a/framework/src/domain/mime/tests/mailtemplatetest.cpp +++ b/framework/src/domain/mime/tests/mailtemplatetest.cpp | |||
@@ -224,6 +224,30 @@ private slots: | |||
224 | QCOMPARE(result->cc()->addresses(), l); | 224 | QCOMPARE(result->cc()->addresses(), l); |
225 | } | 225 | } |
226 | 226 | ||
227 | void testForwardAsAttachment() | ||
228 | { | ||
229 | auto msg = readMail("plaintext.mbox"); | ||
230 | KMime::Message::Ptr result; | ||
231 | MailTemplates::forward(msg, [&] (const KMime::Message::Ptr &r) { | ||
232 | result = r; | ||
233 | }); | ||
234 | QTRY_VERIFY(result); | ||
235 | QCOMPARE(result->subject(false)->asUnicodeString(), {"FW: A random subject with alternative contenttype"}); | ||
236 | QCOMPARE(result->to()->addresses(), {}); | ||
237 | QCOMPARE(result->cc()->addresses(), {}); | ||
238 | |||
239 | auto attachments = result->attachments(); | ||
240 | QCOMPARE(attachments.size(), 1); | ||
241 | auto attachment = attachments[0]; | ||
242 | QCOMPARE(attachment->contentDisposition(false)->disposition(), KMime::Headers::CDinline); | ||
243 | QCOMPARE(attachment->contentDisposition(false)->filename(), {"A random subject with alternative contenttype.eml"}); | ||
244 | QVERIFY(attachment->bodyIsMessage()); | ||
245 | |||
246 | attachment->parse(); | ||
247 | auto origMsg = attachment->bodyAsMessage(); | ||
248 | QCOMPARE(origMsg->subject(false)->asUnicodeString(), {"A random subject with alternative contenttype"}); | ||
249 | } | ||
250 | |||
227 | void testCreatePlainMail() | 251 | void testCreatePlainMail() |
228 | { | 252 | { |
229 | QStringList to = {{"to@example.org"}}; | 253 | QStringList to = {{"to@example.org"}}; |