> > if (*var_mailbox_transport) { > > state.msg_attr.rcpt.offset = -1L; > > *statusp = deliver_pass(MAIL_CLASS_PRIVATE, var_mailbox_transport, > > state.request, &state.msg_attr.rcpt); > > return (YES); > > } > > Apparently, var_mailbox_transport is not set, and therefore, the > address is looked up in the UNIX system account database. I won't > speculate about possible causes for this.
In this case we should see a similar log entry with 'deliver_mailbox' too: Feb 16 15:10:24 NEWMTA postfix/local[6860]: deliver_dotforward[7]: local +trash recip +tr...@newmta.example.com exten deliver tr...@newmta.example.com exp_from trash However we don't. Look the end of deliver_switch(): if (deliver_dotforward(state, usr_attr, &status) == 0 && deliver_mailbox(state, usr_attr, &status) == 0) status = deliver_unknown(state, usr_attr); Function deliver_dotforward() returns with nonzero (i.e. YES) therefore deliver_mailbox() is not called at all. The above lines were the same in 2.7 so the difference must be in deliver_dotforward(). @@ -126,7 +127,15 @@ * Skip non-existing users. The mailbox delivery routine will catch the * error. */ - if ((mypwd = mypwnam(state.msg_attr.user)) == 0) + if ((errno = mypwnam_err(state.msg_attr.user, &mypwd)) != 0) { + msg_warn("error looking up passwd info for %s: %m", + state.msg_attr.user); + dsb_simple(state.msg_attr.why, "4.0.0", "user lookup error"); + *statusp = defer_append(BOUNCE_FLAGS(state.request), + BOUNCE_ATTR(state.msg_attr)); + return (YES); + } + if (mypwd == 0) return (NO); I guess the new mypwnam_err() cannot do the check therefore deliver_dotforward() returns immediately with YES. Tomorrow I track down what mypwnam_err() does. :-) Regards Gabor