I'm running Exim 4.0.4 with this "out-of-the-box" System Aliases router:
system_aliases:
driver = redirect
allow_fail
allow_defer
data = ${lookup{$local_part}lsearch{/etc/aliases}}
file_transport = address_file
pipe_transport = address_pipe
The aliases file looks as it always has:
bin: root
daemon: root
adm: root
lp: root
sync: root
shutdown: root
halt: root
mail: root
news: root
uucp: root
# Person who should get root's mail
root: juha
[etc]
I was testing a new alias, when I noticed that the router only processes
the first recipient in To:, ignoring all the others.
Here's the debug output:
# exim -d -bt webmaster@??? postmaster@???
root@??? > debug 2>&1
Berkeley DB: Sleepycat Software: Berkeley DB 3.2.9: (January 24, 2001)
changed uid/gid: forcing real = effective
uid=0 gid=0
auxiliary group list: <none>
trusted user
admin user
originator: uid=0 gid=0 login=root name=root
sender address = root@???
Address testing: uid=0 gid=93 euid=0 egid=93
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Testing webmaster@???
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Considering webmaster@???
active address webmaster@???
local_part=webmaster domain=saarinen.org
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
routing webmaster@???
--------> dnslookup router <--------
local_part=webmaster domain=saarinen.org
checking domains
saarinen.org in "@ : saarinen.org : taitoltd.com : futhermucker.net"? yes
(matched "saarinen.org")
saarinen.org in "! +local_domains"? no (matched "! +local_domains")
cached lookup data = NULL
dnslookup router skipped: domains mismatch
--------> system_aliases router <--------
local_part=webmaster domain=saarinen.org
calling system_aliases router
rda_interpret (string): ${lookup{$local_part}lsearch{/etc/aliases}}
search_open: lsearch "/etc/aliases"
search_find: file="/etc/aliases"
key="webmaster" partial=-1
LRU list:
8/etc/aliases
End
internal_search_find: file="/etc/aliases"
type=lsearch key="webmaster"
file lookup required for webmaster
in /etc/aliases
lookup yielded: juha
expanded: juha
file is not a filter file
parse_forward_list: juha
extract item: juha
system_aliases router generated juha@???
errors_to=NULL transport=NULL
uid=unset gid=unset home=NULL
routed by system_aliases router
envelope to: webmaster@???
transport: <none>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Considering juha@???
active address juha@???
local_part=juha domain=saarinen.org
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
[That looks OK to me.]
routing juha@???
--------> dnslookup router <--------
local_part=juha domain=saarinen.org
checking domains
saarinen.org in "@ : saarinen.org : taitoltd.com : futhermucker.net"? yes
(matched "saarinen.org")
saarinen.org in "! +local_domains"? no (matched "! +local_domains")
cached lookup data = NULL
dnslookup router skipped: domains mismatch
--------> system_aliases router <--------
local_part=juha domain=saarinen.org
calling system_aliases router
rda_interpret (string): ${lookup{$local_part}lsearch{/etc/aliases}}
search_open: lsearch "/etc/aliases"
cached open
search_find: file="/etc/aliases"
key="juha" partial=-1
LRU list:
8/etc/aliases
End
internal_search_find: file="/etc/aliases"
type=lsearch key="juha"
file lookup required for juha
in /etc/aliases
lookup failed
expanded:
file is not a filter file
parse_forward_list:
system_aliases router declined for juha@???
--------> userforward router <--------
local_part=juha domain=saarinen.org
checking for local user
calling userforward router
rda_interpret (file): $home/.forward
expanded: /home/juha/.forward
stat(/home/juha/.)=0
/home/juha/.forward does not exist
userforward router declined for juha@???
--------> localuser router <--------
local_part=juha domain=saarinen.org
checking domains
saarinen.org in "saarinen.org"? yes (matched "saarinen.org")
checking for local user
calling localuser router
localuser router called for juha@???
domain = saarinen.org
set transport local_delivery
queued for local_delivery transport: local_part = juha
domain = saarinen.org
errors_to=NULL
domain_data=NULL localpart_data=NULL
routed by localuser router
envelope to: juha@???
transport: local_delivery
[All good so far]
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Testing postmaster@???
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Considering postaster@???
active address postmaster@???
local_part=postmaster domain=saarinen.org
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
routing postmaster@???
--------> dnslookup router <--------
local_part=postmaster domain=saarinen.org
checking domains
saarinen.org in "@ : saarinen.org : taitoltd.com : futhermucker.net"? yes
(matched "saarinen.org")
saarinen.org in "! +local_domains"? no (matched "! +local_domains")
cached lookup data = NULL
dnslookup router skipped: domains mismatch
--------> system_aliases router <--------
local_part=postmaster domain=saarinen.org
calling system_aliases router
rda_interpret (string): ${lookup{$local_part}lsearch{/etc/aliases}}
search_open: lsearch "/etc/aliases"
cached open
search_find: file="/etc/aliases"
key="postmaster" partial=-1
LRU list:
8/etc/aliases
End
internal_search_find: file="/etc/aliases"
type=lsearch key="webmaster"
file lookup required for postmaster
in /etc/aliases
lookup yielded: juha
expanded: juha
file is not a filter file
parse_forward_list: juha
extract item: juha
system_aliases router generated juha@???
errors_to=NULL transport=NULL
uid=unset gid=unset home=NULL
routed by system_aliases router
envelope to: postmaster@???
transport: <none>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Considering juha@???
active address juha@???
local_part=juha domain=saarinen.org
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
routing juha@???
--------> dnslookup router <--------
local_part=juha domain=saarinen.org
checking domains
saarinen.org in "@ : saarinen.org : taitoltd.com : futhermucker.net"? yes
(matched "saarinen.org")
saarinen.org in "! +local_domains"? no (matched "! +local_domains")
cached lookup data = NULL
dnslookup router skipped: domains mismatch
--------> system_aliases router <--------
local_part=juha domain=saarinen.org
calling system_aliases router
rda_interpret (string): ${lookup{$local_part}lsearch{/etc/aliases}}
search_open: lsearch "/etc/aliases"
cached open
search_find: file="/etc/aliases"
key="juha" partial=-1
LRU list:
8/etc/aliases
End
internal_search_find: file="/etc/aliases"
type=lsearch key="juha"
file lookup required for juha
in /etc/aliases
lookup failed
expanded:
file is not a filter file
parse_forward_list:
system_aliases router declined for juha@???
<two skipped virtual domain routers snipped>
--------> userforward router <--------
local_part=juha domain=saarinen.org
checking for local user
calling userforward router
rda_interpret (file): $home/.forward
expanded: /home/juha/.forward
stat(/home/juha/.)=0
/home/juha/.forward does not exist
userforward router declined for juha@???
--------> localuser router <--------
local_part=juha domain=saarinen.org
checking domains
saarinen.org in "saarinen.org"? yes (matched "saarinen.org")
checking for local user
calling localuser router
localuser router called for juha@???
domain = saarinen.org
queued for local_delivery transport: local_part = juha
domain = saarinen.org
errors_to=NULL
domain_data=NULL localpart_data=NULL
routed by localuser router
envelope to: juha@???
transport: local_delivery
[So, that should end up in my mail box, but it doesn't.]
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Testing root@???
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Considering root@???
active address root@???
local_part=root domain=saarinen.org
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
routing root@???
--------> dnslookup router <--------
local_part=root domain=saarinen.org
checking domains
saarinen.org in "@ : saarinen.org : taitoltd.com : futhermucker.net"? yes
(matched "saarinen.org")
saarinen.org in "! +local_domains"? no (matched "! +local_domains")
cached lookup data = NULL
dnslookup router skipped: domains mismatch
--------> system_aliases router <--------
local_part=root domain=saarinen.org
calling system_aliases router
rda_interpret (string): ${lookup{$local_part}lsearch{/etc/aliases}}
search_open: lsearch "/etc/aliases"
cached open
search_find: file="/etc/aliases"
key="root" partial=-1
LRU list:
8/etc/aliases
End
internal_search_find: file="/etc/aliases"
type=lsearch key="root"
file lookup required for root
in /etc/aliases
lookup yielded: juha
expanded: juha
file is not a filter file
parse_forward_list: juha
extract item: juha
system_aliases router generated juha@???
errors_to=NULL transport=NULL
uid=unset gid=unset home=NULL
routed by system_aliases router
envelope to: root@???
transport: <none>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Considering juha@???
active address juha@???
local_part=juha domain=saarinen.org
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
routing juha@???
--------> dnslookup router <--------
local_part=juha domain=saarinen.org
checking domains
saarinen.org in "@ : saarinen.org : taitoltd.com : futhermucker.net"? yes
(matched "saarinen.org")
saarinen.org in "! +local_domains"? no (matched "! +local_domains")
cached lookup data = NULL
dnslookup router skipped: domains mismatch
--------> system_aliases router <--------
local_part=juha domain=saarinen.org
calling system_aliases router
rda_interpret (string): ${lookup{$local_part}lsearch{/etc/aliases}}
search_open: lsearch "/etc/aliases"
cached open
search_find: file="/etc/aliases"
key="juha" partial=-1
LRU list:
8/etc/aliases
End
internal_search_find: file="/etc/aliases"
type=lsearch key="juha"
file lookup required for juha
in /etc/aliases
lookup failed
expanded:
file is not a filter file
parse_forward_list:
system_aliases router declined for juha@???
[two skipped virtual domain routers snipped]
--------> userforward router <--------
local_part=juha domain=saarinen.org
checking for local user
calling userforward router
rda_interpret (file): $home/.forward
expanded: /home/juha/.forward
stat(/home/juha/.)=0
/home/juha/.forward does not exist
userforward router declined for juha@???
--------> localuser router <--------
local_part=juha domain=saarinen.org
checking domains
saarinen.org in "saarinen.org"? yes (matched "saarinen.org")
checking for local user
calling localuser router
localuser router called for juha@???
domain = saarinen.org
queued for local_delivery transport: local_part = juha
domain = saarinen.org
errors_to=NULL
domain_data=NULL localpart_data=NULL
routed by localuser router
envelope to: juha@???
transport: local_delivery
search_tidyup called
>>>>>>>>>>>>>>>>>> Exim pid=3388 terminating with rc=0 >>>>>>>>>>>>>>>>>>
juha@???
<-- webmaster@???
router = localuser, transport = local_delivery
juha@???
<-- postmaster@???
router = localuser, transport = local_delivery
juha@???
<-- root@???
router = localuser, transport = local_delivery
I only get the message to the first recipient, however. I thought it was a
Courier-IMAP problem at first, as the debug output indicates that all
messages were routed, but looking at Exim's main.log, I only see one
instance of delivery:
2002-05-22 10:43:30 17AILq-0000v9-00 <= juha@???
H=den2.saarinen.org [192.168.1.12] P=esmtp S=547
id=Pine.WNT.4.43.0205221043030.2024-100000@???
2002-05-22 10:43:30 17AILq-0000v9-00 => juha <root@???>
R=localuser T=local_delivery
2002-05-22 10:43:30 17AILq-0000v9-00 Completed
Putting the other addresses in the cc: field has the same effect.
If you have:
alias1: account1
alias2: account2
and put alias1, alias2 as the recipients, the message gets delivered to
account1 and account2 as expected (but not to any further aliases either
account might have).
What am I missing here? Is this a feature?
--
Juha Saarinen