summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2018-01-31 16:56:53 +0100
committerChristian Mollekopf <chrigi_1@fastmail.fm>2018-01-31 16:56:53 +0100
commit910502b4dfa373a03ff647387a2ee63a26d810f2 (patch)
treeb31392d199f0453637442c95b9916b1525b00443
parent82214670602985982769594ad795aff424bce8bd (diff)
downloadkube-910502b4dfa373a03ff647387a2ee63a26d810f2.tar.gz
kube-910502b4dfa373a03ff647387a2ee63a26d810f2.zip
Properly encode non-ascii content.
-rw-r--r--framework/src/domain/mime/mailtemplates.cpp51
1 files changed, 14 insertions, 37 deletions
diff --git a/framework/src/domain/mime/mailtemplates.cpp b/framework/src/domain/mime/mailtemplates.cpp
index c562698f..9af15e91 100644
--- a/framework/src/domain/mime/mailtemplates.cpp
+++ b/framework/src/domain/mime/mailtemplates.cpp
@@ -188,9 +188,9 @@ QByteArray getRefStr(const KMime::Message::Ptr &msg)
188 return retRefStr; 188 return retRefStr;
189} 189}
190 190
191KMime::Content *createPlainPartContent(const KMime::Message::Ptr &msg, const QString &plainBody) 191KMime::Content *createPlainPartContent(const QString &plainBody, KMime::Content *parent = nullptr)
192{ 192{
193 KMime::Content *textPart = new KMime::Content(msg.data()); 193 KMime::Content *textPart = new KMime::Content(parent);
194 textPart->contentType()->setMimeType("text/plain"); 194 textPart->contentType()->setMimeType("text/plain");
195 //FIXME This is supposed to select a charset out of the available charsets that contains all necessary characters to render the text 195 //FIXME This is supposed to select a charset out of the available charsets that contains all necessary characters to render the text
196 // QTextCodec *charset = selectCharset(m_charsets, plainBody); 196 // QTextCodec *charset = selectCharset(m_charsets, plainBody);
@@ -201,17 +201,16 @@ KMime::Content *createPlainPartContent(const KMime::Message::Ptr &msg, const QSt
201 return textPart; 201 return textPart;
202} 202}
203 203
204KMime::Content *createMultipartAlternativeContent(const KMime::Message::Ptr &msg, const QString &plainBody, const QString &htmlBody) 204KMime::Content *createMultipartAlternativeContent(const QString &plainBody, const QString &htmlBody, KMime::Message *parent = nullptr)
205{ 205{
206 KMime::Content *multipartAlternative = new KMime::Content(msg.data()); 206 KMime::Content *multipartAlternative = new KMime::Content(parent);
207 multipartAlternative->contentType()->setMimeType("multipart/alternative"); 207 multipartAlternative->contentType()->setMimeType("multipart/alternative");
208 const QByteArray boundary = KMime::multiPartBoundary(); 208 multipartAlternative->contentType()->setBoundary(KMime::multiPartBoundary());
209 multipartAlternative->contentType()->setBoundary(boundary);
210 209
211 KMime::Content *textPart = createPlainPartContent(msg, plainBody); 210 KMime::Content *textPart = createPlainPartContent(plainBody, multipartAlternative);
212 multipartAlternative->addContent(textPart); 211 multipartAlternative->addContent(textPart);
213 212
214 KMime::Content *htmlPart = new KMime::Content(msg.data()); 213 KMime::Content *htmlPart = new KMime::Content(multipartAlternative);
215 htmlPart->contentType()->setMimeType("text/html"); 214 htmlPart->contentType()->setMimeType("text/html");
216 //FIXME This is supposed to select a charset out of the available charsets that contains all necessary characters to render the text 215 //FIXME This is supposed to select a charset out of the available charsets that contains all necessary characters to render the text
217 // QTextCodec *charset = selectCharset(m_charsets, htmlBody); 216 // QTextCodec *charset = selectCharset(m_charsets, htmlBody);
@@ -242,8 +241,8 @@ void addProcessedBodyToMessage(const KMime::Message::Ptr &msg, const QString &pl
242 const QByteArray boundary = KMime::multiPartBoundary(); 241 const QByteArray boundary = KMime::multiPartBoundary();
243 KMime::Content *const mainTextPart = 242 KMime::Content *const mainTextPart =
244 htmlBody.isEmpty() ? 243 htmlBody.isEmpty() ?
245 createPlainPartContent(msg, plainBody) : 244 createPlainPartContent(plainBody, msg.data()) :
246 createMultipartAlternativeContent(msg, plainBody, htmlBody); 245 createMultipartAlternativeContent(plainBody, htmlBody, msg.data());
247 mainTextPart->assemble(); 246 mainTextPart->assemble();
248 247
249 KMime::Content *textPart = mainTextPart; 248 KMime::Content *textPart = mainTextPart;
@@ -908,33 +907,11 @@ static KMime::Content *createAttachmentPart(const QByteArray &content, const QSt
908 return part; 907 return part;
909} 908}
910 909
911static KMime::Content *createPlainBodyPart(const QString &body) { 910static KMime::Content *createBodyPart(const QString &body, bool htmlBody) {
912 auto mainMessage = new KMime::Content;
913 mainMessage->setBody(body.toUtf8());
914 mainMessage->contentType(true)->setMimeType("text/plain");
915 return mainMessage;
916}
917
918static KMime::Content *createHtmlBodyPart(const QString &body) {
919 auto mainMessage = new KMime::Content;
920 mainMessage->setBody(body.toUtf8());
921 mainMessage->contentType(true)->setMimeType("text/html");
922 return mainMessage;
923}
924
925static KMime::Content *createBodyPart(const QByteArray &body, bool htmlBody) {
926 if (htmlBody) { 911 if (htmlBody) {
927 auto bodyPart = new KMime::Content; 912 return createMultipartAlternativeContent(toPlainText(body), body);
928 bodyPart->contentType(true)->setMimeType("multipart/alternative");
929 bodyPart->contentType()->setBoundary(KMime::multiPartBoundary());
930
931 bodyPart->addContent(createPlainBodyPart(toPlainText(body)));
932 bodyPart->addContent(createHtmlBodyPart(body));
933 return bodyPart;
934 } else {
935 return createPlainBodyPart(body);
936 } 913 }
937 return nullptr; 914 return createPlainPartContent(body);
938} 915}
939 916
940static KMime::Types::Mailbox::List stringListToMailboxes(const QStringList &list) 917static KMime::Types::Mailbox::List stringListToMailboxes(const QStringList &list)
@@ -999,13 +976,13 @@ KMime::Message::Ptr MailTemplates::createMessage(KMime::Message::Ptr existingMes
999 bodyPart->contentType()->setBoundary(KMime::multiPartBoundary()); 976 bodyPart->contentType()->setBoundary(KMime::multiPartBoundary());
1000 bodyPart->contentTransferEncoding()->setEncoding(KMime::Headers::CE7Bit); 977 bodyPart->contentTransferEncoding()->setEncoding(KMime::Headers::CE7Bit);
1001 bodyPart->setPreamble("This is a multi-part message in MIME format.\n"); 978 bodyPart->setPreamble("This is a multi-part message in MIME format.\n");
1002 bodyPart->addContent(createBodyPart(body.toUtf8(), htmlBody)); 979 bodyPart->addContent(createBodyPart(body, htmlBody));
1003 for (const auto &attachment : attachments) { 980 for (const auto &attachment : attachments) {
1004 bodyPart->addContent(createAttachmentPart(attachment.data, attachment.filename, attachment.isInline, attachment.mimeType, attachment.name)); 981 bodyPart->addContent(createAttachmentPart(attachment.data, attachment.filename, attachment.isInline, attachment.mimeType, attachment.name));
1005 } 982 }
1006 return bodyPart; 983 return bodyPart;
1007 } else { 984 } else {
1008 return createBodyPart(body.toUtf8(), htmlBody); 985 return createBodyPart(body, htmlBody);
1009 } 986 }
1010 }()}; 987 }()};
1011 bodyPart->assemble(); 988 bodyPart->assemble();