exim.conf: ###################################################################### # MAIN CONFIGURATION SETTINGS # ###################################################################### hide mysql_servers = server/maildb/username/password smtp_enforce_sync = false primary_hostname = apnicsolutions.com domainlist local_domains = @ : ${lookup mysql {SELECT userid FROM domains \ WHERE userid="${quote_mysql:${domain}}" }} domainlist relay_to_domains = #hostlist relay_from_hosts = 127.0.0.1 # domainlist relay_to_domains = *.myco.com : my.friend.org hostlist relay_from_hosts = 127.0.0.1 : 192.168.0.0/16 acl_smtp_rcpt = acl_check_rcpt #qualify_domain = mindtricks.mcxnet.com # qualify_recipient = # allow_domain_literals never_users = untrusted_set_sender = * local_sender_retain = true local_from_check = false # The setting below causes Exim to do a reverse DNS lookup on all incoming # IP calls, in order to get the true host name. If you feel this is too # expensive, you can specify the networks for which a lookup is done, or # remove the setting entirely. #host_lookup = * #rfc1413_hosts = * rfc1413_query_timeout = 0s ignore_bounce_errors_after = 12h timeout_frozen_after = 1d # freeze_tell = postmaster #################################################################### # ACL CONFIGURATION # # Specifies access control lists for incoming SMTP mail # ###################################################################### begin acl acl_check_rcpt: accept hosts = : deny local_parts = ^.*[@%!/|] : ^\\. accept local_parts = postmaster domains = +local_domains require verify = sender accept domains = +local_domains endpass message = unknown user verify = recipient accept domains = +relay_to_domains endpass message = unrouteable address verify = recipient accept hosts = +relay_from_hosts accept authenticated = * deny message = relay not permitted accept hosts = : +relay_from_hosts accept condition = \ ${if \ and {\ {match{$recipients}{\N?\N}}\ {match{$h_to:}{\N>?(abuse|postmaster)@(.+\.)?sput\.nl{$spam_score_int}{50}{1}{0}} ###################################################################### # ROUTERS CONFIGURATION # # Specifies how addresses are handled # ###################################################################### # THE ORDER IN WHICH THE ROUTERS ARE DEFINED IS IMPORTANT! # # An address is passed to each router in turn until it is accepted. # ###################################################################### begin routers dnslookup: driver = dnslookup domains = ! +local_domains transport = remote_smtp ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8 no_more spamcheck_router: no_verify check_local_user condition = "${if and { \ {!def:h_X-Spam-Flag:} \ {!eq {$received_protocol}{spam-scanned}} \ {eq {${lookup mysql{SELECT spam FROM users WHERE id='${quote_mysql:${local_part}@${domain}}'}}}{1}} \ } {1}{0}}" driver = accept transport = spamcheck #spamdeliver_router: # driver = redirect # allow_fail # allow_defer # condition = "${if match {$h_x-spam-status:}{Yes} {1}{0} }" # data = ${lookup mysql{ SELECT maildir FROM users \ # WHERE id='${quote_mysql:${local_part}@${domain}}' }}/.Junk # file_transport = address_directory # directory_transport = address_directory system_aliases: driver = redirect allow_fail allow_defer data = ${lookup{$local_part}lsearch{/etc/aliases}} file_transport = address_file pipe_transport = address_pipe condition = ${if eq {$domain}{$primary_hostname} {yes}{no} } #localuser: # driver = accept # check_local_user # group=mail # transport = local_delivery # condition = ${if eq {$domain}{$primary_hostname} {yes}{no} } #userforward: # driver = redirect # check_local_user # file = $home/.forward # no_verify # no_expn # check_ancestor ## allow_filter # file_transport = address_file # directory_transport = address_directory # reply_transport = address_reply userforward: driver = redirect allow_fail allow_defer condition = "${lookup mysql{SELECT forward_enable FROM users WHERE id='${quote_mysql:${local_part}@${domain}}' }}" # condition = ${lookup{$local_part@$domain}lsearch{/email/forward_enable}} file = /email/${domain}/${local_part}.forward user = ${local_part}-${domain} no_verify no_expn allow_filter file_transport = address_file pipe_transport = address_pipe directory_transport = address_directory reply_transport = address_reply virtual_userforward: driver = redirect data = ${lookup mysql{SELECT forward FROM fw WHERE \ email='${quote_mysql:${local_part}@${domain}}'}} virtual_user: driver = redirect allow_fail allow_defer data = ${lookup mysql{ SELECT maildir FROM users \ WHERE id='${quote_mysql:${local_part}@${domain}}' }} file_transport = address_directory directory_transport = address_directory virtual_all_aliases: driver = redirect data = ${lookup mysql{SELECT forward FROM fw WHERE email= \ '@${quote_mysql:${domain}}'}} ###################################################################### # TRANSPORTS CONFIGURATION # ###################################################################### # ORDER DOES NOT MATTER # # Only one appropriate transport is called for each delivery. # ###################################################################### begin transports remote_smtp: driver = smtp spamcheck: driver = pipe command = /usr/exim/bin/exim -oMr spam-scanned -bS use_bsmtp = true transport_filter = /usr/bin/spamc home_directory = "/tmp" current_directory = "/tmp" user = mail group = mail log_output = true return_fail_output = true return_path_add = false message_prefix = message_suffix = local_delivery: driver = appendfile file = /var/mail/$local_part delivery_date_add envelope_to_add return_path_add address_pipe: driver = pipe return_fail_output return_path_add environment = EXTENSION=${substr_1:$local_part_suffix} address_file: driver = appendfile delivery_date_add envelope_to_add return_path_add address_directory: driver = appendfile maildir_format delivery_date_add envelope_to_add return_path_add address_reply: driver = autoreply ###################################################################### # RETRY CONFIGURATION # ###################################################################### begin retry # This single retry rule applies to all domains and all errors. It specifies # retries every 15 minutes for 2 hours, then increasing retry intervals, # starting at 1 hour and increasing each time by a factor of 1.5, up to 16 # hours, then retries every 6 hours until 4 days have passed since the first # failed delivery. # Domain Error Retries # ------ ----- ------- * * F,2h,15m; G,16h,1h,1.5; F,2d,3h ###################################################################### . . . User's filter file: #Exim filter if $h_X-Spam-Status: CONTAINS "Yes" or "${if def:h_X-Spam-Flag {def}{undef}}" is "def" then #just deliver as normal finish endif unseen deliver deliver finish I'm guessing this filter is probably incorrect however