How to Configure Postfix to Bypass Relayhost for Specific Domains


2 views

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:

  1. Create or edit the transport file:
    example.com    :
    important-domain.net :
    *.special.com   :
    
  2. Generate the hash database:
    sudo postmap /etc/postfix/transport
    
  3. Update main.cf with these settings:
    transport_maps = hash:/etc/postfix/transport
    local_transport = local
    relay_transport = relay
    
  4. 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