diff -ur postfix-2.4.5/src/smtpd/smtpd.c postfix-2.4.5-proxy/src/smtpd/smtpd.c --- postfix-2.4.5/src/smtpd/smtpd.c 2007-09-11 00:27:31.181567626 +0200 +++ postfix-2.4.5-proxy/src/smtpd/smtpd.c 2007-09-11 00:26:54.177444169 +0200 @@ -2526,7 +2526,9 @@ int out_error; char **cpp; const CLEANUP_STAT_DETAIL *detail; - const char *rfc3848_sess; + VSTRING *proxy_why = 0; + int proxy_code; + const char *rfc3848_sess; const char *rfc3848_auth; #ifdef USE_TLS @@ -2705,8 +2707,19 @@ if (state->err == CLEANUP_STAT_OK) { (void) smtpd_proxy_cmd(state, SMTPD_PROX_WANT_ANY, "."); if (state->err == CLEANUP_STAT_OK && - *STR(state->proxy_buffer) != '2') + *STR(state->proxy_buffer) != '2') { state->err = CLEANUP_STAT_CONT; + proxy_why = vstring_alloc(10); + vstring_strncpy(proxy_why, STR(state->proxy_buffer), 3); + if (alldig(STR(proxy_why))) + proxy_code = atol(STR(proxy_why)); + else + proxy_code = 554; + vstring_strncpy(proxy_why, STR(state->proxy_buffer)+4, 5); + smtpd_check_reject(state, MAIL_ERROR_POLICY, proxy_code, proxy_why, + "%s", STR(state->proxy_buffer)); + vstring_free(proxy_why); + } } else if (state->err != CLEANUP_STAT_SIZE) { state->err |= CLEANUP_STAT_PROXY; detail = cleanup_stat_detail(CLEANUP_STAT_PROXY); diff -ur postfix-2.4.5/src/smtpd/smtpd_check.c postfix-2.4.5-proxy/src/smtpd/smtpd_check.c --- postfix-2.4.5/src/smtpd/smtpd_check.c 2007-09-11 00:27:30.414953649 +0200 +++ postfix-2.4.5-proxy/src/smtpd/smtpd_check.c 2007-09-11 00:10:33.804822948 +0200 @@ -378,7 +378,7 @@ * mail. */ static void PRINTFLIKE(5, 6) defer_if(SMTPD_DEFER *, int, int, const char *, const char *,...); -static int PRINTFLIKE(5, 6) smtpd_check_reject(SMTPD_STATE *, int, int, const char *, const char *,...); +int PRINTFLIKE(5, 6) smtpd_check_reject(SMTPD_STATE *, int, int, const char *, const char *,...); #define DEFER_IF_REJECT2(state, class, code, dsn, fmt, a1, a2) \ defer_if(&(state)->defer_if_reject, (class), (code), (dsn), (fmt), (a1), (a2)) @@ -759,7 +759,7 @@ /* smtpd_check_reject - do the boring things that must be done */ -static int smtpd_check_reject(SMTPD_STATE *state, int error_class, +int smtpd_check_reject(SMTPD_STATE *state, int error_class, int code, const char *dsn, const char *format,...) { diff -ur postfix-2.4.5/src/smtpd/smtpd_check.h postfix-2.4.5-proxy/src/smtpd/smtpd_check.h --- postfix-2.4.5/src/smtpd/smtpd_check.h 2007-09-11 00:27:30.414953649 +0200 +++ postfix-2.4.5-proxy/src/smtpd/smtpd_check.h 2007-09-11 00:10:33.808156052 +0200 @@ -25,6 +25,7 @@ extern char *smtpd_check_data(SMTPD_STATE *); extern char *smtpd_check_eod(SMTPD_STATE *); extern char *smtpd_check_policy(SMTPD_STATE *, char *); +extern int smtpd_check_reject(SMTPD_STATE *state, int error_class, int code, const char *dsn, const char *format,...); /* LICENSE /* .ad