Log only the actual address (not the whole To: header) when generating
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Thu, 10 Nov 2005 15:00:46 +0000 (15:00 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Thu, 10 Nov 2005 15:00:46 +0000 (15:00 +0000)
an autoreply from a filter.

doc/doc-txt/ChangeLog
src/src/filter.c

index 3a03c80cc1375d213d74a0544223e760c3b76855..b9ddc75d212ab69189b56db02907c73eb0c77569 100644 (file)
@@ -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 <ano@some.domain> <original@ddress> ...
+
+      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 <original@ddress> ...
+
 
 Exim version 4.54
 -----------------
index c9ff215dd7ea21a7043d745f0cac6de6a9b570ed..e551abef86decbfeb7ee42e41d579583ebca1ad1 100644 (file)
@@ -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;