unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
* [PATCH] Fix code extracting the MTA from Received: headers
@ 2010-04-07 20:38 Dirk Hohndel
  2010-04-07 22:56 ` Carl Worth
  2010-04-08  7:59 ` Sebastian Spaeth
  0 siblings, 2 replies; 6+ messages in thread
From: Dirk Hohndel @ 2010-04-07 20:38 UTC (permalink / raw)
  To: notmuch


The previous code made too many assumptions about the (sadly not
standardized) format of the Received headers. This version should
be more robust to deal with different variations.

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

diff --git a/notmuch-reply.c b/notmuch-reply.c
index 8eb4754..39377e1 100644
--- a/notmuch-reply.c
+++ b/notmuch-reply.c
@@ -296,28 +296,23 @@ guess_from_received_header (notmuch_config_t *config, notmuch_message_t *message
     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
+	/* sadly, the format of Received: headers is a bit inconsistent,
+	 * depending on the MTA used. So we try to extract just the MTA
+	 * here by removing leading whitespace and assuming that the MTA
+	 * name ends at the next whitespace
+	 * we test for *(by+4) to be non-'\0' to make sure there's something
+	 * there at all - and then assume that the first whitespace delimited
+	 * token that follows is the last receiving server
 	 */
 	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);
+	token = strtok(mta," \t");
+	if (token == NULL)
 	    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;
-- 
1.6.6.1


-- 
Dirk Hohndel
Intel Open Source Technology Center

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

end of thread, other threads:[~2010-04-13 18:06 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-04-07 20:38 [PATCH] Fix code extracting the MTA from Received: headers Dirk Hohndel
2010-04-07 22:56 ` Carl Worth
2010-04-08  7:59 ` Sebastian Spaeth
2010-04-08 15:07   ` Dirk Hohndel
2010-04-13 17:37     ` Carl Worth
2010-04-13 18:06       ` Dirk Hohndel

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).