Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id 8FD34431FC0 for ; Sat, 28 Nov 2009 15:19:06 -0800 (PST) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org Received: from olra.theworths.org ([127.0.0.1]) by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id SWeJOEkynNik for ; Sat, 28 Nov 2009 15:19:04 -0800 (PST) Received: from mail-bw0-f224.google.com (mail-bw0-f224.google.com [209.85.218.224]) by olra.theworths.org (Postfix) with ESMTP id 6880D431FAE for ; Sat, 28 Nov 2009 15:19:04 -0800 (PST) Received: by mail-bw0-f224.google.com with SMTP id 24so1833687bwz.30 for ; Sat, 28 Nov 2009 15:19:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:sender:from:to:cc:subject :date:message-id:x-mailer:in-reply-to:references; bh=kO125PLjZtb5FvHOo+R/CUpNJ/nx/2inV3hKZNIFiiM=; b=ks7U+74LRxbz4pU7f+pb7UxAHT7AhgOYtmSyKbEMRphlVqBu1bsM5wppV03OMlo3SV vRoV5e9q/uFOVaYYwHtZERzmqWfxGSWFnhdL7qrDs8HdkxR6oixI1J7XdBhoPq9cg6vb uYPbKHBSJ198qJ0HoEca5Pq8TegUwdf9fENWg= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; b=vXY5wtuiNlLQdZz9AUHDWdd0YyqkmoNLEOJkRsYx3HW2PR/hAq8zHq620FDKocQzyO q93EHzYbA5ohDcJXq1UdlE0sIx9vhbQtaoDPn3RodgqJsutMOIKlJbhq9SJh8H5HvDdq EdvsTOonlOB8bnl3/Qt8tAsbiGo6QBRLuUuds= Received: by 10.204.34.71 with SMTP id k7mr2581476bkd.206.1259450344114; Sat, 28 Nov 2009 15:19:04 -0800 (PST) Received: from localhost.localdomain (vawpc43.ethz.ch [129.132.59.11]) by mx.google.com with ESMTPS id 15sm965320fxm.14.2009.11.28.15.19.02 (version=TLSv1/SSLv3 cipher=RC4-MD5); Sat, 28 Nov 2009 15:19:03 -0800 (PST) Sender: Jed Brown From: Jed Brown To: cworth@cworth.org Date: Sun, 29 Nov 2009 00:19:36 +0100 Message-Id: <1259450376-24523-2-git-send-email-jed@59A2.org> X-Mailer: git-send-email 1.6.5.3 In-Reply-To: <1259450376-24523-1-git-send-email-jed@59A2.org> References: <87r5ripfy2.fsf@yoom.home.cworth.org> <1259450376-24523-1-git-send-email-jed@59A2.org> Cc: notmuch@notmuchmail.org Subject: [notmuch] [PATCH 2/2] notmuch-reply.c: Handle munged `Reply-To' headers. X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 28 Nov 2009 23:19:07 -0000 Some mailing lists engage in the evil practice of changing the Reply-To header so that replies from all mailers go to the list by default, at the expense of not responding to the person who actually sent the message. When this is detected, we reply to `From' and remove the duplicate response to the mailing list. Consider a reply to the following message. From: Some User To: Sample users list Reply-To: Sample users list Prior to this patch, `notmuch reply' produces To: Sample users list , Sample users list and after the patch, To: Some User , Sample users list Signed-off-by: Jed Brown --- notmuch-reply.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 46 insertions(+), 1 deletions(-) diff --git a/notmuch-reply.c b/notmuch-reply.c index b91a830..9b9e9ab 100644 --- a/notmuch-reply.c +++ b/notmuch-reply.c @@ -182,6 +182,39 @@ add_recipients_for_string (GMimeMessage *message, return add_recipients_for_address_list (message, config, type, list); } +/* Some mailing lists munge the Reply-To header despite it being A Bad + * Thing, see http://www.unicom.com/pw/reply-to-harmful.html + * + * This function detects such munging so that reasonable headers can be + * generated anyway. Returns 1 if munged, else 0. + * + * The current logic is fairly naive, Reply-To is diagnosed as munged if + * it contains exactly one address, and this address is also present in + * the To or Cc fields. + */ +static int +mailing_list_munged_reply_to (notmuch_message_t *message) +{ + const char *header, *addr; + InternetAddressList *list; + InternetAddress *address; + InternetAddressMailbox *mailbox; + + header = notmuch_message_get_header (message, "reply-to"); + 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); + /* Note that strcasestr() is a GNU extension, strstr() might be sufficient */ + if (strcasestr (notmuch_message_get_header (message, "to"), addr) == 0 || + strcasestr (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 @@ -192,7 +225,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; @@ -205,6 +238,18 @@ add_recipients_from_message (GMimeMessage *reply, const char *from_addr = NULL; unsigned int i; + /* When we have detected Reply-To munging, we ignore the Reply-To + * field (because it appears in the To or Cc headers) and use the + * From header so that person will get pinged and will actually + * receive the response if not subscribed to the list. Note that + * under no circumstances does this fail to reply to the address in + * the Reply-To header. + */ + if (mailing_list_munged_reply_to (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; -- 1.6.5.3