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 @@ -56,6 +56,7 @@ // Qt includes #include +#include #include using namespace MimeTreeParser; @@ -192,9 +193,9 @@ return mParsedPart; } -MessagePartPtr ObjectTreeParser::processType(KMime::Content *node, ProcessResult &processResult, const QByteArray &mimeType, bool onlyOneMimePart) +MessagePartPtr ObjectTreeParser::processType(KMime::Content *node, ProcessResult &processResult, const QString &mimeType) { - const auto formatters = mSource->bodyPartFormatterFactory()->formattersForType(QString::fromUtf8(mimeType)); + const auto formatters = mSource->bodyPartFormatterFactory()->formattersForType(mimeType); Q_ASSERT(!formatters.empty()); for (auto formatter : formatters) { PartNodeBodyPart part(this, &processResult, mTopLevelContent, node, mNodeHelper); @@ -258,12 +259,18 @@ ProcessResult processResult(mNodeHelper); - QByteArray mimeType("text/plain"); + QString mimeType = QStringLiteral("text/plain"); if (node->contentType(false) && !node->contentType()->mimeType().isEmpty()) { - mimeType = node->contentType()->mimeType(); + mimeType = QString::fromUtf8(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 == QLatin1String("application/octet-stream")) { + const auto file = mNodeHelper->writeNodeToTempFile(node); + mimeType = Util::mimetype(file).name(); } - const auto mp = processType(node, processResult, mimeType, onlyOneMimePart); + const auto mp = processType(node, processResult, mimeType); Q_ASSERT(mp); parsedPart->appendSubPart(mp); mNodeHelper->setNodeProcessed(node, false);