X-Git-Url: https://git.notmuchmail.org/git?p=notmuch;a=blobdiff_plain;f=notmuch-reply.c;h=98f6442fb14f2ffc61a7650b1db9ab3afdc2f475;hp=3ec303455693d68764bf0ea4845519126a518918;hb=069cb5a73ac2487930baa75a9cd2850968361a16;hpb=fb50f31048272c6b055f9e1bb049fcf18a92310e diff --git a/notmuch-reply.c b/notmuch-reply.c index 3ec30345..98f6442f 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; }