On 24 Feb 2010, at 22:54, Phil Pennock wrote:

> On 2010-02-24 at 19:10 +0000, Jonathan Gilpin wrote:
>> On 24 Feb 2010, at 18:51, Phil Pennock wrote:
>> 
>>> On 2010-02-24 at 18:16 +0000, Jonathan Gilpin wrote:
>>>> I'm not using smtp... I have a catchall alias of *...@domain going to a 
>>>> maildir. I then end up with a message with two addresses in the 
>>>> Envelope-To: E.G
>>> 
>>> So can you *please* provide the relevant configuration (Router and
>>> Transport) so that we have something to look at and work from to
>>> diagnose the problem, instead of working blind?
>> 
>> For the routers I have:
> 
> [ Snip 4 routers, none of which is the Router causing the problem ]
> 
>> A mail to: [email protected] and [email protected] both if which do not exist 
>> are caught by the catchall, one email is delivered as shows in the logs:
>> 
>> 2010-02-24 18:15:02 1NkLlE-000AJ2-Pu SA: Action: scanned but message isn't 
>> spam: score=2.9 required=4.0 (scanned in 2/2 secs | Message-Id: 
>> [email protected]). From 
>> <[email protected]> (local) for [email protected], [email protected]
>> 2010-02-24 18:15:02 1NkLlE-000AJ2-Pu => postmaster <[email protected]> 
>> R=virtual_local_mailbox T=virtual_local_md_delivery
> 
> Okay, so you've rewritten the recipient in another Router which you
> haven't shown us.  Two of the SMTP RCPT recipients have been rewritten
> to the same SMTP recipient, and Exim is not delivering twice to the
> *same* recipient, as routed.
> 
> This is a very different problem to the one described.
> 
> Your catchall is causing you to only try to deliver one copy.
> 
> Instead of using a catchall "redirect" router, use a catchall "accept"
> router, which stores the mail in the catchall folder directly, but
> routed for the original address.

Hi, I am using an accept not a redirect. I have included the full config below. 
Hope you can spot something...

######################################################################
#                    MAIN CONFIGURATION SETTINGS                     #
######################################################################

# MySQL defines
MYSQL_SERVER=localhost
MYSQL_USER=mailnull
MYSQL_PASSWORD=******
MYSQL_DB=exim
MYSQL_EMAILTABLE=emailtable
MYSQL_DOMAINTABLE=domaintable
MYSQL_DOMAINRTABLE=relaytable
MYSQL_WHITETABLE=whitelist
MYSQL_BLACKTABLE=blacklist
MYSQL_AUTHTABLE=emailtable

local_interfaces = /snipped/

