On Apr 25, 2011, at 10:22 PM, William Ono wrote:

> Hello all,
> 
> Yes, this again. I promise it's slightly different this time.
> 
> I have users in LDAP and they're brought in as local users by
> libnss-ldapd. With local_recipient_maps set to use a LDAP map instead of
> unix:passwd.byname, smtpd correctly tempfails incoming mail when the
> LDAP service is unavailable. This is all working fine.
> 
> However, for mail that originates on the mail host, e.g. by mail(1),
> when an LDAP outage causes local users to disappear (getent passwd
> username returns no results with exit code 2) local bounces the mail as
> user unknown. While this is not surprising behaviour, it is not the
> desired behaviour, either.
> 
> I was hoping that setting mailbox_transport_maps to the same LDAP map as
> local_recipient_maps would cause local to tempfail rather than bounce in
> this case. It turns out that it does not.
> 
> Digging into the code, in deliver_mailbox() I see a call to maps_find()
> that isn't followed by a check on dict_errno. I think this is a bug. If
> maps_find() sets dict_errno to DICT_ERR_RETRY, deliver_mailbox() should
> fail the delivery and expect a retry later. But my C is very rusty and
> this is not trivial code so I haven't gotten any further than that.
> 
> local/mailbox.c:280 in deliver_mailbox():
> 
>    /* The -1 is a hint for the down-stream deliver_completed() function. */
>    if (*var_mbox_transp_maps
>        && (map_transport = maps_find(transp_maps, state.msg_attr.user,
>                                      DICT_FLAG_NONE)) != 0) {
>        state.msg_attr.rcpt.offset = -1L;
>        *statusp = deliver_pass(MAIL_CLASS_PRIVATE, map_transport,
>                                state.request, &state.msg_attr.rcpt);
>        return (YES);
>    }
>    if (*var_mailbox_transport) {
>        ...
> 
> Is there a better way to do what I'm trying to do, which is to tempfail
> instead of bounce when LDAP/NSS is not working correctly? (I appreciate
> that it's not Postfix's fault that NSS isn't distinguishing not found
> from an error, but that doesn't help me get this working.)
> 
> If you're curious, nscd is not a complete solution here (though I am using
> it) because, after a cold start, it's likely that Postfix on one host will
> come up before the LDAP service on another host. They're both virtual
> machines on the same hardware. It's not ideal but this is too small of a
> shop to do anything bigger than that.
> 
> Thanks.
> 

greetings

for ldap transport I added an ldap attribute " mailHost " then did my transport 
map based on the entry

transport_maps = ldap:/etc/postfix/primary_transport, 
ldap:/etc/postfix/secondary_transport

server_host = 10.1.1.15 
search_base = dc=myldapserver,dc=my,dc=domain,dc=com
query_filter = (mail=%s)
result_attribute = mailHost
result_filter = smtp:[%s]
bind = no

Reply via email to