On Wed, Nov 17, 2010 at 05:24:12PM +0000, George Forman wrote: > > The scenario is as follows (see log snipet below for sequence details): > The client MTA attempts to send a message. On the DOT command, Postfix > returns: '451 4.3.0 Error: queue file write error'
This happens when a milter malfunctions. Check your logs, they contain lots of relevant details. > The client MTA sends a RSET command. Postfix responds with '503 5.7.0 > Error: access denied' Postfix is intended to disconnect with a: 421 4.3.0 Mail system error The code in question: if (smtpd_milters != 0 && (state->err & CLEANUP_STAT_WRITE) != 0) state->access_denied = mystrdup("421 4.3.0 Mail system error"); does not have the intended effect. > The client MTA ignores the RSET response (based on RFC2821). It should not ignore a 5XX return code from RSET. It should disconnect. > The client MTA sends MAIL FROM command. Postfix responds with '503 5.7.0 > Error: access denied' The client is wrong to keep re-using a session after a 5XX error on RSET. > My analysis has shown the Postfix's milter interface fails when waiting > for a response. More likely, the milter, not the interface, but this is what I expected before getting this far in your post. > I am still actively investigating specifically the vstream event that > triggers CLEANUP_STAT_WRITE to be returned. Most likely a milter failed. Look in the logs! > My QUICK FIX was to modify the 503 to a 521 error code in smtpd.c > (smtpd_proto function). > I am looking for suggestions on a longer term solution. > I have made a change in smtpd_proto function: > > New code: > /* XXX We use the real client for connect access control. */ > if (state->access_denied && > (! (cmdp->action == quit_cmd || cmdp->action == rset_cmd))) { > smtpd_chat_reply(state, "%s", state->access_denied); > state->error_count++; > continue; > } No, RFC 2821/5321 notwithstanding, Postfix must reject RSET, to give clients a chance to disconnect before before real mail is rejected. So DO NOT exempt "rset_cmd". Otherwise, the change makes sense. Postfix gives the intended response after "." (Queue file write error) and the next command if any (say RSET) triggers a "421" disconnect. -- Viktor.