mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-24 03:48:10 +01:00
guess From address from Received headers
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>
This commit is contained in:
parent
a48f368778
commit
4fd9ea05e8
1 changed files with 70 additions and 3 deletions
|
@ -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)
|
||||
{
|
||||
|
@ -313,8 +376,12 @@ notmuch_reply_format_default(void *ctx, notmuch_config_t *config, notmuch_query_
|
|||
|
||||
from_addr = add_recipients_from_message (reply, config, message);
|
||||
|
||||
if (from_addr == NULL)
|
||||
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),
|
||||
|
|
Loading…
Reference in a new issue