Postfix Alias Domains Explained: Why “info@alias.com” Fails When “info@main.com” Works


2 views

Many Postfix administrators assume domain aliasing works like email forwarding - where any address at the alias domain should resolve to the same address at the target domain. However, Postfix implements this differently for important technical reasons.

In your main.cf, you likely have something like:

virtual_alias_domains = alias.com
virtual_alias_maps = hash:/etc/postfix/virtual

The critical file is /etc/postfix/virtual where mappings must be explicit:

# THIS WON'T WORK AS EXPECTED
@alias.com @main.com

# YOU NEED EXPLICIT MAPPINGS
info@alias.com info@main.com
sales@alias.com sales@main.com

Postfix treats virtual alias domains as completely separate domains that just happen to forward to another domain. This design:

  • Prevents email loops
  • Maintains clear domain separation in the MTA
  • Allows for partial domain aliasing (some addresses but not all)

For those managing many alias domains, here are scalable approaches:

Option 1: Generate Mappings Programmatically

#!/bin/bash
# Generate mappings for 50 aliases
for i in {1..50}; do
  echo "user${i}@alias.com user${i}@main.com" >> /etc/postfix/virtual
done
postmap /etc/postfix/virtual
systemctl reload postfix

Option 2: Use LDAP or SQL Lookups

virtual_alias_maps = ldap:/etc/postfix/ldap-aliases.cfg

Always verify with:

postmap -q info@alias.com hash:/etc/postfix/virtual
# Should return: info@main.com

And test SMTP acceptance:

telnet localhost 25
MAIL FROM: test@example.com
RCPT TO: info@alias.com

For some use cases, this may be preferable:

virtual_alias_maps = 
    regexp:/etc/postfix/filter_aliases,
    hash:/etc/postfix/virtual

Where filter_aliases contains:

/^(.+)@alias\.com$/ ${1}@main.com

Many administrators assume Postfix's alias domains function like simple email forwarding - where alias.com automatically mirrors all addresses from main.com. However, the reality involves more nuanced virtual mailbox mapping.

Postfix treats alias domains as domain-level rather than address-level aliases. When you configure:

alias.com => main.com

Postfix only performs domain substitution during delivery. The system still requires explicit mailbox definitions for each address at the alias domain.

Your error occurs because while the domain mapping exists, Postfix cannot find:

info@alias.com

in your virtual mailbox table. The solution requires either:

  1. Creating parallel mailboxes for all aliases
  2. Implementing virtual alias expansion

Modify your main.cf:

virtual_alias_maps = hash:/etc/postfix/virtual_aliases

Then in /etc/postfix/virtual_aliases:

info@alias.com    info@main.com
sales@alias.com   sales@main.com

Run postmap /etc/postfix/virtual_aliases and reload Postfix.

For dynamic handling of multiple alias domains:

virtual_alias_maps = pcre:/etc/postfix/virtual_aliases.pcre

Then in virtual_aliases.pcre:

/^(.*)@alias\.com$/    ${1}@main.com
/^(.*)@alias2\.com$/   ${1}@main.com

Always verify with:

postmap -q "info@alias.com" hash:/etc/postfix/virtual_aliases

And check for syntax errors:

postfix check