aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--notmuch-reply.c73
1 files changed, 70 insertions, 3 deletions
diff --git a/notmuch-reply.c b/notmuch-reply.c
index 6c15536c..3c5b253e 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),