In Postfix mail server configurations, the relayhost
parameter is typically used to forward all outgoing mail through a designated SMTP server. However, there are scenarios where you might want to exclude certain domains from this routing.
# Default relayhost configuration
relayhost = [smtp.domain.net]:587
Postfix provides a powerful mechanism called transport maps to override the default relayhost behavior for specific domains:
# In main.cf
transport_maps = hash:/etc/postfix/transport
# Create/edit the transport file
sudo nano /etc/postfix/transport
# Add entries like:
example.com :
sub.example.com :
Here's the full procedure to implement domain-specific relay bypass:
- Create or edit the transport file:
example.com : important-domain.net : *.special.com :
- Generate the hash database:
sudo postmap /etc/postfix/transport
- Update main.cf with these settings:
transport_maps = hash:/etc/postfix/transport local_transport = local relay_transport = relay
- Reload Postfix:
sudo systemctl reload postfix
For more complex scenarios, you can combine transport maps with other Postfix features:
# Bypass relayhost only for specific sender domains
sender_dependent_relayhost_maps = hash:/etc/postfix/sender_relay
# File contents:
@example.com :
@special.net :
Always verify your configuration using:
postconf -n | grep transport
postmap -q example.com hash:/etc/postfix/transport
Send test emails and check mail logs (/var/log/mail.log
) to confirm the bypass is working as expected.
When configuring Postfix with a relayhost
setting, all outbound emails typically route through the specified relay server. However, there are cases where you need domain-specific routing exceptions.
Consider this standard relayhost configuration:
relayhost = [smtp.domain.net]:587
Postfix's transport_maps
feature provides granular control over message routing. Here's how to implement it:
First, create a transport map file (e.g., /etc/postfix/transport
):
# Format: domain destination
example.com :
special.net :
*.example.org :
The colon (:
) indicates local delivery for matching domains.
Edit your main.cf
:
transport_maps = hash:/etc/postfix/transport
Then compile and apply the changes:
postmap /etc/postfix/transport
systemctl reload postfix
For more complex scenarios, consider sender_dependent_relayhost_maps
:
# /etc/postfix/sender_relay
@domain1.com [relay1.example.com]:587
@domain2.com [relay2.example.net]:2525
Add to main.cf
:
sender_dependent_relayhost_maps = hash:/etc/postfix/sender_relay
Verify with:
postconf -n | grep transport_maps
postmap -q example.com hash:/etc/postfix/transport
And test email delivery with:
sendmail user@example.com << EOF
Subject: Routing Test
This should bypass the relayhost.
EOF