unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
* [PATCH 2/2] guess From address from Received headers 
@ 2010-04-06 19:45 Dirk Hohndel
  2010-04-07  1:55 ` Carl Worth
  0 siblings, 1 reply; 2+ messages in thread
From: Dirk Hohndel @ 2010-04-06 19:45 UTC (permalink / raw)
  To: notmuch


 When replying to a message notmuch tries to pick the correct From
 address by looking which one of a user's configured email addresses
 were included in To or Cc headers of the email that is being replied to.
 If none of the users email addresses are in the To or Cc headers we now
 try to guess from the first (chronologically, last) Received header
 which domain this email was received in and therefore which of the
 email addresses to use in a reply
 If that fails we still use the primary email as From email


Signed-off-by: Dirk Hohndel <hohndel@infradead.org>
---
 notmuch-reply.c |   73 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 70 insertions(+), 3 deletions(-)

diff --git a/notmuch-reply.c b/notmuch-reply.c
index 6c15536..3c5b253 100644
--- a/notmuch-reply.c
+++ b/notmuch-reply.c
@@ -282,6 +282,69 @@ add_recipients_from_message (GMimeMessage *reply,
     return from_addr;
 }
 
+
+static const char *
+guess_from_received_header(notmuch_config_t *config, notmuch_message_t *message)
+{
+    const char *received,*primary;
+    char **other;
+    char *by,*mta,*ptr,*token;
+    char *domain=NULL;
+    char *tld=NULL;
+    const char *delim=". \t";
+    size_t i,other_len;
+
+    received = notmuch_message_get_header (message, "received");
+    by = strstr(received," by ");
+    if (by && *(by+4)) {
+	/* we know that there are 4 characters after by - either the 4th one
+	 * is '\0' (broken header) or it is the first letter of the hostname 
+	 * that last received this email - which we'll use to guess the right
+	 * from email address
+	 */
+	mta = strdup(by+4);
+	if (mta == NULL)
+	    return NULL;
+	/* After the MTA comes its IP address (or HELO response) in parenthesis.
+	 * so let's terminate the string there
+	 */
+	if ((ptr = strchr(mta,'(')) == NULL) {
+	    free (mta);
+	    return NULL;
+	}
+	*ptr = '\0';
+	/* Now extract the last two components of the MTA host name
+	 * as domain and tld
+	 */
+	token = mta;
+	while ((ptr = strsep(&token,delim)) != NULL) {
+	    if (*ptr == '\0')
+		continue;
+	    domain = tld;
+	    tld = ptr;
+	}
+	if (domain) {
+	    /* recombine domain and tld and look for it among the configured
+	     * email addresses
+	     */
+	    *(tld-1) = '.';
+	    primary = notmuch_config_get_user_primary_email (config);
+	    if (strcasestr (primary, domain)) {
+		free(mta);
+		return primary;
+	    }
+	    other = notmuch_config_get_user_other_email (config, &other_len);
+	    for (i = 0; i < other_len; i++)
+		if (strcasestr (other[i], domain)) {
+		    free(mta);
+		    return other[i];
+		}
+	}
+	free(mta);
+    }
+    return NULL;
+}
+
 static int
 notmuch_reply_format_default(void *ctx, notmuch_config_t *config, notmuch_query_t *query)
 {
@@ -312,9 +375,13 @@ notmuch_reply_format_default(void *ctx, notmuch_config_t *config, notmuch_query_
 	g_mime_message_set_subject (reply, subject);
 
 	from_addr = add_recipients_from_message (reply, config, message);
-
-	if (from_addr == NULL)
-	    from_addr = notmuch_config_get_user_primary_email (config);
+	
+	if (from_addr == NULL) {
+	    from_addr = guess_from_received_header (config, message);
+	    if (from_addr == NULL) {
+	        from_addr = notmuch_config_get_user_primary_email (config);
+	    }
+	}
 
 	from_addr = talloc_asprintf (ctx, "%s <%s>",
 				     notmuch_config_get_user_name (config),
-- 
1.6.6.1


-- 
Dirk Hohndel
Intel Open Source Technology Center

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH 2/2] guess From address from Received headers
  2010-04-06 19:45 [PATCH 2/2] guess From address from Received headers Dirk Hohndel
@ 2010-04-07  1:55 ` Carl Worth
  0 siblings, 0 replies; 2+ messages in thread
From: Carl Worth @ 2010-04-07  1:55 UTC (permalink / raw)
  To: Dirk Hohndel, notmuch

[-- Attachment #1: Type: text/plain, Size: 1124 bytes --]

On Tue, 06 Apr 2010 12:45:57 -0700, Dirk Hohndel <hohndel@infradead.org> wrote:
>  When replying to a message notmuch tries to pick the correct From
>  address by looking which one of a user's configured email addresses
>  were included in To or Cc headers of the email that is being replied to.
>  If none of the users email addresses are in the To or Cc headers we now
>  try to guess from the first (chronologically, last) Received header
>  which domain this email was received in and therefore which of the
>  email addresses to use in a reply
>  If that fails we still use the primary email as From email

Thanks, Dirk.

This looks like an awfully useful and clever piece of
functionality. I've applied this patch, (with some tiny style
cleanups[*] afterwards), along with the previous patch that this depends
on.

I'd like to have a test case in the test suite for this as well, but I'm
not going to make the patch block on that (instead I just added that to
TODO).

-Carl

[*] I really need to add a CODING_STYLE document to advertise my
preferred style issues. And before you ask, yes, there *is* a patch for
that.

[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2010-04-07  1:55 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-04-06 19:45 [PATCH 2/2] guess From address from Received headers Dirk Hohndel
2010-04-07  1:55 ` Carl Worth

Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).