From 0e34fa912174733c958f5795c6113342c17c9780 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Fri, 11 Aug 2017 14:01:47 -0600 Subject: Take personal email addresses into account when replying. --- framework/src/domain/composercontroller.cpp | 20 +++++++++++++++++++- framework/src/domain/mime/mailtemplates.cpp | 6 +----- framework/src/domain/mime/mailtemplates.h | 2 +- .../src/domain/mime/tests/mailtemplatetest.cpp | 21 +++++++++++++++++++++ 4 files changed, 42 insertions(+), 7 deletions(-) (limited to 'framework') diff --git a/framework/src/domain/composercontroller.cpp b/framework/src/domain/composercontroller.cpp index e4bd6ae2..b6380f50 100644 --- a/framework/src/domain/composercontroller.cpp +++ b/framework/src/domain/composercontroller.cpp @@ -62,6 +62,15 @@ public: } } + + QVector getAllAddresses() + { + QVector list; + for (int i = 0; i < model()->rowCount(); i++) { + list << model()->data(model()->index(i, 0), IdentitiesModel::Address).toString().toUtf8(); + } + return list; + } private: ComposerController &mController; }; @@ -365,10 +374,19 @@ void ComposerController::loadMessage(const QVariant &message, bool loadAsDraft) if (loadAsDraft) { setMessage(mail); } else { + //Find all personal email addresses to exclude from reply + KMime::Types::AddrSpecList me; + auto list = static_cast(mIdentitySelector.data())->getAllAddresses(); + for (const auto &a : list) { + KMime::Types::Mailbox mb; + mb.setAddress(a); + me << mb.addrSpec(); + } + MailTemplates::reply(mail, [this] (const KMime::Message::Ptr &reply) { //We assume reply setMessage(reply); - }); + }, me); } } else { qWarning() << "Retrieved empty message"; diff --git a/framework/src/domain/mime/mailtemplates.cpp b/framework/src/domain/mime/mailtemplates.cpp index 7bfcf38e..79275bda 100644 --- a/framework/src/domain/mime/mailtemplates.cpp +++ b/framework/src/domain/mime/mailtemplates.cpp @@ -795,16 +795,12 @@ static Recipients getRecipients(const KMime::Message::Ptr &origMsg, const KMime: return {toList, ccList}; } -void MailTemplates::reply(const KMime::Message::Ptr &origMsg, const std::function &callback) +void MailTemplates::reply(const KMime::Message::Ptr &origMsg, const std::function &callback, const KMime::Types::AddrSpecList &me) { //FIXME const bool alwaysPlain = true; KMime::Message::Ptr msg(new KMime::Message); - //FIXME - //Personal email addresses, required to detect the case where we reply to a message we have sent ourselves - KMime::Types::AddrSpecList me; - // const uint originalIdentity = identityUoid(origMsg); initHeader(msg); msg->contentType()->setCharset("utf-8"); diff --git a/framework/src/domain/mime/mailtemplates.h b/framework/src/domain/mime/mailtemplates.h index a8a4b606..edcc982a 100644 --- a/framework/src/domain/mime/mailtemplates.h +++ b/framework/src/domain/mime/mailtemplates.h @@ -34,7 +34,7 @@ struct Attachment { namespace MailTemplates { - void reply(const KMime::Message::Ptr &origMsg, const std::function &callback); + void reply(const KMime::Message::Ptr &origMsg, const std::function &callback, const KMime::Types::AddrSpecList &me = {}); QString plaintextContent(const KMime::Message::Ptr &origMsg); 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, const QList &attachments, const std::vector &signingKeys = {}); }; diff --git a/framework/src/domain/mime/tests/mailtemplatetest.cpp b/framework/src/domain/mime/tests/mailtemplatetest.cpp index 51c5e243..098c34bc 100644 --- a/framework/src/domain/mime/tests/mailtemplatetest.cpp +++ b/framework/src/domain/mime/tests/mailtemplatetest.cpp @@ -181,6 +181,27 @@ private slots: QCOMPARE(result->cc()->addresses(), l); } + void testMultiRecipientReplyFilteringMe() + { + KMime::Types::AddrSpecList me; + KMime::Types::Mailbox mb; + mb.setAddress("release-team@kde.org"); + me << mb.addrSpec(); + + auto msg = readMail("multirecipients.mbox"); + KMime::Message::Ptr result; + MailTemplates::reply(msg, [&] (const KMime::Message::Ptr &r) { + result = r; + }, me); + QTRY_VERIFY(result); + auto content = removeFirstLine(result->body()); + QVERIFY(!content.isEmpty()); + QCOMPARE(unquote(content), QLatin1String("test")); + QCOMPARE(result->to()->addresses(), {{"konqi@example.org"}}); + auto l = QVector{{"kde-devel@kde.org"}}; + QCOMPARE(result->cc()->addresses(), l); + } + void testCreatePlainMail() { QStringList to = {{"to@example.org"}}; -- cgit v1.2.3