# MySQL queries
MYSQL_Q_ISAWAY=SELECT domain FROM MYSQL_EMAILTABLE WHERE 
domain='${quote_mysql:$domain}' AND local_part='${quote_mysql:$local_part}' AND 
is_away='yes'
MYSQL_Q_AWAYTEXT=SELECT away_text FROM MYSQL_EMAILTABLE WHERE 
domain='${quote_mysql:$domain}' AND local_part='${quote_mysql:$local_part}'
MYSQL_Q_FORWARD=SELECT forward FROM MYSQL_EMAILTABLE WHERE 
domain='${quote_mysql:$domain}' AND local_part='${quote_mysql:$local_part}' AND 
forward != ''
MYSQL_Q_CC=SELECT cc FROM MYSQL_EMAILTABLE WHERE 
domain='${quote_mysql:$domain}' AND local_part='${quote_mysql:$local_part}'
MYSQL_Q_ALIASES=SELECT substring(address, locate('@', address) +1) FROM 
MYSQL_EMAILTABLE,aliases WHERE emailtable.email = aliases.destination and 
(aliases.address = '${quote_mysql:$local_pa...@${quote_mysql:$domain}' or 
aliases.address = '*...@${quote_mysql:$domain}')
#MYSQL_Q_ALIASES=SELECT destination FROM MYSQL_EMAILTABLE,aliases WHERE 
emailtable.email = aliases.destination and (aliases.address = 
'${quote_mysql:$local_pa...@${quote_mysql:$domain}' or aliases.address = 
'*...@${quote_mysql:$domain}')
MYSQL_Q_LOCAL=SELECT domain FROM MYSQL_EMAILTABLE WHERE 
domain='${quote_mysql:$domain}' AND (local_part='${quote_mysql:$local_part}' or 
local_part='*') AND mail != ''
MYSQL_Q_WCLOCAL=SELECT domain FROM MYSQL_EMAILTABLE WHERE 
domain='${quote_mysql:$domain}' AND local_part='*' AND forward != ''
MYSQL_Q_WCLOCFW=SELECT forward FROM MYSQL_EMAILTABLE WHERE 
domain='${quote_mysql:$domain}' AND local_part='*' AND forward != ''
MYSQL_Q_LDOMAIN=SELECT DISTINCT domain FROM MYSQL_DOMAINTABLE WHERE 
domain='$domain'
MYSQL_Q_RDOMAIN=SELECT DISTINCT domain FROM MYSQL_DOMAINRTABLE WHERE 
domain='$domain'
MYSQL_Q_RELAYIP=SELECT ip from relayhosts
MYSQL_Q_BOXNAME=SELECT mail FROM MYSQL_EMAILTABLE WHERE 
domain='${quote_mysql:$domain}' AND (local_part='${quote_mysql:$local_part}' or 
local_part='*')
MYSQL_Q_ABOXNAME=SELECT mail FROM MYSQL_EMAILTABLE,aliases WHERE 
emailtable.email = aliases.destination and 
(aliases.address='${quote_mysql:$local_pa...@${quote_mysql:$domain}' or 
aliases.address = '*...@${quote_mysql:$domain}')
MYSQL_Q_SPAMC=SELECT domain FROM MYSQL_EMAILTABLE WHERE 
domain='${quote_mysql:$domain}' AND (local_part='${quote_mysql:$local_part}' or 
local_part='*' ) AND opt_spamscan='yes'
MYSQL_Q_ASPAMC=SELECT substring(address, locate('@', address) +1) FROM 
MYSQL_EMAILTABLE,aliases WHERE emailtable.email = aliases.destination and 
(aliases.address = '${quote_mysql:$local_pa...@${quote_mysql:$domain}' or 
aliases.address = '*...@${quote_mysql:$domain}') AND opt_spamscan='yes'
#MYSQL_Q_ASPAMC=SELECT destination FROM MYSQL_EMAILTABLE,aliases WHERE 
emailtable.email = aliases.destination and (aliases.address = 
'${quote_mysql:$local_pa...@${quote_mysql:$domain}' or aliases.address = 
'*...@${quote_mysql:$domain}') AND opt_spamscan='yes'
MYSQL_Q_VSCAN=SELECT domain FROM MYSQL_EMAILTABLE WHERE 
domain='${quote_mysql:$domain}' AND local_part='${quote_mysql:$local_part}' AND 
opt_virscan='yes'
MYSQL_Q_SPAMPURGE=SELECT domain FROM MYSQL_EMAILTABLE WHERE 
domain='${quote_mysql:$domain}' AND (local_part='${quote_mysql:$local_part}' or 
local_part='*') AND opt_spampurge='yes'
#MYSQL_Q_DISCLAIMER=SELECT domain FROM MYSQL_EMAILTABLE WHERE 
domain='${quote_mysql:$domain}' AND (local_part='${quote_mysql:$local_part}' or 
local_part='Postmaster') AND disclaimer='1'
MYSQL_Q_DISCLAIMER=SELECT domain FROM MYSQL_EMAILTABLE WHERE 
email='${quote_mysql:$authenticated_id}' AND disclaimer='1'
MYSQL_Q_DISABLED=SELECT domain FROM MYSQL_EMAILTABLE WHERE 
domain='${quote_mysql:$domain}' AND local_part='${quote_mysql:$local_part}' AND 
is_enabled='no'
MYSQL_Q_WHITELIST=SELECT DISTINCT MYSQL_WHITETABLE.address FROM 
MYSQL_WHITETABLE WHERE '${quote_mysql:$sender_address}' LIKE whitelist.address
MYSQL_Q_BLACKLIST=SELECT DISTINCT MYSQL_BLACKTABLE.address FROM 
MYSQL_BLACKTABLE WHERE '${quote_mysql:$sender_address}' LIKE blacklist.address
#MYSQL_Q_AUTHPWD1=SELECT concat(local_part,'@',domain) FROM MYSQL_AUTHTABLE 
WHERE email ='$2' AND password='$3'
MYSQL_Q_AUTHPWD1=SELECT concat(local_part,'@',domain) FROM MYSQL_AUTHTABLE 
WHERE concat(local_part,'@',domain) ='$2' AND password='$3'
#MYSQL_Q_AUTHPWD2=SELECT concat(local_part,'@',domain) FROM MYSQL_AUTHTABLE 
WHERE email = '$1' AND password='$2'
MYSQL_Q_AUTHPWD2=SELECT concat(local_part,'@',domain) FROM MYSQL_AUTHTABLE 
WHERE concat(local_part,'@',domain) = '$1' AND password='$2'
# MySQL connection
hide mysql_servers = "MYSQL_SERVER/MYSQL_DB/MYSQL_USER/MYSQL_PASSWORD"

