Exim 4 route all but one user to alternate smtp

configurationemail-serverexim

We are migrating our mail server away from EXIM and are struggling with emails generated on the host server such as webforms and system messages, as they are not being delivered to the new host.

I'm looking for a routing script that will basically stop ALL local delivery and deliver all @domain.com emails to our new server hqmail.domain.com

However there is one caveat, if it truly is – we have one function left for this server, it is addressed directly by an embedded device that knows it's ip, and it uses the server to send out status messages from alerts@domain.com to recipent@theirdomain.com That user is in the mysql database and has an elaborate bounce control system in place.

I saw that our vmail.user database had route and routed columns and tried to set them to 1, hqmail.mydomain.com thinking logic was there somewhere, but it doesn't appear to exist. That would have been super easy!

So now I'm browsing the 00_exim4-config files in the router directory and frankly completely stumped as to how to do this.

I can see from browsing that there are many ways to do this, to me it would be easiest to use the route/routed logic that I found in my 200_exim4-config_primary file

  # Relay Router
  smart_route:
   driver = manualroute
   condition = ${if eq{}{${lookup mysql {SELECT id FROM users WHERE id='${sender_address}' AND routed=1 }}}{no}{yes}}
   transport = remote_smtp
   route_data = ${lookup mysql {SELECT route FROM users WHERE id='${sender_address}' AND routed=1 }}

This looks like what I want but if I set routed=1 and put hqmail.mydomain.com in route field, it doesn't work.

I'm wondering if it doesn't work because this is above it in the file:

dnslookup_relay_to_domains:
  debug_print = "R: dnslookup_relay_to_domains for $local_part@$domain"
  driver = dnslookup
  errors_to = bounce_control
  condition = ${if eq{}{${lookup mysql {SELECT id FROM users WHERE id='${sender_address}' }}}{no}{yes}}
  domains = ! +local_domains : +relay_to_domains
  transport = remote_smtp
  same_domain_copy_routing = yes
  no_more

Any help would be appreciated!

Here is the full 200_exim-4_primary file:

### router/200_exim4-config_primary
#################################
# This file holds the primary router, responsible for nonlocal mails

.ifdef DCconfig_internet
# configtype=internet
#
# deliver mail to the recipient if recipient domain is a domain we
# relay for. We do not ignore any target hosts here since delivering to
# a site local or even a link local address might be wanted here, and if
# such an address has found its way into the MX record of such a domain,
# the local admin is probably in a place where that broken MX record
# could be fixed.

dnslookup_relay_to_domains:
  debug_print = "R: dnslookup_relay_to_domains for $local_part@$domain"
  driver = dnslookup
  errors_to = bounce_control
  condition = ${if eq{}{${lookup mysql {SELECT id FROM users WHERE id='${sender_address}' }}}{no}{yes}}
  domains = ! +local_domains : +relay_to_domains
  transport = remote_smtp
  same_domain_copy_routing = yes
  no_more




#mysql_autorespond:
#    driver = accept
#    no_verify
#    no_expn
#    debug_print = "auto responder lookup for  $local_part@$domain"
#    senders = "! ^.*-request@.*:\
#               ! ^owner-.*@.*:\
#               ! ^root@.*:\
#               ! ^postmaster@.*:\
#               ! ^listmaster@.*:\
#               ! ^mailer-daemon@.*"
#    condition = ${if eq{} {${lookup mysql{SELECT activ FROM responder WHERE \
#                ((username='$local_part' AND domain='$domain') OR (username='$local_part_prefix' AND domain='$local_part_suffix')) \
#                AND (sender ='$sender_address' or sender ='$reply_address' or sender ='*') \
#                AND activ='YES' AND valid_from <= now() AND valid_to >= now() ORDER BY sender DESC LIMIT 1 }}}{NO}{YES}}
#    unseen
#    transport = autorespond_mysql



# deliver mail directly to the recipient. This router is only reached
# for domains that we do not relay for. Since we most probably can't
# have broken MX records pointing to site local or link local IP
# addresses fixed, we ignore target hosts pointing to these addresses.

# Relay Router
  smart_route:
   driver = manualroute
   condition = ${if eq{}{${lookup mysql {SELECT id FROM users WHERE id='${sender_address}' AND routed=1 }}}{no}{yes}}
   transport = remote_smtp
   route_data = ${lookup mysql {SELECT route FROM users WHERE id='${sender_address}' AND routed=1 }}



dnslookup:
  debug_print = "R: dnslookup for $local_part@$domain"
  driver = dnslookup
  condition = ${if eq{}{${lookup mysql {SELECT id FROM users WHERE id='${sender_address}' }}}{no}{yes}}
  #errors_to = bounce_control
  domains = ! +local_domains
  transport = remote_smtp
  same_domain_copy_routing = yes
  # ignore private rfc1918 and APIPA addresses
  ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8 : 192.168.0.0/16 :\
                        172.16.0.0/12 : 10.0.0.0/8 : 169.254.0.0/16 :\
            255.255.255.255
  no_more


#denied_lookup:
#  debug_print = "R: DENIED"
#  driver = redirect
#  transport = bounce_control_pipe
#  no_more

.endif


.ifdef DCconfig_local
# configtype=local
#
# Stand-alone system, so generate an error for mail to a non-local domain
nonlocal:
  debug_print = "R: nonlocal for $local_part@$domain"
  driver = error
  domains = ! +local_domains
  allow_fail
  data = :fail: Mailing to remote domains not supported
  no_more

.endif


.ifdef DCconfig_smarthost DCconfig_satellite
# configtype=smarthost or configtype=satellite
#
# Send all non-local mail to a single other machine (smarthost).
#
# This means _ALL_ non-local mail goes to the smarthost. This will most
# probably not do what you want for domains that are listed in
# relay_domains. The most typical use for relay_domains is to control
# relaying for incoming e-mail on secondary MX hosts. In that case,
# it doesn't make sense to send the mail to the smarthost since the
# smarthost will probably send the message right back here, causing a
# loop.
#
# If you want to use a smarthost while being secondary MX for some
# domains, you'll need to copy the dnslookup_relay_to_domains router
# here so that mail to relay_domains is handled separately.

smarthost:
  debug_print = "R: smarthost for $local_part@$domain"
  driver = manualroute
  domains = ! +local_domains
  transport = remote_smtp_smarthost
  route_list = * DCsmarthost byname
  host_find_failed = defer
  same_domain_copy_routing = yes
  no_more

.endif


# The "no_more" above means that all later routers are for
# domains in the local_domains list, i.e. just like Exim 3 directors.

Best Answer

Two there should be; no more, no less:

begin routers

alerts:
   driver = accept
   condition = ${if eq{$local_part@$domain}{'recipent@theirdomain.com'}{yes}{no}}
   condition = ${if eq{$sender_address}{'alert@domain.com'}{yes}{no}}
   transport = remote_smtp

migrator:
   driver = manualroute
   condition = ${if eq{$domain}{'domain.com'}{yes}{no}}
   transport = remote_smtp
   route_data = hqmail.domain.com
   cannot_route_message = User unknown

# end routers

I hope that would help.

Related Topic