From c25242d781667319938db77399e2073ba9e798f8 Mon Sep 17 00:00:00 2001 From: Philip Hazel Date: Thu, 10 Nov 2005 15:00:46 +0000 Subject: [PATCH] Log only the actual address (not the whole To: header) when generating an autoreply from a filter. --- doc/doc-txt/ChangeLog | 13 ++++++++++- src/src/filter.c | 50 ++++++++++++++++++++++++++++++++++++++----- 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog index 3a03c80cc..b9ddc75d2 100644 --- a/doc/doc-txt/ChangeLog +++ b/doc/doc-txt/ChangeLog @@ -1,4 +1,4 @@ -$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.252 2005/10/20 15:19:13 ph10 Exp $ +$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.253 2005/11/10 15:00:46 ph10 Exp $ Change log file for Exim from version 4.21 ------------------------------------------- @@ -41,6 +41,17 @@ PH/03 For some reason, the default setting of PATH when running a command from PH/04 SUPPORT_TRANSLATE_IP_ADDRESS and MOVE_FROZEN_MESSAGES did not cause anything to be listed in the output from -bV. +PH/05 When a filter generated an autoreply, the entire To: header line was + quoted in the delivery log line, like this: + + => >A.N.Other ... + + This has been changed so that it extracts the operative address. There + may be more than one such address. If so, they are comma-separated, like + this: + + => >ano@some.domain,ona@other.domain ... + Exim version 4.54 ----------------- diff --git a/src/src/filter.c b/src/src/filter.c index c9ff215dd..e551abef8 100644 --- a/src/src/filter.c +++ b/src/src/filter.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/filter.c,v 1.5 2005/10/03 11:26:21 ph10 Exp $ */ +/* $Cambridge: exim/src/src/filter.c,v 1.6 2005/11/10 15:00:46 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -2207,12 +2207,16 @@ while (commands != NULL) else { uschar *tt; + uschar *log_addr = NULL; uschar *to = commands->args[mailarg_index_to].u; + int size = 0; + int ptr = 0; + if (to == NULL) to = expand_string(US"$reply_address"); while (isspace(*to)) to++; - for (tt = to; *tt != 0; tt++) /* Get rid of newlines so that */ - if (*tt == '\n') *tt = ' '; /* the eventual log line is OK */ + for (tt = to; *tt != 0; tt++) /* Get rid of newlines */ + if (*tt == '\n') *tt = ' '; DEBUG(D_filter) { @@ -2235,9 +2239,45 @@ while (commands != NULL) } } - /* Create the "address" for the autoreply */ + /* Create the "address" for the autoreply. This is used only for logging, + as the actual recipients are extraced from the To: line by -t. We use the + same logic here to extract the working addresses (there may be more than + one). */ + + tt = to; + while (*tt != 0) + { + uschar *ss = parse_find_address_end(tt, FALSE); + uschar *recipient, *errmess; + int start, end, domain; + int temp = *ss; + + *ss = 0; + recipient = parse_extract_address(tt, &errmess, &start, &end, &domain, + FALSE); + *ss = temp; + + /* Ignore empty addresses and errors; an error will occur later if + there's something really bad. */ + + if (recipient != NULL) + { + log_addr = string_cat(log_addr, &size, &ptr, + (log_addr == NULL)? US">" : US",", 1); + log_addr = string_cat(log_addr, &size, &ptr, recipient, + Ustrlen(recipient)); + } + + /* Move on past this address */ + + tt = ss + (*ss? 1:0); + while (isspace(*tt)) tt++; + } + + if (log_addr == NULL) log_addr = string_sprintf("invalid-to-line"); + else log_addr[ptr] = 0; - addr = deliver_make_addr(string_sprintf(">%.256s", to), FALSE); + addr = deliver_make_addr(log_addr, FALSE); setflag(addr, af_pfr); if (commands->noerror) setflag(addr, af_ignore_error); addr->next = *generated; -- 2.25.1