# starting 'normal' config

#
#delay_warning = 0s
#deliver_queue_load_max = 99
#ignore_bounce_errors_after = 0s
#return_size_limit = 10000
#queue_only_load = 3
#queue_run_max = 5
#smtp_accept_queue = 10
#strip_trailing_dot
#split_spool_directory
#remote_max_parallel = 40
#
primary_hostname = hostname

domainlist local_domains = mysql;MYSQL_Q_LDOMAIN
pid_file_path = /var/run/exim.pid

domainlist relay_to_domains = mysql;MYSQL_Q_RDOMAIN
hostlist   relay_from_hosts = ${lookup 
mysql{MYSQL_Q_RELAYIP}{${sg{$value}{\\n}{ : }} }} 
#mysql;MYSQL_Q_RELAYIP

domainlist noreverse = various domains

acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data
av_scanner = clamd:/var/run/clamav/clamd.sock

qualify_domain = fluent18.fluent.ltd.uk 
# qualify_recipient =

# allow_domain_literals
smtp_accept_max = 500 

never_users = root
#trusted_users = list # : amavis
trusted_users = mailnull

host_lookup = *
rfc1413_hosts = *
smtp_enforce_sync = false
rfc1413_query_timeout = 2s

check_spool_space = 50M
check_log_space = 20M
return_size_limit = 20k
message_size_limit = 20M

# sender_unqualified_hosts =
# recipient_unqualified_hosts =

# percent_hack_domains =

ignore_bounce_errors_after = 2h
timeout_frozen_after = 4d

deliver_queue_load_max = 8
queue_only_load = 10
remote_max_parallel = 15

#tls_certificate = 
#tls_privatekey = 
#tls_advertise_hosts = *

######################################################################
#                       ACL CONFIGURATION                            #
#         Specifies access control lists for incoming SMTP mail      #
######################################################################

begin acl

acl_check_rcpt:
  accept  hosts = :
  deny    domains       = +local_domains
          local_parts   = ^[.] : ^...@%!/|]
  deny    domains       = !+local_domains
          local_parts   = ^[./|] : ^...@%!] : ^.*/\\.\\./
  accept  local_parts   = postmaster
          domains       = +local_domains

#  deny    message       = Reverse DNS lookup failed for host 
$sender_host_address.
#          log_message   = Reverse DNS lookup failed
#         domains       = !+noreverse
#         hosts         = !+relay_from_hosts
#         !authenticated = *
#          !verify       = reverse_host_lookup
  drop    log_message   = match sbl-xbl.spamhaus.org
          !authenticated = *
          dnslists      = sbl-xbl.spamhaus.org
  deny    message       = Access denied - $sender_host_address listed by 
