Mailing List Archive

system_aliases and delivery problem
--
I came across some very specific circumstances which lead exim to drop
large amounts of email without any error messages. It happens like this: a
mail is sent to miles@xenon.stanford.edu (FQDN or not, tested locally and
remotely). There is an entry in /etc/aliases like this:

miles: miles@xenon

The end result is that the mail just disappears; it seems that in the
second pass through the dnslookup router, is doesn't expand the name
'xenon', so if the short version is not in local_domains, something goes
wrong (I'm a little fuzzy on this point.

Attached is the output of 'exim -d -bV miles' and my configure file in
question. Is this something I should have realized (that the short host
name must be present in local_domains?) or is there something else I have
done wrong?

--
// Miles Davis - miles@cs.stanford.edu - http://www.cs.stanford.edu/~miles
// Computer Science Department - Computer Facilities
// Stanford University
--
Exim version 4.05 uid=0 gid=1 pid=25849 L=834cd8 D=fff7577f
probably ndbm
Exim version 4.05 uid=0 gid=1 pid=25849 L=834cd8 D=fff7577f
probably ndbm
Exim version 4.05 uid=0 gid=1 pid=25849 L=834cd8 D=fff7577f
probably ndbm
changed uid/gid: forcing real = effective
uid=0 gid=1
auxiliary group list: <none>
trusted user
admin user
changed uid/gid: privilege not needed
uid=8 gid=6
auxiliary group list: <none>
originator: uid=0 gid=1 login=root name=Super-User
sender address = root@Xenon.Stanford.EDU
set_process_info: 25849 accepting a local non-SMTP message from <root@Xenon.Stanford.EDU>
Sender: root@Xenon.Stanford.EDU
Recipients:
miles
search_tidyup called
>>Headers received:
From: miles
To: miles@xenon
Subject: test

rewrite_one_header: type=F:
From: miles
newlen=31 newtype=F newtext:
From: miles@Xenon.Stanford.EDU
remainder:
rewrite_one_header: type=T:
To: miles@xenon
search_tidyup called
>>Headers after local additions:
P Received: from root by Xenon.Stanford.EDU with local (Exim 4.05)
id 17SjqU-0006iv-00
for miles@Xenon.Stanford.EDU; Thu, 11 Jul 2002 12:43:25 -0700
* From: miles
F From: miles@Xenon.Stanford.EDU
T To: miles@xenon
Subject: test
I Message-Id: <E17SjqU-0006iv-00@Xenon.Stanford.EDU>
Date: Thu, 11 Jul 2002 12:43:25 -0700

Data file written for message 17SjqU-0006iv-00
calling local_scan(); timeout=300
local_scan() returned 0 NULL
Writing spool header file
Size of headers = 299
LOG: MAIN
<= root@Xenon.Stanford.EDU U=root P=local S=305
search_tidyup called
>>>>>>>>>>>>>>>>>> Exim pid=25849 terminating with rc=0 >>>>>>>>>>>>>>>>>>
Exim version 4.05 #1 built 10-Jul-2002 12:24:54
Copyright (c) University of Cambridge 2002
exec /usr/exim/bin/exim -C /usr/exim/configure.test -d=0xfff7577f -Mc 17SjqU-0006iv-00
Exim version 4.05 uid=8 gid=6 pid=25871 L=834cd8 D=fff7577f
probably ndbm
changed uid/gid: forcing real = effective
uid=0 gid=6
auxiliary group list: <none>
trusted user
admin user
skipping ACL configuration - not needed
set_process_info: 25871 delivering specified messages
set_process_info: 25871 delivering 17SjqU-0006iv-00
reading spool file 17SjqU-0006iv-00-H
user=root uid=0 gid=1 sender=root@Xenon.Stanford.EDU
sender_local=1 ident=root
Non-recipients:
Empty Tree
---- End of tree ----
recipients_count=1
body_linecount=1 message_linecount=8
Delivery address list:
miles@Xenon.Stanford.EDU
locking /var/spool/exim/db/retry.lockfile
locked /var/spool/exim/db/retry.lockfile
opened hints database /var/spool/exim/db/retry: flags=0
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Considering: miles@Xenon.Stanford.EDU
active address miles@Xenon.Stanford.EDU
local_part=miles domain=xenon.stanford.edu
unique = miles@xenon.stanford.edu
dbfn_read: key=R:xenon.stanford.edu
dbfn_read: key=R:miles@xenon.stanford.edu
no domain retry record
no address retry record
miles@Xenon.Stanford.EDU: queued for routing
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
routing miles@Xenon.Stanford.EDU
--------> spamcheck_router router <--------
local_part=miles domain=xenon.stanford.edu
checking "condition"
spamcheck_router router skipped: condition failure
--------> dnslookup router <--------
local_part=miles domain=xenon.stanford.edu
checking domains
xenon.stanford.edu in "@:Xenon.Stanford.EDU:lsearch;/etc/mail/local-host-names"? yes (matched "@")
xenon.stanford.edu in "! +local_domains"? no (matched "! +local_domains")
cached lookup data = NULL
dnslookup router skipped: domains mismatch
--------> system_aliases router <--------
local_part=miles domain=xenon.stanford.edu
calling system_aliases router
rda_interpret (string): ${lookup{$local_part}lsearch{/etc/aliases}}
search_open: lsearch "/etc/aliases"
search_find: file="/etc/aliases"
key="miles" partial=-1
LRU list:
8/etc/aliases
End
internal_search_find: file="/etc/aliases"
type=lsearch key="miles"
file lookup required for miles
in /etc/aliases
lookup yielded: miles@xenon
expanded: miles@xenon
file is not a filter file
parse_forward_list: miles@xenon
extract item: miles@xenon
system_aliases router generated miles@xenon
errors_to=NULL transport=NULL
uid=unset gid=unset home=NULL
routed by system_aliases router
envelope to: miles@Xenon.Stanford.EDU
transport: <none>
locking /var/spool/exim/db/retry.lockfile
locked /var/spool/exim/db/retry.lockfile
opened hints database /var/spool/exim/db/retry: flags=0
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Considering: miles@xenon
active address miles@xenon
local_part=miles domain=xenon
unique = miles@xenon
dbfn_read: key=R:xenon
dbfn_read: key=R:miles@xenon
no domain retry record
no address retry record
miles@xenon: queued for routing
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
routing miles@xenon
--------> spamcheck_router router <--------
local_part=miles domain=xenon
checking "condition"
spamcheck_router router skipped: condition failure
--------> dnslookup router <--------
local_part=miles domain=xenon
checking domains
search_open: lsearch "/etc/mail/local-host-names"
search_find: file="/etc/mail/local-host-names"
key="xenon" partial=-1
LRU list:
8/etc/mail/local-host-names
8/etc/aliases
End
internal_search_find: file="/etc/mail/local-host-names"
type=lsearch key="xenon"
file lookup required for xenon
in /etc/mail/local-host-names
lookup failed
xenon in "@:Xenon.Stanford.EDU:lsearch;/etc/mail/local-host-names"? no (end of list)
xenon in "! +local_domains"? yes (end of list)
cached lookup data = NULL
calling dnslookup router
dnslookup router called for miles@xenon
domain = xenon
DNS lookup of xenon (MX) gave NO_DATA
returning DNS_NODATA
DNS lookup of xenon (A) succeeded
171.64.66.201 in "0.0.0.0 : 127.0.0.0/8"? no (end of list)
local host found for non-MX address
fully qualified name = xenon.Stanford.EDU
xenon.Stanford.EDU 171.64.66.201 mx=-1 sort=-51
rewriting header lines after dnslookup router
rewrite_one_header: type=F:
From: miles@Xenon.Stanford.EDU
rewrite_one_header: type=T:
To: miles@xenon
miles@xenon rewritten by router as miles@xenon.Stanford.EDU
newlen=29 newtype=T newtext:
To: miles@xenon.Stanford.EDU
remainder:
re-routed to miles@xenon.Stanford.EDU
locking /var/spool/exim/db/retry.lockfile
locked /var/spool/exim/db/retry.lockfile
opened hints database /var/spool/exim/db/retry: flags=0
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Considering: miles@xenon
active address miles@xenon.Stanford.EDU
local_part=miles domain=xenon.stanford.edu
unique = miles@xenon.stanford.edu
miles@xenon.stanford.edu is a duplicate address: discarded
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
After routing:
Local deliveries:
Remote deliveries:
Failed addresses:
Deferred addresses:
search_tidyup called
>>>>>>>>>>>>>>>>>> deliveries are done >>>>>>>>>>>>>>>>>>
changed uid/gid: post-delivery tidying
uid=8 gid=6
auxiliary group list: <none>
set_process_info: 25871 tidying up after delivering 17SjqU-0006iv-00
Processing retry items
Succeeded addresses:
miles@Xenon.Stanford.EDU: no retry items
Failed addresses:
Deferred addresses:
end of retry processing
LOG: MAIN
Completed
end delivery of 17SjqU-0006iv-00
search_tidyup called
search_tidyup called
>>>>>>>>>>>>>>>>>> Exim pid=25871 terminating with rc=0 >>>>>>>>>>>>>>>>>>
--
######################################################################
# Runtime configuration file for Exim #
######################################################################


# This is a default configuration file which will operate correctly in
# uncomplicated installations. Please see the manual for a complete list
# of all the runtime configuration options that can be included in a
# configuration file. There are many more than are mentioned here. The
# manual is in the file doc/spec.txt in the Exim distribution as a plain
# ASCII file. Other formats (PostScript, Texinfo, HTML, PDF) are available
# from the Exim ftp sites. The manual is also online at the Exim web sites.


# This file is divided into several parts, all but the first of which are
# headed by a line starting with the word "begin". Only those parts that
# are required need to be present. Blank lines, and lines starting with #
# are ignored.


########### IMPORTANT ########## IMPORTANT ########### IMPORTANT ###########
# #
# Whenever you change Exim's configuration file, you *must* remember to #
# HUP the Exim daemon, because it will not pick up the new configuration #
# until you do. However, any other Exim processes that are started, for #
# example, a process started by an MUA in order to send a message, will #
# see the new configuration as soon as it is in place. #
# #
# You do not need to HUP the daemon for changes in auxiliary files that #
# are referenced from this file. They are read every time they are used. #
# #
# It is usually a good idea to test a new configuration for syntactic #
# correctness before installing it (for example, by running the command #
# "exim -C /config/file.new -bV"). #
# #
########### IMPORTANT ########## IMPORTANT ########### IMPORTANT ###########



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

# Specify your host's canonical name here. This should normally be the fully
# qualified "official" name of your host. If this option is not set, the
# uname() function is called to obtain the name. In many cases this does
# the right thing and you need not set anything explicitly.

# primary_hostname =


# The next three settings create two lists of domains and one list of hosts.
# These lists are referred to later in this configuration using the syntax
# +local_domains, +relay_to_domains, and +relay_from_hosts, respectively. They
# are all colon-separated lists:

# CSD-CF: The file /etc/mail/local-host-names is the same as sendmail.cw,
# that is, things for which the local host is an MX for. Make sure that
# relay_from_hosts has what you want in it as well.

#daemon_smtp_port = 250

domainlist local_domains = @:Xenon.Stanford.EDU:lsearch;/etc/mail/local-host-names
domainlist relay_to_domains =
hostlist relay_from_hosts = 127.0.0.1:171.64.64.0/24:172.24.64.0/24 : *.stanford.edu

# Most straightforward access control requirements can be obtained by
# appropriate settings of the above options. In more complicated situations, you
# may need to modify the Access Control List (ACL) which appears later in this
# file.

# The first setting specifies your local domains, for example:
#
# domainlist local_domains = my.first.domain : my.second.domain
#
# You can use "@" to mean "the name of the local host", as in the default
# setting above. This is the name that is specified by primary_hostname,
# as specified above (or defaulted). If you do not want to do any local
# deliveries, remove the "@" from the setting above. If you want to accept mail
# addressed to your host's literal IP address, for example, mail addressed to
# "user@[192.168.23.44]", you can add "@[]" as an item in the local domains
# list. You also need to uncomment "allow_domain_literals" below. This is not
# recommended for today's Internet.

# The second setting specifies domains for which your host is an incoming relay.
# If you are not doing any relaying, you should leave the list empty. However,
# if your host is an MX backup or gateway of some kind for some domains, you
# must set relay_to_domains to match those domains. For example:
#
# domainlist relay_to_domains = *.myco.com : my.friend.org
#
# This will allow any host to relay through your host to those domains.
# See the section of the manual entitled "Control of relaying" for more
# information.

# The third setting specifies hosts that can use your host as an outgoing relay
# to any other host on the Internet. Such a setting commonly refers to a
# complete local network as well as the localhost. For example:
#
# hostlist relay_from_hosts = 127.0.0.1 : 192.168.0.0/16
#
# The "/16" is a bit mask (CIDR notation), not a number of hosts. Note that you
# have to include 127.0.0.1 if you want to allow processes on your host to send
# SMTP mail by using the loopback address. A number of MUAs use this method of
# sending mail.


# All three of these lists may contain many different kinds of item, including
# wildcarded names, regular expressions, and file lookups. See the reference
# manual for details. The lists above are used in the access control list for
# incoming messages. The name of this ACL is defined here:

acl_smtp_rcpt = acl_check_rcpt

# You should not change that setting until you understand how ACLs work.


# Specify the domain you want to be added to all unqualified addresses
# here. An unqualified address is one that does not contain an "@" character
# followed by a domain. For example, "caesar@rome.example" is a fully qualified
# address, but the string "caesar" (i.e. just a login name) is an unqualified
# email address. Unqualified addresses are accepted only from local callers by
# default. See the recipient_unqualified_hosts option if you want to permit
# unqualified addresses from remote sources. If this option is not set, the
# primary_hostname value is used for qualification.

# qualify_domain =


# If you want unqualified recipient addresses to be qualified with a different
# domain to unqualified sender addresses, specify the recipient domain here.
# If this option is not set, the qualify_domain value is used.

# qualify_recipient =


# The following line must be uncommented if you want Exim to recognize
# addresses of the form "user@[10.11.12.13]" that is, with a "domain literal"
# (an IP address) instead of a named domain. The RFCs still require this form,
# but it makes little sense to permit mail to be sent to specific hosts by
# their IP address in the modern Internet. This ancient format has been used
# by those seeking to abuse hosts by using them for unwanted relaying. If you
# really do want to support domain literals, uncomment the following line, and
# see also the "domain_literal" router below.

# allow_domain_literals


# No deliveries will ever be run under the uids of these users (a colon-
# separated list). An attempt to do so causes a panic error to be logged, and
# the delivery to be deferred. This is a paranoic safety catch. Note that the
# default setting means you cannot deliver mail addressed to root as if it
# were a normal user. This isn't usually a problem, as most sites have an alias
# for root that redirects such mail to a human administrator.

never_users = root


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


# The settings below, which are actually the same as the defaults in the
# code, cause Exim to make RFC 1413 (ident) callbacks for all incoming SMTP
# calls. You can limit the hosts to which these calls are made, and/or change
# the timeout that is used. If you set the timeout to zero, all RFC 1413 calls
# are disabled. RFC 1413 calls are cheap and can provide useful information
# for tracing problem messages, but some hosts and firewalls have problems
# with them. This can result in a timeout instead of an immediate refused
# connection, leading to delays on starting up an SMTP session.

rfc1413_hosts = *
rfc1413_query_timeout = 30s


# By default, Exim expects all envelope addresses to be fully qualified, that
# is, they must contain both a local part and a domain. If you want to accept
# unqualified addresses (just a local part) from certain hosts, you can specify
# these hosts by setting one or both of
#
# sender_unqualified_hosts =
# recipient_unqualified_hosts =
#
# to control sender and recipient addresses, respectively. When this is done,
# unqualified addresses are qualified using the settings of qualify_domain
# and/or qualify_recipient (see above).


# If you want Exim to support the "percent hack" for certain domains,
# uncomment the following line and provide a list of domains. The "percent
# hack" is the feature by which mail addressed to x%y@z (where z is one of
# the domains listed) is locally rerouted to x@y and sent on. If z is not one
# of the "percent hack" domains, x%y is treated as an ordinary local part. This
# hack is rarely needed nowadays; you should not enable it unless you are sure
# that you really need it.
#
# percent_hack_domains =
#
# As well as setting this option you will also need to remove the test
# for local parts containing % in the ACL definition below.


# When Exim can neither deliver a message nor return it to sender, it "freezes"
# the delivery error message (aka "bounce message"). There are also other
# circumstances in which messages get frozen. They will stay on the queue for
# ever unless one of the following options is set.

# This option unfreezes frozen bounce messages after two days, tries
# once more to deliver them, and ignores any delivery failures.

ignore_bounce_errors_after = 2d

# This option cancels (removes) frozen messages that are older than a week.

timeout_frozen_after = 7d

# CSD-CF: You may want to turn off exims on logging, and just rely on syslog.
log_file_path = syslog : /var/spool/exim/%s.log

# CSD-CF: This allows malformed "HELO" greetings in SMTP, which unfortunately
# some lame MTAs still can't do right.
helo_accept_junk_hosts = *.pearsontc.com : *.prenhall.com : *.hdmss.net : poobah.stanford.edu


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

begin acl

# This access control list is used for every RCPT command in an incoming
# SMTP message. The tests are run in order until the address is either
# accepted or denied.

acl_check_rcpt:

# Accept if the source is local SMTP (i.e. not over TCP/IP). We do this by
# testing for an empty sending host field.

accept hosts = :

# Deny if the local part contains @ or % or / or | or !. These are rarely
# found in genuine local parts, but are often tried by people looking to
# circumvent relaying restrictions.

deny local_parts = ^.*[@%!/|]

# Accept mail to postmaster in any local domain, regardless of the source,
# and without verifying the sender.

accept local_parts = postmaster
domains = +local_domains

# Deny unless the sender address can be verified.

require verify = sender

#############################################################################
# There are no checks on DNS "black" lists because the domains that contain
# these lists are changing all the time. However, here are two examples of
# how you could get Exim to perform a DNS black list lookup at this point.
# The first one denies, while the second just warns.
#

# CSD-CF: This block turns on the RBL+ blackhole checking, and reject email
# from clients that match. You may want to change the deny to a warn, like
# the example below.

deny message = Mail from $sender_host_address refused by site $dnslist_domain\n$dnslist_text. Please see http://mail-abuse.org/cgi-bin/lookup?$sender_host_address for further information.
log_message = $sender_host_address found in $dnslist_domain
dnslists = rbl-plus.mail-abuse.org

#
# warn message = X-Warning: $sender_host_address is in a black list at $dnslist_domain
# log_message = found in $dnslist_domain
# dnslists = black.list.example
#############################################################################

# Accept if the address is in a local domain, but only if the recipient can
# be verified. Otherwise deny. The "endpass" line is the border between
# passing on to the next ACL statement (if tests above it fail) or denying
# access (if tests below it fail).

accept domains = +local_domains
endpass
message = unknown user
verify = recipient

# Accept if the address is in a domain for which we are relaying, but again,
# only if the recipient can be verified.

accept domains = +relay_to_domains
endpass
message = unrouteable address
verify = recipient

# If control reaches this point, the domain is neither in +local_domains
# nor in +relay_to_domains.

# Accept if the message comes from one of the hosts for which we are an
# outgoing relay. Recipient verification is omitted here, because in many
# cases the clients are dumb MUAs that don't cope well with SMTP error
# responses. If you are actually relaying out from MTAs, you should probably
# add recipient verification here.

accept hosts = +relay_from_hosts

# Accept if the message arrived over an authenticated connection, from
# any host. Again, these messages are usually from MUAs, so recipient
# verification is omitted.

accept authenticated = *

# Reaching the end of the ACL causes a "deny", but we might as well give
# an explicit message.

deny message = relay not permitted



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

# CSD-CF: This is the first router, and as a result is checks ALL mail that
# Runs through the mailer. It could be moved lower if you didn't want to check
# everything.

spamcheck_router:
no_verify
check_local_user = false
# When to scan a message :
# - it isn't already flagged as spam
# - it isn't already scanned
condition = "${if and { {!def:h_X-Spam-Flag:} {!eq {$received_protocol}{spam-scanned}} } {1}{0}}"
#condition = "${if and { {!def:h_X-Spam-Flag:} {!eq {$received_protocol}{spam-scanned}} {!eq {$host}{xenon.stanford.edu}}} {1}{0}}"

#condition = "${if and { {!def:h_X-Spam-Flag:} {!eq {$received_protocol}{spam-scanned}} {!eq {$host}{${lookup{$sender_host_name}lsearch{/etc/mail/local-host-names}}}} {!eq {$sender_host_name}{}} } {1}{0}}"
#condition = "${if and { {!def:h_X-Spam-Flag:} {!eq {$received_protocol}{spam-scanned}} {!eq {$sender_host_name}{l}} }{1}{0}}"

driver = accept
transport = spamcheck

# This router routes to remote hosts over SMTP by explicit IP address,
# when an email address is given in "domain literal" form, for example,
# <user@[192.168.35.64]>. The RFCs require this facility. However, it is
# little-known these days, and has been exploited by evil people seeking
# to abuse SMTP relays. Consequently it is commented out in the default
# configuration. If you uncomment this router, you also need to uncomment
# allow_domain_literals above, so that Exim can recognize the syntax of
# domain literal addresses.

# domain_literal:
# driver = ipliteral
# domains = ! +local_domains
# transport = remote_smtp


# This router routes addresses that are not in local domains by doing a DNS
# lookup on the domain name. Any domain that resolves to 0.0.0.0 or to a
# loopback interface address (127.0.0.0/8) is treated as if it had no DNS
# entry. Note that 0.0.0.0 is the same as 0.0.0.0/32, which is commonly treated
# as the local host inside the network stack. It is not 0.0.0.0/0, the default
# route. If the DNS lookup fails, no further routers are tried because of
# the no_more setting, and consequently the address is unrouteable.

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


# The remaining routers handle addresses in the local domain(s).


# This router handles aliasing using a traditional /etc/aliases file.
#
##### NB You must ensure that /etc/aliases exists. It used to be the case
##### NB that every Unix had that file, because it was the Sendmail default.
##### NB These days, there are systems that don't have it. Your aliases
##### NB file should at least contain an alias for "postmaster".
#
# If any of your aliases expand to pipes or files, you will need to set
# up a user and a group for these deliveries to run under. You can do
# this by uncommenting the "user" option below (changing the user name
# as appropriate) and adding a "group" option if necessary. Alternatively, you
# can specify "user" on the transports that are used. Note that the transports
# listed below are the same as are used for .forward files; you might want
# to set up different ones for pipe and file deliveries from aliases.



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


# This router handles forwarding using traditional .forward files in users'
# home directories. If you want it also to allow mail filtering when a forward
# file starts with the string "# Exim filter", uncomment the "allow_filter"
# option.

# The no_verify setting means that this router is skipped when Exim is
# verifying addresses. Similarly, no_expn means that this router is skipped if
# Exim is processing an EXPN command.

# The check_ancestor option means that if the forward file generates an
# address that is an ancestor of the current one, the current one gets
# passed on instead. This covers the case where A is aliased to B and B
# has a .forward file pointing to A.

# The three transports specified at the end are those that are used when
# forwarding generates a direct delivery to a file, or to a pipe, or sets
# up an auto-reply, respectively.

userforward:
driver = redirect
check_local_user
file = $home/.forward
no_verify
no_expn
check_ancestor
local_part_suffix = "+*"
local_part_suffix_optional
allow_filter
file_transport = address_file
pipe_transport = address_pipe
reply_transport = address_reply





# This router matches local user mailboxes.

localuser:
driver = accept
check_local_user
transport = local_delivery



######################################################################
# TRANSPORTS CONFIGURATION #
######################################################################
# ORDER DOES NOT MATTER #
# Only one appropriate transport is called for each delivery. #
######################################################################

# A transport is used only when referenced from a router that successfully
# handles an address.

begin transports


# This transport is used for delivering messages over SMTP connections.

remote_smtp:
driver = smtp


# This transport is used for local delivery to user mailboxes in traditional
# BSD mailbox format. By default it will be run under the uid and gid of the
# local user, and requires the sticky bit to be set on the /var/mail directory.
# Some systems use the alternative approach of running mail deliveries under a
# particular group instead of using the sticky bit. The commented options below
# show how this can be done.

local_delivery:
driver = appendfile
file = /var/mail/$local_part
delivery_date_add
envelope_to_add
return_path_add
group = mail
# mode = 0660


# This transport is used for handling pipe deliveries generated by alias or
# .forward files. If the pipe generates any standard output, it is returned
# to the sender of the message as a delivery error. Set return_fail_output
# instead of return_output if you want this to happen only when the pipe fails
# to complete normally. You can set different transports for aliases and
# forwards if you want to - see the references to address_pipe in the routers
# section above.

address_pipe:
driver = pipe
return_output


# This transport is used for handling deliveries directly to files that are
# generated by aliasing or forwarding.

address_file:
driver = appendfile
delivery_date_add
envelope_to_add
return_path_add


# This transport is used for handling autoreplies generated by the filtering
# option of the userforward router.

address_reply:
driver = autoreply

# CSD-CF: Spam transport, used by the spamcheck router.
# Spam Assassin
spamcheck:
driver = pipe
command = /usr/exim/bin/exim -oMr spam-scanned -bS
use_bsmtp = true
transport_filter = /usr/local/bin/spamc
home_directory = "/tmp"
current_directory = "/tmp"
# must use a privileged user to set $received_protocol on the way back in!
user = mail
group = mail
log_output = true
return_fail_output = true
return_path_add = false
message_prefix =
message_suffix =




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


# End of Exim configuration file
--
Re: system_aliases and delivery problem [ In reply to ]
* On Thu, Jul 11, 2002 at 09:04:48PM BST, Miles Davis <miles@cs.stanford.edu> wrote:
> I came across some very specific circumstances which lead exim to drop
> large amounts of email without any error messages. It happens like this: a
> mail is sent to miles@xenon.stanford.edu (FQDN or not, tested locally and
> remotely). There is an entry in /etc/aliases like this:
>
> miles: miles@xenon
>
> The end result is that the mail just disappears; it seems that in the
> second pass through the dnslookup router, is doesn't expand the name
> 'xenon', so if the short version is not in local_domains, something goes
> wrong (I'm a little fuzzy on this point.
>
> Attached is the output of 'exim -d -bV miles' and my configure file in
> question. Is this something I should have realized (that the short host
> name must be present in local_domains?) or is there something else I have
> done wrong?

As far as I understand it, Exim will see that you are trying to send
to a local user 'miles', which is converted to 'miles@xenon' by the
aliases file. It will take xenon and look for any MX records for it,
If there are no MX records for it, Exim will look for an A record
for it. If there are no A records for it, the message should be
bounced back to the envelope-from address.

I have run a test here, which I believe relates to your situation.
In my case, I aliased the local user 'miles' to 'simon@avatar', where
avatar is a machine on my network:

miles: simon@avatar

avatar has no MX records on my network, although, as I have the
following line in /etc/resolv.conf, the resolver will add
no-dns-yet.org.uk to the end of the host, if the host doesn't already
resolve to an IP address:

search no-dns-yet.org.uk

Exim will pass the DNS A record lookup request to the resolver, which
will return 192.168.0.4 and Exim should then try to deliver the
message to that machine for simon@avatar.no-dns-yet.org.uk.

In my case, this happens:

simon@dustpuppy:~$ /usr/exim/bin/exim -bt miles
simon@avatar
<-- miles@no-dns-yet.org.uk
envelope to: simon@avatar.no-dns-yet.org.uk
router = dnslookup, transport = remote_smtp
host avatar.no-dns-yet.org.uk [192.168.0.4]
simon@dustpuppy:~$

I have 'qualify_domain' set to 'no-dns-yet.org.uk' (Exim 4.04) and
have 'avatar.no-dns-yet.org.uk' as a part of 'local_domans' on avatar
(Exim 3.32).

I get the following in the headers of the mail that arrives on
avatar:

Received: from dustpuppy.no-dns-yet.org.uk ([192.168.0.1])
by avatar.no-dns-yet.org.uk with esmtp (Exim 3.32 #1)
id 17Snl1-00006x-00
for simon@avatar.no-dns-yet.org.uk; Fri, 12 Jul 2002 00:53:59 +0100
Received: from simon by dustpuppy.no-dns-yet.org.uk with local (Exim 4.04)
id 17Snjs-0006Im-00
for miles@no-dns-yet.org.uk; Fri, 12 Jul 2002 00:52:48 +0100

In your case, that does the following show?:

/path/to/exim -bt miles

Is there anything in the mainlog (or whatever you have called it) to
show what Exim is doing with the messages? Are there any logs on
xenon which show anything happening to the messages?


--
Simon Williams <simon@no-dns-yet.org.uk> **** PGP: 099977D0
"We demand rigidly defined areas of doubt and uncertainty."
- Douglas Adams
Re: system_aliases and delivery problem [ In reply to ]
Hi Simon, thanks for your reply.

On Fri, Jul 12, 2002 at 01:03:25AM +0100, Simon Williams wrote:
>
> As far as I understand it, Exim will see that you are trying to send
> to a local user 'miles', which is converted to 'miles@xenon' by the
> aliases file. It will take xenon and look for any MX records for it,
> If there are no MX records for it, Exim will look for an A record
> for it. If there are no A records for it, the message should be
> bounced back to the envelope-from address.

But before it looks for MX records, it tests to see if it's in
local_domains, right? That's where it's not matching xenon because I only
had xenon.stanford.edu in there...doesn't it / shouldn't it expand the
hostname fully, or is this it's normal behavior? Anyhoo, xenon has no MX
record but (of course) has an A record.

> I have run a test here, which I believe relates to your situation.
> In my case, I aliased the local user 'miles' to 'simon@avatar', where
> avatar is a machine on my network:

Change that test in one small way -- on avatar, put that alias in the
system aliases and try it -- it gets messed up in the second pass through
dnslookup router, I believe.

> In my case, this happens:
>
> simon@dustpuppy:~$ /usr/exim/bin/exim -bt miles
> simon@avatar
> <-- miles@no-dns-yet.org.uk
> envelope to: simon@avatar.no-dns-yet.org.uk
> router = dnslookup, transport = remote_smtp
> host avatar.no-dns-yet.org.uk [192.168.0.4]
> simon@dustpuppy:~$
>
> I have 'qualify_domain' set to 'no-dns-yet.org.uk' (Exim 4.04) and
> have 'avatar.no-dns-yet.org.uk' as a part of 'local_domans' on avatar
> (Exim 3.32).

<snip>

> In your case, that does the following show?:
>
> /path/to/exim -bt miles

Xenon 68 # exim -C /usr/exim/configure.test -bt miles
miles@xenon
<-- miles@Xenon.Stanford.EDU
envelope to: miles@xenon.Stanford.EDU
router = localuser, transport = local_delivery


Looks right, no? And yet, the email disappears. :(

> Is there anything in the mainlog (or whatever you have called it) to
> show what Exim is doing with the messages? Are there any logs on
> xenon which show anything happening to the messages?

Well, it shows a little:

2002-07-11 17:21:10 17SoBJ-00040u-00 <= root@Xenon.Stanford.EDU U=root P=local S=315
2002-07-11 17:21:10 17SoBJ-00040u-00 Completed

--
// Miles Davis - miles@cs.stanford.edu - http://www.cs.stanford.edu/~miles
// Computer Science Department - Computer Facilities
// Stanford University
Re: system_aliases and delivery problem [ In reply to ]
On Thu, 11 Jul 2002, Miles Davis wrote:

> I came across some very specific circumstances which lead exim to drop
> large amounts of email without any error messages.

Miles,

Thanks for the information and the debugging output. This seems to be a
problem with Exim's de-duplication logic. I will look into it and try to
get it fixed for the next release.

What should have occurred, I think, is that there should have been an
error complaining that "miles@xenon" routed to the local host.

Workarounds:

1. Set "qualify_single=false" in the dnslookup router. However, that
will probably cause "miles@xenon" to be bounced as unrouteable.

2. Add a rewriting rule "*@xenon $1@xenon.stanford.edu". This will
do the rewriting early, which should solve the problem.

3. Add "xenon" to your local domains.

Regards,
Philip

--
Philip Hazel University of Cambridge Computing Service,
ph10@cus.cam.ac.uk Cambridge, England. Phone: +44 1223 334714.
Re: system_aliases and delivery problem [ In reply to ]
* On Fri, Jul 12, 2002 at 01:22:36AM BST, Miles Davis <miles@cs.stanford.edu> wrote:
> On Fri, Jul 12, 2002 at 01:03:25AM +0100, Simon Williams wrote:
> >
> > As far as I understand it, Exim will see that you are trying to send
> > to a local user 'miles', which is converted to 'miles@xenon' by the
> > aliases file. It will take xenon and look for any MX records for it,
> > If there are no MX records for it, Exim will look for an A record
> > for it. If there are no A records for it, the message should be
> > bounced back to the envelope-from address.
>
> But before it looks for MX records, it tests to see if it's in
> local_domains, right?

I believe so; I just missed that part when I was typing the
explanation.

> That's where it's not matching xenon because I only
> had xenon.stanford.edu in there...doesn't it / shouldn't it expand the
> hostname fully, or is this it's normal behavior?

It seems to, from my tests, although I'm not sure if it's supposed or
not.

> Anyhoo, xenon has no MX record but (of course) has an A record.

If xenon is the local machine, then I don't think that should come
into it anyway.

> > I have run a test here, which I believe relates to your situation.
> > In my case, I aliased the local user 'miles' to 'simon@avatar', where
> > avatar is a machine on my network:
>
> Change that test in one small way -- on avatar, put that alias in the
> system aliases and try it -- it gets messed up in the second pass through
> dnslookup router, I believe.

When I do that, the message arrives successfully. If, however, I
remove 'search no-dns-yet.org.uk' from /etc/resolv.conf, the message
bounces, with this showing in the logs:

2002-07-12 14:53:05 17T0r3-00003x-00 <= root@no-dns-yet.org.uk U=root
P=local S=460 id=20020712135305.GA242@avatar
2002-07-12 14:53:06 17T0r3-00003x-00 ** simon@avatar
<miles@no-dns-yet.org.uk>: unrouteable mail domain "avatar"
2002-07-12 14:53:06 17T0r4-00003z-00 <= <> R=17T0r3-00003x-00 U=mail
P=local S=1315
2002-07-12 14:53:06 17T0r3-00003x-00 Error message sent to
root@no-dns-yet.org.uk
2002-07-12 14:53:06 17T0r3-00003x-00 Completed
2002-07-12 14:53:06 17T0r4-00003z-00 => |/usr/bin/procmail
(simon@no-dns-yet.org.uk) <root@no-dns-yet.org.uk> D=userforward
T=address_pipe
2002-07-12 14:53:06 17T0r4-00003z-00 Completed

It was delivered to user simon, as root is aliased to simon in
/etc/aliases, so all looks well with both of those.

Adding avatar to local_domains makes everything work ok.

> > In my case, this happens:
> >
> > simon@dustpuppy:~$ /usr/exim/bin/exim -bt miles
> > simon@avatar
> > <-- miles@no-dns-yet.org.uk
> > envelope to: simon@avatar.no-dns-yet.org.uk
> > router = dnslookup, transport = remote_smtp
> > host avatar.no-dns-yet.org.uk [192.168.0.4]
> > simon@dustpuppy:~$
> >
> > I have 'qualify_domain' set to 'no-dns-yet.org.uk' (Exim 4.04) and
> > have 'avatar.no-dns-yet.org.uk' as a part of 'local_domans' on avatar
> > (Exim 3.32).
>
> <snip>
>
> > In your case, that does the following show?:
> >
> > /path/to/exim -bt miles
>
> Xenon 68 # exim -C /usr/exim/configure.test -bt miles
> miles@xenon
> <-- miles@Xenon.Stanford.EDU
> envelope to: miles@xenon.Stanford.EDU
> router = localuser, transport = local_delivery
>
> Looks right, no? And yet, the email disappears. :(

That looks right to me.

> > Is there anything in the mainlog (or whatever you have called it) to
> > show what Exim is doing with the messages? Are there any logs on
> > xenon which show anything happening to the messages?
>
> Well, it shows a little:
>
> 2002-07-11 17:21:10 17SoBJ-00040u-00 <= root@Xenon.Stanford.EDU U=root
> P=local S=315
> 2002-07-11 17:21:10 17SoBJ-00040u-00 Completed

Odd. Well, if Phillip says it's a bug, then it's probably a bug,
although that doesn't explain why it works on my system running Exim
3.32.

As Phillip says, you can try to add xenon to local_domains, which
should work.


--
Simon Williams <simon@no-dns-yet.org.uk> **** PGP: 099977D0
"We demand rigidly defined areas of doubt and uncertainty."
- Douglas Adams
Re: system_aliases and delivery problem [ In reply to ]
On Fri, 12 Jul 2002, Simon Williams wrote:

> Odd. Well, if Phillip says it's a bug, then it's probably a bug,
> although that doesn't explain why it works on my system running Exim
> 3.32.

The explanation is that you are not running 4.05. :-)

Routers and directors got merged for Exim 4. Much upheaval and
re-arranging of the code...

--
Philip Hazel University of Cambridge Computing Service,
ph10@cus.cam.ac.uk Cambridge, England. Phone: +44 1223 334714.