diff --git a/messageviewer/src/messagepartthemes/default/messagepartrendererfactory.cpp b/messageviewer/src/messagepartthemes/default/messagepartrendererfactory.cpp --- a/messageviewer/src/messagepartthemes/default/messagepartrendererfactory.cpp +++ b/messageviewer/src/messagepartthemes/default/messagepartrendererfactory.cpp @@ -40,6 +40,8 @@ #include "plugins/messagepartrenderer.h" #include "plugins/textmessagepartrenderer.h" +#include + #include #include @@ -150,7 +152,15 @@ { d->setup(); - const auto mtName = mp->content() ? QString::fromUtf8(mp->content()->contentType()->mimeType().toLower()) : QString(); + auto mtName = mp->content() ? QString::fromUtf8(mp->content()->contentType()->mimeType().toLower()) : QString(); + // unfortunately there's many emails where we can't trust the attachment mimetype + // so try to see if we can find something better + if (mtName.isEmpty() || mtName == QLatin1String("application/octet-stream")) { + const auto textPart = mp.dynamicCast(); + if (textPart) + mtName = MimeTreeParser::Util::mimetype(textPart->temporaryFilePath()).name(); + } + QMimeDatabase db; const auto mt = db.mimeTypeForName(mtName); auto ancestors = mt.allAncestors(); diff --git a/mimetreeparser/src/objecttreeparser.h b/mimetreeparser/src/objecttreeparser.h --- a/mimetreeparser/src/objecttreeparser.h +++ b/mimetreeparser/src/objecttreeparser.h @@ -327,7 +327,7 @@ * top-level content. */ MessagePartPtr parseObjectTreeInternal(KMime::Content *node, bool mOnlyOneMimePart); - MessagePartPtr processType(KMime::Content *node, MimeTreeParser::ProcessResult &processResult, const QByteArray &mimeType, bool onlyOneMimePart); + MessagePartPtr processType(KMime::Content *node, MimeTreeParser::ProcessResult &processResult, const QString &mimeType); private: diff --git a/mimetreeparser/src/objecttreeparser.cpp b/mimetreeparser/src/objecttreeparser.cpp --- a/mimetreeparser/src/objecttreeparser.cpp +++ b/mimetreeparser/src/objecttreeparser.cpp @@ -262,6 +262,12 @@ if (node->contentType(false) && !node->contentType()->mimeType().isEmpty()) { mimeType = node->contentType()->mimeType(); } + // unfortunately there's many emails where we can't trust the attachment mimetype + // so try to see if we can find something better + if (mimeType == "application/octet-stream") { + NodeHelper::magicSetType(node); + mimeType = node->contentType()->mimeType(); + } const auto mp = processType(node, processResult, mimeType); Q_ASSERT(mp);