X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch-reply.c;h=6c15536cff153d3d00ebe4d8a300c6361a9ea536;hp=3ec303455693d68764bf0ea4845519126a518918;hb=e2dd4ac00b9979de34bd517fa57de56260d38755;hpb=fb50f31048272c6b055f9e1bb049fcf18a92310e diff --git a/notmuch-reply.c b/notmuch-reply.c index 3ec30345..6c15536c 100644 --- a/notmuch-reply.c +++ b/notmuch-reply.c @@ -188,6 +188,42 @@ add_recipients_for_string (GMimeMessage *message, return add_recipients_for_address_list (message, config, type, list); } +/* Does the address in the Reply-To header of 'message' already appear + * in either the 'To' or 'Cc' header of the message? + */ +static int +reply_to_header_is_redundant (notmuch_message_t *message) +{ + const char *header, *addr; + InternetAddressList *list; + InternetAddress *address; + InternetAddressMailbox *mailbox; + + header = notmuch_message_get_header (message, "reply-to"); + if (*header == '\0') + return 0; + + list = internet_address_list_parse_string (header); + + if (internet_address_list_length (list) != 1) + return 0; + + address = internet_address_list_get_address (list, 0); + if (INTERNET_ADDRESS_IS_GROUP (address)) + return 0; + + mailbox = INTERNET_ADDRESS_MAILBOX (address); + addr = internet_address_mailbox_get_addr (mailbox); + + if (strstr (notmuch_message_get_header (message, "to"), addr) != 0 || + strstr (notmuch_message_get_header (message, "cc"), addr) != 0) + { + return 1; + } + + return 0; +} + /* Augments the recipients of reply from the headers of message. * * If any of the user's addresses were found in these headers, the first @@ -198,7 +234,7 @@ add_recipients_from_message (GMimeMessage *reply, notmuch_config_t *config, notmuch_message_t *message) { - static const struct { + struct { const char *header; const char *fallback; GMimeRecipientType recipient_type; @@ -211,6 +247,22 @@ add_recipients_from_message (GMimeMessage *reply, const char *from_addr = NULL; unsigned int i; + /* Some mailing lists munge the Reply-To header despite it being A Bad + * Thing, see http://www.unicom.com/pw/reply-to-harmful.html + * + * The munging is easy to detect, because it results in a + * redundant reply-to header, (with an address that already exists + * in either To or Cc). So in this case, we ignore the Reply-To + * field and use the From header. Thie ensures the original sender + * will get the reply even if not subscribed to the list. Note + * that the address in the Reply-To header will always appear in + * the reply. + */ + if (reply_to_header_is_redundant (message)) { + reply_to_map[0].header = "from"; + reply_to_map[0].fallback = NULL; + } + for (i = 0; i < ARRAY_SIZE (reply_to_map); i++) { const char *addr, *recipients; @@ -226,6 +278,7 @@ add_recipients_from_message (GMimeMessage *reply, if (from_addr == NULL) from_addr = addr; } + return from_addr; } @@ -240,8 +293,8 @@ notmuch_reply_format_default(void *ctx, notmuch_config_t *config, notmuch_query_ char *reply_headers; for (messages = notmuch_query_search_messages (query); - notmuch_messages_has_more (messages); - notmuch_messages_advance (messages)) + notmuch_messages_valid (messages); + notmuch_messages_move_to_next (messages)) { message = notmuch_messages_get (messages); @@ -315,8 +368,8 @@ notmuch_reply_format_headers_only(void *ctx, notmuch_config_t *config, notmuch_q char *reply_headers; for (messages = notmuch_query_search_messages (query); - notmuch_messages_has_more (messages); - notmuch_messages_advance (messages)) + notmuch_messages_valid (messages); + notmuch_messages_move_to_next (messages)) { message = notmuch_messages_get (messages);