$dnslist_domain\n$dnslist_text
          !authenticated = *
          dnslists      = dnsbl.sorbs.net 
#  require verify        = sender
  accept  domains       = +local_domains
          endpass
          verify        = recipient
  accept  domains       = +relay_to_domains
          endpass
          verify        = recipient
  deny    message       = $sender_host_address is not allowed to send mail from 
$sender_address_domain
          log_message   = SPF check failed
          spf           = fail
  accept  hosts         = +relay_from_hosts

  accept  authenticated = *
          add_header    = X-AuthenticatedID: $authenticated_id
          add_header    = X-OriginalFromAdr: $sender_address
  deny    message       = relay not permitted

acl_check_data:
  deny    message       = X-Quarantine-Me-Malware: $malware_name
          log_message   = malware: $malware_name
          demime        = *
          malware       = */defer_ok
  accept


######################################################################
#                      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

fail_router:
  driver = redirect
  domains = ${lookup mysql {MYSQL_Q_DISABLED}{$value}}
  data = ":fail:"
  allow_fail

##uncomment, if you plan to use mailman (www.list.org)
#mailman_aliases:
#  driver = redirect
#  allow_fail
#  allow_defer
#  data = ${lookup{$local_part}lsearch{/etc/aliases.mailman}}
#  file_transport = address_file
#  pipe_transport = address_pipe

#amavis_director:
#  driver = manualroute
#  domains = ${lookup mysql {MYSQL_Q_VSCAN}{$value}}
#  condition = "${if or { \
#        {eq{$received_protocol}{scanned-ok}} \
#        {eq{$received_protocol}{spam-scanned}} \
# if you like to scan mails from localhost too, then comment the following line 
(not good for big mailman lists...)
#        {eq{$sender_host_address}{127.0.0.1}} \
#      } \ 
#    {0}{1}}"
#  route_list = "* localhost byname"
#  transport = amavis
#  verify = false

#check_malware:
#  driver                = redirect
#  condition             = ${if def:h_X-Quarantine-Me-Malware: {1}{0}}
#  headers_add           = X-Quarantined-Malware: $h_X-Quarantine-Me-Malware:
#  headers_remove        = X-Quarantine-Me-Malware
#  data                  = /var/db/malware/malware.$tod_logfile
#  file_transport        = address_file

check_disclaimer:
   driver = dnslookup
# domains = ! +local_domains :
#   domains = ${lookup mysql {MYSQL_Q_SPAMPURGE}{$value}}
#   domains = ${lookup mysql {MYSQL_Q_DISCLAIMER}{$value}}
   senders = ${lookup mysql {MYSQL_Q_DISCLAIMER}{$value}}
#   domains = !+rfwrutherfords
   transport = disclaimer_pipe
   same_domain_copy_routing = yes
   no_more 

dnslookup:
  driver = dnslookup
  domains = !+local_domains
  transport = remote_smtp
  ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
  no_more

blacklist_router:
  driver = manualroute
  senders = ${lookup mysql {MYSQL_Q_BLACKLIST}{$value}}
  condition = "${if !def:h_X-Spam-Flag: {1}{0}}"
  headers_add = X-Spam-Flag: YES
  route_list = * localhost
  self = pass

system_aliases:
  driver = redirect
  allow_fail
  allow_defer
  data = ${lookup{$local_part}lsearch{/etc/aliases}}
# user = exim
  file_transport = address_file
  pipe_transport = address_pipe

virtual_forward_director:
  driver = redirect
  data = ${lookup mysql {MYSQL_Q_FORWARD}{$value}}

virtual_cc_director:
  driver = redirect
  data = ${lookup mysql {MYSQL_Q_CC}{$value}}
  unseen

spamcheck_director:
  driver = manualroute
  domains = ${lookup mysql {MYSQL_Q_SPAMC}{$value}}
  senders = ! ${lookup mysql {MYSQL_Q_WHITELIST}{$value}}
  condition = ${if and { \
    {!eq {$received_protocol}{spam-scanned}} \
    {!eq {$received_protocol}{local}} \
    } {1}{0}}
  headers_remove = X-Spam-Flag
  route_list = "* localhost byname"
  transport = spamcheck
  verify = false

