Quanah Gibson-Mount:
> Apr 22 14:42:50 zqa-061 postfix/trivial-rewrite[30487]: warning: do not 
> list domain zqa-061.eng.vmware.com in BOTH mydestination and 
> virtual_mailbox_domains
...
> mydestination = localhost

This may happen with any Postfix release when $myhostname is not
listed in mydestination. This Postfix limitation is easy to fix.

The following requires some patience from the reader.

Normal scenario:

    As trivial-rewrite resolves (tries to figure out where to
    deliver) an email address, it strips off domains that match
    $mydestination, and saves the last stripped-off domain.

    If this process reduces the address to just a recipient local-part,
    then the resolver concludes that the address is in the "local
    address class".  At that point we have the recipient localpart
    and the saved last stripped-off domain that matched $mydestination.

Error scenario:

    In rare cases the trivial-rewrite resolver is given a domain-less
    address (for example, the null recipient address).  In that
    case the resolver concludes that the destination is in the
    "local address class" (1). And if the recipient local-part is
    empty the resolver replaces it with "mailer-daemon".

    At that point we have a recipient localpart, but we don't have
    a saved last stripped-off domain.  However Postfix does not
    work with domain-less addresses, so trivial-rewrite uses
    $myhostname as a surrogate for the saved last stripped-off
    domain (2).

Trivial-rewrite logs the above warning when the surrogate domain
that was chosen in (2) is not in the address class that was chosen
in (1).

The discrepancy is eliminated by re-resolving the recipient localpart
plus surrogate domain, so that it pops out of the resolver with the
correct address class for the surrogate domain.

The patch below maintains full backwards compatibility; if that
were not a concern it would technically be more correct to call
"rewrite_tree(&local_context, tree);" which appends @myorigin,
instead of the two ad-hoc tok822_sub_append() calls that append
@myhostname.

        Wietse

*** ./src/trivial-rewrite/resolve.c-    Mon Oct  1 16:57:50 2012
--- ./src/trivial-rewrite/resolve.c     Tue Apr 23 13:19:28 2013
***************
*** 324,332 ****
            tok822_free(tree->head);
            tree->head = 0;
        }
!       /* XXX must be localpart only, not user@domain form. */
!       if (tree->head == 0)
            tree->head = tok822_scan(var_empty_addr, &tree->tail);
  
        /*
         * We're done. There are no domains left to strip off the address,
--- 324,341 ----
            tok822_free(tree->head);
            tree->head = 0;
        }
!       /* XXX Re-resolve the surrogate, in case not in user@domain form. */
!       if (tree->head == 0) {
            tree->head = tok822_scan(var_empty_addr, &tree->tail);
+           continue;
+       }
+ 
+       /* XXX Re-resolve with myhostname for backwards compatibility. */
+       if (domain == 0 && saved_domain == 0) {
+           tok822_sub_append(tree, tok822_alloc('@', (char *) 0));
+           tok822_sub_append(tree, tok822_scan(var_myhostname, (TOK822 **) 0));
+           continue;
+       }
  
        /*
         * We're done. There are no domains left to strip off the address,

Reply via email to