On Fri, Dec 04, 2009 at 08:54:01PM +0100, Stefan F??rster wrote:
> Now, about logging - I'd be really grateful if the existing logging
> functionality could be extended in a way so that the pre-queue
> content filter's response is logged.
> 
> I know that it is actually the content filter's job to log what it did
> during an ESMTP transaction, but I think if Postfix logged the
> filter's response, correlating logs would be much easier.

Like this?

    Dec  5 20:15:25 server postfix/smtpd[16712]: proxy-accept:
    END-OF-MESSAGE: 250 2.0.0 Ok: queued as 91BE3547AFE;
    from=<sen...@example.com> to=<recipi...@example.com> proto=ESMTP
    helo=<client.example.com>

(with the same form for proxy-reject at END-OF-MESSAGE; the format
of the reject message would be consistent with other Postfix reject
messages.)

        Wietse

diff --exclude=man --exclude=html --exclude=README_FILES --exclude=.indent.pro 
--exclude=Makefile.in -r -cr /var/tmp/postfix-2.7-20091115/src/smtpd/smtpd.c 
./smtpd.c
*** /var/tmp/postfix-2.7-20091115/src/smtpd/smtpd.c     Sun Nov 15 10:34:24 2009
--- ./smtpd.c   Sat Dec  5 20:16:33 2009
***************
*** 1353,1358 ****
--- 1353,1379 ----
  
  #endif
  
+ /* smtpd_whatsup - gather available evidence for logging */
+ 
+ static const char *smtpd_whatsup(SMTPD_STATE *state)
+ {
+     static VSTRING *buf = 0;
+ 
+     if (buf == 0)
+       buf = vstring_alloc(100);
+     else
+       VSTRING_RESET(buf);
+     if (state->sender)
+       vstring_sprintf_append(buf, " from=<%s>", state->sender);
+     if (state->recipient)
+       vstring_sprintf_append(buf, " to=<%s>", state->recipient);
+     if (state->protocol)
+       vstring_sprintf_append(buf, " proto=%s", state->protocol);
+     if (state->helo_name)
+       vstring_sprintf_append(buf, " helo=<%s>", state->helo_name);
+     return (STR(buf));
+ }
+ 
  /* collapse_args - put arguments together again */
  
  static void collapse_args(int argc, SMTPD_TOKEN *argv)
***************
*** 3097,3102 ****
--- 3103,3116 ----
      }
  
      /*
+      * By popular command: the proxy's end-of-data reply.
+      */
+     if (proxy)
+       msg_info("proxy-%s: %s: %s;%s",
+                (state->err == CLEANUP_STAT_OK) ? "accept" : "reject",
+                state->where, STR(proxy->buffer), smtpd_whatsup(state));
+ 
+     /*
       * Cleanup. The client may send another MAIL command.
       */
      saved_err = state->err;

Reply via email to