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:
- Creating parallel mailboxes for all aliases
- 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