#spamcheck_alias_director:
#  driver = manualroute
#  domains = ${lookup mysql {MYSQL_Q_ASPAMC}{$value}}
#  senders = ! ${lookup mysql {MYSQL_Q_WHITELIST}{$value}}
#  condition = ${if and { \
#    {!eq {$received_protocol}{spam-scanned}} \
#    {!eq {$received_protocol}{local}} \
#    } {1}{0}}
#  headers_remove = X-Spam-Flag
#  route_list = "* localhost byname"
#  transport = spamcheck
#  verify = false


spampurge_director:
  driver = manualroute
  domains = ${lookup mysql {MYSQL_Q_SPAMPURGE}{$value}}
  condition = "${if eq{$h_X-Spam-Flag:}{YES} {1}{0}}"
  route_list = "* localhost byname"
  transport = devnull_transport
  verify = false

vacation_director:
  driver = accept
  domains = ${lookup mysql {MYSQL_Q_ISAWAY}{$value}}
  transport = vacation_autoreply
  unseen  

mysql_aliases:
  driver = redirect
  file_transport = address_file
  pipe_transport = address_pipe
  data = ${lookup mysql{SELECT destination FROM aliases,emailtable WHERE 
emailtable.email = aliases.destination and (aliases.address = 
'${quote_mysql:$local_pa...@${quote_mysql:$domain}' or aliases.address = 
'*...@${quote_mysql:$domain}')}}


spamcheck_alias_director:
  driver = manualroute
  domains = ${lookup mysql {MYSQL_Q_ASPAMC}{$value}}
  senders = ! ${lookup mysql {MYSQL_Q_WHITELIST}{$value}}
  condition = ${if and { \
    {!eq {$received_protocol}{spam-scanned}} \
    {!eq {$received_protocol}{local}} \
    } {1}{0}}
  headers_remove = X-Spam-Flag
  route_list = "* localhost byname"
  transport = spamcheck
  verify = false

#mysql_aliases:
#  driver = redirect
#  file_transport = address_file
#  pipe_transport = address_pipe
#  data = ${lookup mysql{SELECT destination FROM aliases,emailtable WHERE 
emailtable.email = aliases.destination and (aliases.address = 
'${quote_mysql:$local_pa...@${quote_mysql:$domain}' or aliases.address = 
'*...@${quote_mysql:$domain}')}}
  #add_header    = X-Envelope-To: 
