How to Fix “do not list domain in both mydestination and virtual_alias” Postfix Warning for Catch-All Email Configuration


5 views

When setting up a Postfix mail server with catch-all functionality, many administrators encounter this warning:

warning: do not list domain example.com in BOTH mydestination and virtual_alias

This occurs because Postfix considers these two parameters to be mutually exclusive for proper mail routing. Let's examine why this happens and the correct implementation.

mydestination specifies domains for which Postfix will accept mail and deliver to local Unix accounts. These are treated as "final destination" domains.

virtual_alias maps email addresses to other addresses, typically used for forwarding and catch-all configurations.

Your requirement has two competing needs:

  1. Server must accept mail for the domain (requires mydestination)
  2. Catch-all functionality (requires virtual_alias)

The warning appears because having the same domain in both creates potential routing conflicts. However, as you've observed, it still works because Postfix will process the virtual_alias first.

For proper catch-all implementation:

# main.cf
mydestination = localhost.$mydomain, localhost
virtual_alias_maps = hash:/etc/postfix/virtual

# /etc/postfix/virtual
@example.com    user@example.com

Then add the domain to relay_domains instead of mydestination:

relay_domains = example.com

This tells Postfix to accept mail for the domain while avoiding the mydestination/virtual_alias conflict.

For Virtualmin users, modify these settings:

# In Webmin → Postfix Mail Server → Edit Config Files
Add to relay_domains: $mydomain
Remove from mydestination: example.com

After changes:

postmap /etc/postfix/virtual
postfix reload

Test with:

postmap -q @example.com hash:/etc/postfix/virtual

For more advanced configurations:

virtual_mailbox_domains = example.com
virtual_mailbox_maps = hash:/etc/postfix/vmailbox

This completely separates the domain handling from system accounts.


When setting up a Postfix mail server with catch-all functionality, many administrators encounter this warning:

do not list domain example.com in BOTH mydestination and virtual_alias

While the system continues to function, this configuration violates Postfix's recommended practices and could lead to unexpected behavior in more complex setups.

The conflict arises because Postfix treats domains differently based on their configuration:

  • mydestination: Domains for which this server is the final destination (local delivery)
  • virtual_alias: Domains that should be aliased to other addresses

When a domain appears in both, Postfix can't determine which lookup to prioritize.

To implement catch-all functionality correctly while avoiding the warning:

# In main.cf:
mydestination = localhost.$mydomain, localhost
virtual_alias_maps = hash:/etc/postfix/virtual

# In /etc/postfix/virtual:
@example.com    username
*@example.com   username

Then rebuild the alias database:

postmap /etc/postfix/virtual
systemctl reload postfix

For more complex setups, consider using virtual mailboxes:

# main.cf:
virtual_mailbox_domains = example.com
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_alias_maps = hash:/etc/postfix/virtual

# /etc/postfix/vmailbox:
@example.com    OK

# /etc/postfix/virtual:
@example.com    username
*@example.com   username

This configuration:

  1. Properly separates domain routing (virtual_mailbox_domains) from address mapping (virtual_alias_maps)
  2. Maintains catch-all functionality through the wildcard entry
  3. Eliminates the domain duplication warning
  4. Follows Postfix's intended domain handling hierarchy

Always verify with these commands:

postconf -n | grep virtual
postconf -n | grep mydestination
postmap -q @example.com hash:/etc/postfix/virtual

Remember to restart Postfix after any configuration changes:

systemctl restart postfix