From 52826aa7588f16c9b26d0884f9c728c933047035 Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Fri, 15 Mar 2024 19:23:35 +0200 Subject: [PATCH] message: flag list-unsubscribe as MailingList Flag message that merely have a List-Unsubscribe header with Flags::MailingList too (some marketing message have this header, yet miss "List-Id". Add a test as well. --- lib/message/mu-message.cc | 12 ++++++++++-- lib/message/test-mu-message.cc | 21 +++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/lib/message/mu-message.cc b/lib/message/mu-message.cc index 463c6c04..6ddd1f39 100644 --- a/lib/message/mu-message.cc +++ b/lib/message/mu-message.cc @@ -326,8 +326,16 @@ get_mailing_list(const MimeMessage& mime_msg) const char *b, *e; const auto hdr{mime_msg.header("List-Id")}; - if (!hdr) - return {}; + if (!hdr) { + /* some marketing messages don't have a List-Id, but _do_ have a + * List-Unsubscribe; if so, return an empty string here, so this + * message is still flagged as "MailingList" + */ + if (const auto lu = mime_msg.header("List-Unsubscribe"); !!lu) + return ""; + else + return Nothing; + } dechdr = g_mime_utils_header_decode_phrase(NULL, hdr->c_str()); if (!dechdr) diff --git a/lib/message/test-mu-message.cc b/lib/message/test-mu-message.cc index d9432978..1e0962e8 100644 --- a/lib/message/test-mu-message.cc +++ b/lib/message/test-mu-message.cc @@ -1065,8 +1065,27 @@ Hello! "Le poids économique de la chasse : la dette cachée de la chasse !"); assert_equal(msg->header("Subject").value_or(""), "Le poids économique de la chasse : \n\nla dette cachée de la chasse !"); + g_assert_true(none_of(msg->flags() & Flags::MailingList)); } +static void +test_message_list_unsubscribe() +{ + constexpr const auto txt = +R"(From: "Mu Test" +To: mu@djcbsoftware.nl +Subject: Test +Message-ID: <87lew9xddt.fsf@djcbsoftware.nl> +List-Unsubscribe: + +abcdef +)"; + const auto msg{Message::make_from_text(txt, "/xxx/m123:2,S")}; + assert_valid_result(msg); + + assert_equal(msg->mailing_list(), ""); + g_assert_true(any_of(msg->flags() & Flags::MailingList)); +} int main(int argc, char* argv[]) @@ -1099,6 +1118,8 @@ main(int argc, char* argv[]) test_message_fail); g_test_add_func("/message/message/sanitize-maildir", test_message_sanitize_maildir); + g_test_add_func("/message/message/message-list-unsubscribe", + test_message_list_unsubscribe); return g_test_run(); }