${quote_mysql:$local_pa...@${quote_mysql:$domain} 

virtual_local_spam:
  driver = accept
  condition = "${if eq{$h_X-Spam-Flag:}{YES} {1}{0}}"
  domains = ${lookup mysql {MYSQL_Q_LOCAL}{$value}}
  transport = virtual_local_spam_delivery

virtual_local_mailbox:
  driver = accept
  domains = ${lookup mysql {MYSQL_Q_LOCAL}{$value}}
  transport = virtual_local_md_delivery

#virtual_wclocal_redirect:
#  driver = redirect
#  driver = accept
#  domains = ${lookup mysql {MYSQL_Q_WCLOCAL}{$value}}
#  data = ${lookup mysql {MYSQL_Q_WCLOCFW}{$value}}
#  transport = virtual_local_md_delivery

virtual_alias:
   driver = accept
   domains = ${lookup mysql {MYSQL_Q_ALIASES}{$value}}
   transport = virtual_local_alias_delivery
      
######################################################################
#                      TRANSPORTS CONFIGURATION                      #
######################################################################
#                       ORDER DOES NOT MATTER                        #
#     Only one appropriate transport is called for each delivery.    #
######################################################################

begin transports

disclaimer_pipe:
  driver = smtp
  debug_print = "T: add_company_details_remote_smtp for $local_p...@$domain" 
  transport_filter = /usr/local/bin/altermime --log-syslog --input=- 
--disclaimer=/usr/local/mail/disclaimers/rfwrutherfords.com.txt 
--disclaimer-html=/usr/local/mail/disclaimers/rfwrutherfords.com.html
  size_addition = 1 

remote_smtp:
  driver = smtp
#  interface = 195.78.94.248

devnull_delivery:
  driver = appendfile
  file = /dev/null
  group = mail

address_pipe:
  driver = pipe
  return_output

address_file:
  driver = appendfile
  delivery_date_add
  envelope_to_add
  return_path_add

address_reply:
  driver = autoreply

#amavis:
#  driver = pipe
#  command = "/usr/sbin/amavis <${sender_address}> ${pipe_addresses}"
#  message_prefix =
#  message_suffix =
#  check_string =
#  escape_string =
## for debugging change return_output to true
#  return_output = false
#  return_path_add = false
#  user = amavis
#  group = mail
#  path = "/bin:/sbin:/usr/bin:/usr/sbin"
#  current_directory = "/var/amavis"

spamcheck:
  driver = pipe
  command = /usr/local/sbin/exim -oMr spam-scanned -bS
  use_bsmtp = true
  transport_filter = "/usr/local/bin/spamc"
  home_directory = "/tmp"
  current_directory = "/tmp"
  user = mailnull
  group = mail
  log_output = true
  return_fail_output = true
  return_path_add = false
  message_prefix =
  message_suffix =


virtual_local_alias_delivery:
  driver = appendfile
  directory = ${lookup mysql {MYSQL_Q_ABOXNAME}{$value}}
  maildir_format
  user = mailnull
  group = mail
  mode = 0660
  directory_mode = 0770
  envelope_to_add
  return_path_add


virtual_local_md_delivery:
  driver = appendfile
  directory = ${lookup mysql {MYSQL_Q_BOXNAME}{$value}}
  maildir_format
  user = mailnull
  group = mail
  mode = 0660
  directory_mode = 0770
  envelope_to_add
  return_path_add

virtual_local_spam_delivery:
  driver = appendfile
  directory = ${lookup  mysql {MYSQL_Q_BOXNAME}{$value}}/.Spam
  maildir_format
  user = mailnull
  group = mail
  mode = 0660
  directory_mode = 0770
  envelope_to_add
  return_path_add

vacation_autoreply:
  driver = autoreply
  to = ${sender_address}
  from = "vacat...@${domain}"
  subject = "AutoResponder for ${local_pa...@${domain}"
  text = ${lookup mysql {MYSQL_Q_AWAYTEXT}{$value}}

devnull_transport:
  driver = appendfile
  file = /dev/null
  user = mailnull

######################################################################
#                      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,4d,6h



######################################################################
#                      REWRITE CONFIGURATION                         #
######################################################################

# There are no rewriting specifications in this default configuration file.
begin rewrite



######################################################################
#                   AUTHENTICATION CONFIGURATION                     #
######################################################################

# There are no authenticator specifications in this default configuration file.

begin authenticators

fixed_plain:
  driver = plaintext
  public_name = PLAIN
  server_condition = ${lookup mysql{MYSQL_Q_AUTHPWD1}{1}fail}
  server_set_id = $2

fixed_login:
  driver = plaintext
  public_name = LOGIN
  server_prompts = "Username:: : Password::"
  server_condition = ${lookup mysql{MYSQL_Q_AUTHPWD2}{1}fail}
  server_set_id = $1

######################################################################
#                   CONFIGURATION FOR local_scan()                   #
######################################################################

# If you have built Exim to include a local_scan() function that contains
# tables for private options, you can define those options here. Remember to
# uncomment the "begin" line. It is commented by default because it provokes
# an error with Exim binaries that are not built with LOCAL_SCAN_HAS_OPTIONS
# set in the Local/Makefile.

# begin local_scan


# End of Exim configuration file




-- 
## List details at http://lists.exim.org/mailman/listinfo/exim-users 
## Exim details at http://www.exim.org/
## Please use the Wiki with this list - http://wiki.exim.org/

Reply via email to