summaryrefslogtreecommitdiffstats
path: root/framework/src/domain/mime
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/domain/mime')
-rw-r--r--framework/src/domain/mime/mailtemplates.cpp36
-rw-r--r--framework/src/domain/mime/mailtemplates.h1
-rw-r--r--framework/src/domain/mime/tests/mailtemplatetest.cpp24
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
867void 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
867QString MailTemplates::plaintextContent(const KMime::Message::Ptr &msg) 895QString 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 {
35namespace MailTemplates 35namespace 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"}};