ph10 2004/10/08 11:38:48 BST
Added files:
exim-doc/doc-misc ABOUT Ext-maildir Ext-maildir++
Ext-mbx-locking LongTermIssues
RFC.conform TexiNotes WishList
exim-doc/doc-scripts ABOUT
exim-doc/doc-src ABOUT
exim-doc/doc-txt ABOUT
exim-src ABOUT
Log:
Start
Revision Changes Path
1.1 +11 -0 exim/exim-doc/doc-misc/ABOUT (new)
1.1 +109 -0 exim/exim-doc/doc-misc/Ext-maildir (new)
1.1 +394 -0 exim/exim-doc/doc-misc/Ext-maildir++ (new)
1.1 +400 -0 exim/exim-doc/doc-misc/Ext-mbx-locking (new)
1.1 +200 -0 exim/exim-doc/doc-misc/LongTermIssues (new)
1.1 +401 -0 exim/exim-doc/doc-misc/RFC.conform (new)
1.1 +193 -0 exim/exim-doc/doc-misc/TexiNotes (new)
1.1 +1727 -0 exim/exim-doc/doc-misc/WishList (new)
1.1 +9 -0 exim/exim-doc/doc-scripts/ABOUT (new)
1.1 +11 -0 exim/exim-doc/doc-src/ABOUT (new)
1.1 +9 -0 exim/exim-doc/doc-txt/ABOUT (new)
1.1 +11 -0 exim/exim-src/ABOUT (new)
Index: ABOUT
====================================================================
$Cambridge: exim/exim-doc/doc-misc/ABOUT,v 1.1 2004/10/08 10:38:47 ph10 Exp $
CVS directory exim/exim-doc/doc-misc
------------------------------------
This directory contains some miscellaneous documentation files that do not form
part of Exim distributions, but are related to its maintenance and development.
Those whose names start with "Ext-" are external documents that won't be
modified (and hence have no local CVS Ids).
End
Index: Ext-maildir
====================================================================
The following information is from the maildir man page of qmail.
INTRODUCTION
maildir is a structure for directories of incoming mail
messages. It solves the reliability problems that plague
mbox files and mh folders.
RELIABILITY ISSUES
A machine may crash while it is delivering a message. For
both mbox files and mh folders this means that the message
will be silently truncated. Even worse: for mbox format,
if the message is truncated in the middle of a line, it
will be silently joined to the next message. The mail
transport agent will try again later to deliver the mes-
sage, but it is unacceptable that a corrupted message
should show up at all. In maildir, every message is guar-
anteed complete upon delivery.
A machine may have two programs simultaneously delivering
mail to the same user. The mbox and mh formats require
the programs to update a single central file. If the pro-
grams do not use some locking mechanism, the central file
will be corrupted. There are several mbox and mh locking
mechanisms, none of which work portably and reliably. In
contrast, in maildir, no locks are ever necessary. Dif-
ferent delivery processes never touch the same file.
A user may try to delete messages from his mailbox at the
same moment that the machine delivers a new message. For
mbox and mh formats, the user's mail-reading program must
know what locking mechanism the mail-delivery programs
use. In contrast, in maildir, any delivered message can
be safely updated or deleted by a mail-reading program.
Many sites use Sun's Network Failure System (NFS), presum-
ably because the operating system vendor does not offer
anything else. NFS exacerbates all of the above problems.
Some NFS implementations don't provide any reliable lock-
ing mechanism. With mbox and mh formats, if two machines
deliver mail to the same user, or if a user reads mail
anywhere except the delivery machine, the user's mail is
at risk. maildir works without trouble over NFS.
THE MAILDIR STRUCTURE
A directory in maildir format has three subdirectories,
all on the same filesystem: tmp, new, and cur.
Each file in new is a newly delivered mail message. The
modification time of the file is the delivery date of the
message. The message is delivered without an extra UUCP-
style From_ line, without any >From quoting, and without
an extra blank line at the end. The message is normally
in RFC 822 format, starting with a Return-Path line and a
Delivered-To line, but it could contain arbitrary binary
data. It might not even end with a newline.
Files in cur are just like files in new. The big differ-
ence is that files in cur are no longer new mail: they
have been seen by the user's mail-reading program.
HOW A MESSAGE IS DELIVERED
The tmp directory is used to ensure reliable delivery, as
discussed here.
A program delivers a mail message in six steps. First, it
chdir()s to the maildir directory. Second, it stat()s the
name tmp/time.pid.host, where time is the number of sec-
onds since the beginning of 1970 GMT, pid is the program's
process ID, and host is the host name. Third, if stat()
returned anything other than ENOENT, the program sleeps
for two seconds, updates time, and tries the stat() again,
a limited number of times. Fourth, the program creates
tmp/time.pid.host. Fifth, the program NFS-writes the mes-
sage to the file. Sixth, the program link()s the file to
new/time.pid.host. At that instant the message has been
successfully delivered.
The delivery program is required to start a 24-hour timer
before creating tmp/time.pid.host, and to abort the deliv-
ery if the timer expires. Upon error, timeout, or normal
completion, the delivery program may attempt to unlink()
tmp/time.pid.host.
NFS-writing means (1) as usual, checking the number of
bytes returned from each write() call; (2) calling fsync()
and checking its return value; (3) calling close() and
checking its return value. (Standard NFS implementations
handle fsync() incorrectly but make up for it by abusing
close().)
HOW A MESSAGE IS READ
A mail reader operates as follows.
It looks through the new directory for new messages. Say
there is a new message, new/unique. The reader may freely
display the contents of new/unique, delete new/unique, or
rename new/unique as cur/unique:info. See
http://pobox.com/~djb/maildir.html for the meaning of
info.
The reader is also expected to look through the tmp direc-
tory and to clean up any old files found there. A file in
tmp may be safely removed if it has not been accessed in
36 hours.
It is a good idea for readers to skip all filenames in new
and cur starting with a dot. Other than this, readers
should not attempt to parse filenames.
###
Index: Ext-maildir++
====================================================================
Maildir++
In this document:
* HOWTO.maildirquota
* Mission statement
* Definitions and goals
* Contents of a maildirsize
* Calculating maildirsize
* Calculating the quota for a Maildir++
* Delivering to a Maildir++
* Reading from a Maildir++
* Bugs
HOWTO.maildirquota
The remaining portion of this document is a technical description of
the maildir quota extension. This section is a brief overview of this
extension.
What is a maildirquota?
If you would like to have a quota on your maildir mailboxes, the best
solution is to always use filesystem-based quotas: per-user usage
quotas that is enforced by the operating system.
This is the best solution when the default Maildir is located in each
account's home directory. This solution will NOT work if Maildirs are
stored elsewhere, or if you have a large virtual domain setup where a
single userid is used to hold many individual Maildirs, one for each
virtual user.
This extension to the maildir format allows a "voluntary" maildir
quota implementation that does not rely on filesystem-based quotas.
When maildirquota will not work.
For this quota mechanism to work, all software that accesses a maildir
must observe this quota protocol. It follows that this quota mechanism
can be easily circumvented if users have direct (shell) access to the
filesystem containing the users' maildirs.
Furthermore, this quota mechanism is not 100% effective. It is
possible to have a situation where someone may go over quota. This
quota implementation uses a deliverate trade-off. It is necessary to
use some form of locking in order to have a complete bulletproof quota
enforcement, but maildirs mail stores were explicitly designed to
avoid any kind of locking. This quota approach does not use locking,
and the tradeoff is that sometimes it is possible for a few extra
messages to be delivered to the maildir, before the door is
permanently shot.
For best performance, all maildir clients should support this quota
extension, however there's a wide degree of tolerance here. As long as
the mail delivery agent that puts new messages into a Maildir uses
this extension, the quota will be enforced without excessive
degradation.
In the worst case scenario, quotas are automatically recalculated
every fifteen minutes. If a maildir goes over quota, and a mail client
that does not support this quota extension removes enough mail from
the maildir, the mail delivery agent will not be immediately informed
that the maildir is now under quota. However, eventually the correct
quota will be recalculated and mail delivery will resume.
Mail user agents sometimes put messages into the maildir themselves.
Messages added to a maildir by a mail user agent that does not
understand the quota extension will not be immediately counted towards
the overall quota, and may not be counted for an extensive period of
time. Additionally, if there are a lot of messages that have been
added to a maildir from these mail user agents, quota recalculation
may impose non-trivial load on the system, as the quota recalculator
will have to issue the stat system call for each message.
How to implement the quota
The best way to do that is to modify your mail server to implement the
protocol defined by this document. Not everyone, of course, has this
ability. Therefore, an alternate approach is available.
This package creates a very short utility called "deliverquota". It
will NOT be installed anywhere by default, unless this maildir quota
implementation is a part of a larger package, in which case the parent
package may install this utility somewhere. If you obtained the
maildir package separately, you will need to compile it by running the
configure script, then by running make.
deliverquota takes two arguments. deliverquota reads the message from
standard input, then delivers it to the maildir specified by the first
argument to deliverquota. The second argument specifies the actual
quota for this maildir, as defined elsewhere in this document.
deliverquota will deliver the message to the maildir, making a best
effort not to exceed the stated quota. If the maildir is over quota,
deliverquota terminates with exit code 77. Otherwise, it delivers the
message, updates the quota, and terminates with exit code 0.
Therefore, proceed as follows:
* Copy deliverquota to some convenient location, say /usr/local/bin.
* Configure your mail server to use deliverquota. For example, if
you use Qmail and your maildirs are all located in $HOME/Maildir,
replace the './Maildir/' argument to qmail-start with the
following:
'| /usr/local/bin/deliverquota ./Maildir 1000000S'
This sets a one million byte limit on all Maildirs. As I
mentioned, this is meaningless if login access is available,
because the individual account owner can create his own
$HOME/.qmail file, and ignore deliverquota. Note that in this
case, you MUST use apostrophes on the qmail-start command line, in
order to quote this as one argument.
If you would like to use different quotas for different users, you
will have to put together a separate process or a script that looks up
the appropriate quota for the recipient, and runs deliverquota
specifying the quota. If no login access to the mail server is
available, you can simply create a separate $HOME/.qmail for every
recipient.
That's pretty much it. If you handle a moderate amount of mail, I have
one more suggestion. For the first couple of weeks, run deliverquota
setting the second argument to an empty string. This disables quota
enforcement, however it still activates certain optimizations that
permit very fast quota recalculation. Messages delivered by
deliverquota have their message size encoded in their filename; this
makes it possible to avoid stat-ing the message in the Maildir, when
recalculating the quota. Then, after most messages in your maildirs
have been delivered by deliverquota, activate the quotas!!!
maildirquota-enhanced applications
This is a list of applications that have been enhanced to support the
maildirquota extension:
* maildrop - mail delivery agent/mail filter.
* SqWebmail - webmail CGI binary.
These applications fall into two classes:
* Mail delivery agents. These applications read some externally
defined table of mail recipients and their maildir quota.
* Mail clients. These applications read maildir quota information
that has been defined by the mail delivery agent.
Mail clients generally do not need any additional setup in order to
use the maildirquota extension. They will automatically read and
implement any quota specification set by the mail delivery agent.
On the other hand, mail delivery agents will require some kind of
configuration in order to activate the maildirquota extension for some
or all recipients. The instructions for doing that depends upon the
mail delivery agent. The documentation for the mail delivery agent
should be consulted for additional information.
_________________________________________________________________
Mission statement
Maildir++ is a mail storage structure that's based on the Maildir
structure, first used in the Qmail mail server. Actually, Maildir++ is
just a minor extension to the standard Maildir structure.
For more information, see http://www.qmail.org/man/man5/maildir.html.
I am not going to include the definition of a Maildir in this
document. Consider it included right here. This document only
describes the differences.
Maildir++ adds a couple of things to a standard Maildir: folders and
quotas.
Quotas enforce a maximum allowable size of a Maildir. In many
situations, using the quota mechanism of the underlying filesystem
won't work very well. If a filesystem quota mechanism is used, then
when a Maildir goes over quota, Qmail does not bounce additional mail,
but keeps it queued, changing one bad situation into another bad
situation. Not only know you have an account that's backed up, but now
your queue starts to back up too.
Definitions, and goals
Maildir++ and Maildir shall be completely interchangeable. A Maildir++
client will be able to use a standard Maildir, automatically
"upgrading" it in the process. A Maildir client will be able to use a
Maildir++ just like a regular Maildir. Of course, a plain Maildir
client won't be able to enforce a quota, and won't be able to access
messages stored in folders.
Folders are created as subdirectories under the main Maildir. The name
of the subdirectory always starts with a period. For example, a folder
named "Important" will be a subdirectory called ".Important". You
can't have subdirectories that start with two periods.
A Maildir++ client ignores anything in the main Maildir that starts
with a period, but is not a subdirectory.
Each subdirectory is a fully-fledged Maildir of its own, that is you
have .Important/tmp, .Important/new, and .Important/cur. Everything
that applies to the main Maildir applies equally well to the
subdirectory, including automatically cleaning up old files in tmp. A
Maildir++ enhancement is that a message can be moved between folders
and/or the main Maildir simply by moving/renaming the file (into the
cur subdirectory of the destination folder). Therefore, the entire
Maildir++ must reside on the same filesystem.
Within each subdirectory there's an empty file, maildirfolder. Its
existence tells the mail delivery agent that this Maildir is a really
a folder underneath a parent Maildir++.
Only one special folder is reserved: Trash (subdirectory .Trash).
Instead of marking deleted messages with the D flag, Maildir++ clients
move the message into the Trash folder. Maildir++ readers are
responsible for expunging messages from Trash after a system-defined
retention interval.
When a Maildir++ reader sees a message marked with a D flag it may at
its option: remove the message immediately, move it into Trash, or
ignore it.
Can folders have subfolders, defined in a recursive fashion? The
answer is no. If you want to have a client with a hierarchy of
folders, emulate it. Pick a hierarchy separator character, say ":".
Then, folder foo/bar is subdirectory .foo:bar.
This is all that there's to say about folders. The rest of this
document deals with quotas.
The purpose of quotas is to temporarily disable a Maildir, if it goes
over the quota. There is one and only major goal that this quota
implementation tries to achieve:
* Place as little overhead as possible on the mail system that's
delivering to the Maildir++
That's it. To achieve that goal, certain compromises are made:
* Mail delivery will stop as soon as possible after Maildir++'s size
goes over quota. Certain race conditions may happen with Maildir++
going a lot over quota, in rare circumstances. That is taken into
account, and the situation will eventually resolve itself, but you
should not simply take your systemwide quota, multiply it by the
number of mail accounts, and allocate that much disk space. Always
leave room to spare.
* How well the quota mechanism will work will depend on whether or
not everything that accesses the Maildir++ is a Maildir++ client.
You can have a transition period where some of your mail clients
are just Maildir clients, and things should run more or less well.
There will be some additional load because the size of the Maildir
will be recalculated more often, but the additional load shouldn't
be noticeable.
This won't be a perfect solution, but it will hopefully be good
enough. Maildirs are simply designed to rely on the filesystem to
enforce individual quotas. If a filesystem-based quota works for you,
use it.
A Maildir++ may contain the following additional file: maildirsize.
Contents of maildirsize
maildirsize contains two or more lines terminated by newline
characters.
The first line contains a copy of the quota definition as used by the
system's mail server. Each application that uses the maildir must know
what it's quota is. Instead of configuring each application with the
quota logic, and making sure that every application's quota definition
for the same maildir is exactly the same, the quota specification used
by the system mail server is saved as the first line of the
maildirsize file. All other application that enforce the maildir quota
simply read the first line of maildirsize.
The quota definition is a list, separate by commas. Each member of the
list consists of an integer followed by a letter, specifying the
nature of the quota. Currently defined quota types are 'S' - total
size of all messages, and 'C' - the maximum count of messages in the
maildir. For example, 10000000S,1000C specifies a quota of 10,000,000
bytes or 1,000 messages, whichever comes first.
All remaining lines all contain two integers separated by a single
space. The first integer is interpreted as a byte count. The second
integer is interpreted as a file count. A Maildir++ writer can add up
all byte counts and file counts from maildirsize and enforce a quota
based either on number of messages or the total size of all the
messages.
Calculating maildirsize
In most cases, changes to maildirsize are recorded by appending an
additional line. Under some conditions maildirsize has to be
recalculated from scratch. These conditions are defined later. This is
the procedure that's used to recalculate maildirsize:
1. If we find a maildirfolder within the directory, we're delivering
to a folder, so back up to the parent directory, and start again.
2. Read the contents of the new and cur subdirectories. Also, read
the contents of the new and cur subdirectories in each Maildir++
folder, except Trash. Before reading each subdirectory, stat() the
subdirectory itself, and keep track of the latest timestamp you
get.
3. If the filename of each message is of the form xxxxx,S=nnnnn or
xxxxx,S=nnnnn:xxxxx where "xxxxx" represents arbitrary text, then
use nnnnn as the size of the file (which will be conveniently
recorded in the filename by a Maildir++ writer, within the
conventions of filename naming in a Maildir). If the message was
not written by a Maildir++ writer, stat() it to obtain the message
size. If stat() fails, a race condition removed the file, so just
ignore it and move on to the next one.
4. When done, you have the grand total of the number of messages and
their total size. Create a new maildirsize by: creating the file
in the tmp subdirectory, observing the conventions for writing to
a Maildir. Then rename the file as maildirsize.Afterwards, stat
all new and cur subdirectories again. If you find a timestamp
later than the saved timestamp, REMOVE maildirsize.
5. Before running this calculation procedure, the Maildir++ user
wanted to know the size of the Maildir++, so return the calculated
values. This is done even if maildirsize was removed.
Calculating the quota for a Maildir++
This is the procedure for reading the contents of maildirsize for the
purpose of determine if the Maildir++ is over quota.
1. If maildirsize does not exist, or if its size is at least 5120
bytes, recalculate it using the procedure defined above, and use
the recalculated numbers. Otherwise, read the contents of
maildirsize, and add up the totals.
2. The most efficient way of doing this is to: open maildirsize, then
start reading it into a 5120 byte buffer (some broken NFS
implementations may return less than 5120 bytes read even before
reaching the end of the file). If we fill it, which, in most
cases, will happen with one read, close it, and run the
recalculation procedure.
3. In many cases the quota calculation is for the purpose of adding
or removing messages from a Maildir++, so keep the file descriptor
to maildirsize open. A file descriptor will not be available if
quota recalculation ended up removing maildirsize due to a race
condition, so the caller may or may not get a file descriptor
together with the Maildir++ size.
4. If the numbers we got indicated that the Maidlir++ is over quota,
some additional logic is in order: if we did not recalculate
maildirsize, if the numbers in maildirsize indicated that we are
over quota, then if maildirsize was more than one line long, or if
the timestamp on maildirsize indicated that it's at least 15
minutes old, throw out the totals, and recalculate maildirsize
from scratch.
Eventually the 5120 byte limitation will always cause maildirsize to
be recalculated, which will compensate for any race conditions which
previously threw off the totals. Each time a message is delivered or
removed from a Maildir++, one line is added to maildirsize (this is
described below in greater detail). Most messages are less than 10K
long, so each line appended to maildirsize will be either between
seven and nine bytes long (four bytes for message count, space, digit
1, newline, optional minus sign in front of both counts if the message
was removed). This results in about 640 Maildir++ operations before a
recalculation is forced. Since most messages are added once and
removed once from a Maildir, expect recalculation to happen
approximately every 320 messages, keeping the overhead of a
recalculation to a minimum. Even if most messages include large
attachments, most attachments are less than 100K long, which brings
down the average recalculation frequency to about 150 messages.
Also, the effect of having non-Maildir++ clients accessing the
Maildir++ is reduced by forcing a recalculation when we're potentially
over quota. Even if non-Maildir++ clients are used to remove messages
from the Maildir, the fact that the Maildir++ is still over quota will
be verified every 15 minutes.
Delivering to a Maildir++
Delivering to a Maildir++ is like delivering to a Maildir, with the
following exceptions:
1. Follow the usual Maildir conventions for naming the filename used
to store the message, except that append ,S=nnnnn to the name of
the file, where nnnnn is the size of the file. This eliminates the
need to stat() most messages when calculating the quota. If the
size of the message is not known at the beginning, append ,S=nnnnn
when renaming the message from tmp to new.
2. As soon as the size of the message is known (hopefully before it
is written into tmp), calculate Maildir++'s quota, using the
procedure defined previously. If the message is over quota, back
out, cleaning up anything that was created in tmp.
3. If a file descriptor to maildirsize was opened for us, after
moving the file from tmp to new append a line to the file
containing the message size, and "1".
Reading from a Maildir++
Maildir++ readers should mind the following additional tasks:
1. Make sure to create the maildirfolder file in any new folders
created within the Maildir++.
2. When moving a message to the Trash folder, append a line to
maildirsize, containing a negative message size and a '-1'.
3. When moving a message from the Trash folder, follow the steps
described in "Delivering to Maildir++", as far as quota logic
goes. That is, refuse to move messages out of Trash if the
Maildir++ is over quota.
4. Moving a message between other folders carries no additional
requirements.
Index: Ext-mbx-locking
====================================================================
UNIX Advisory File Locking Implications on c-client
Mark Crispin, 28 November 1995
THIS DOCUMENT HAS BEEN UPDATED TO REFLECT THE CODE IN THE
IMAP-4 TOOLKIT AS OF NOVEMBER 28, 1995. SOME STATEMENTS
IN THIS DOCUMENT DO NOT APPLY TO EARLIER VERSIONS OF THE
IMAP TOOLKIT.
INTRODUCTION
Advisory locking is a mechanism by which cooperating processes
can signal to each other their usage of a resource and whether or not
that usage is critical. It is not a mechanism to protect against
processes which do not cooperate in the locking.
The most basic form of locking involves a counter. This counter
is -1 when the resource is available. If a process wants the lock, it
executes an atomic increment-and-test-if-zero. If the value is zero,
the process has the lock and can execute the critical code that needs
exclusive usage of a resource. When it is finished, it sets the lock
back to -1. In C terms:
while (++lock) /* try to get lock */
invoke_other_threads (); /* failed, try again */
.
. /* critical code here */
.
lock = -1; /* release lock */
This particular form of locking appears most commonly in
multi-threaded applications such as operating system kernels. It
makes several presumptions:
(1) it is alright to keep testing the lock (no overflow)
(2) the critical resource is single-access only
(3) there is shared writeable memory between the two threads
(4) the threads can be trusted to release the lock when finished
In applications programming on multi-user systems, most commonly
the other threads are in an entirely different process, which may even
be logged in as a different user. Few operating systems offer shared
writeable memory between such processes.
A means of communicating this is by use of a file with a mutually
agreed upon name. A binary semaphore can be passed by means of the
existance or non-existance of that file, provided that there is an
atomic means to create a file if and only if that file does not exist.
In C terms:
/* try to get lock */
while ((fd = open ("lockfile",O_WRONLY|O_CREAT|O_EXCL,0666)) < 0)
sleep (1); /* failed, try again */
close (fd); /* got the lock */
.
. /* critical code here */
.
unlink ("lockfile"); /* release lock */
This form of locking makes fewer presumptions, but it still is
guilty of presumptions (2) and (4) above. Presumption (2) limits the
ability to have processes sharing a resource in a non-conflicting
fashion (e.g. reading from a file). Presumption (4) leads to
deadlocks should the process crash while it has a resource locked.
Most modern operating systems provide a resource locking system
call that has none of these presumptions. In particular, a mechanism
is provided for identifying shared locks as opposed to exclusive
locks. A shared lock permits other processes to obtain a shared lock,
but denies exclusive locks. In other words:
current state want shared want exclusive
------------- ----------- --------------
unlocked YES YES
locked shared YES NO
locked exclusive NO NO
Furthermore, the operating system automatically relinquishes all
locks held by that process when it terminates.
A useful operation is the ability to upgrade a shared lock to
exclusive (provided there are no other shared users of the lock) and
to downgrade an exclusive lock to shared. It is important that at no
time is the lock ever removed; a process upgrading to exclusive must
not relenquish its shared lock.
Most commonly, the resources being locked are files. Shared
locks are particularly important with files; multiple simultaneous
processes can read from a file, but only one can safely write at a
time. Some writes may be safer than others; an append to the end of
the file is safer than changing existing file data. In turn, changing
a file record in place is safer than rewriting the file with an
entirely different structure.
FILE LOCKING ON UNIX
In the oldest versions of UNIX, the use of a semaphore lockfile
was the only available form of locking. Advisory locking system calls
were not added to UNIX until after the BSD vs. System V split. Both
of these system calls deal with file resources only.
Most systems only have one or the other form of locking. AIX
emulates the BSD form of locking as a jacket into the System V form.
Ultrix and OSF/1 implement both forms.
?
BSD
BSD added the flock() system call. It offers capabilities to
acquire shared lock, acquire exclusive lock, and unlock. Optionally,
the process can request an immediate error return instead of blocking
when the lock is unavailable.
FLOCK() BUGS
flock() advertises that it permits upgrading of shared locks to
exclusive and downgrading of exclusive locks to shared, but it does so
by releasing the former lock and then trying to acquire the new lock.
This creates a window of vulnerability in which another process can
grab the exclusive lock. Therefore, this capability is not useful,
although many programmers have been deluded by incautious reading of
the flock() man page to believe otherwise. This problem can be
programmed around, once the programmer is aware of it.
flock() always returns as if it succeeded on NFS files, when in
fact it is a no-op. There is no way around this.
Leaving aside these two problems, flock() works remarkably well,
and has shown itself to be robust and trustworthy.
?
SYSTEM V/POSIX
System V added new functions to the fnctl() system call, and a
simple interface through the lockf() subroutine. This was
subsequently included in POSIX. Both offer the facility to apply the
lock to a particular region of the file instead of to the entire file.
lockf() only supports exclusive locks, and calls fcntl() internally;
hence it won't be discussed further.
Functionally, fcntl() locking is a superset of flock(); it is
possible to implement a flock() emulator using fcntl(), with one minor
exception: it is not possible to acquire an exclusive lock if the file
is not open for write.
The fcntl() locking functions are: query lock station of a file
region, lock/unlock a region, and lock/unlock a region and block until
have the lock. The locks may be shared or exclusive. By means of the
statd and lockd daemons, fcntl() locking is available on NFS files.
When statd is started at system boot, it reads its /etc/state
file (which contains the number of times it has been invoked) and
/etc/sm directory (which contains a list of all remote sites which are
client or server locking with this site), and notifies the statd on
each of these systems that it has been restarted. Each statd then
notifies the local lockd of the restart of that system.
lockd receives fcntl() requests for NFS files. It communicates
with the lockd at the server and requests it to apply the lock, and
with the statd to request it for notification when the server goes
down. It blocks until all these requests are completed.
There is quite a mythos about fcntl() locking.
One religion holds that fcntl() locking is the best thing since
sliced bread, and that programs which use flock() should be converted
to fcntl() so that NFS locking will work. However, as noted above,
very few systems support both calls, so such an exercise is pointless
except on Ultrix and OSF/1.
Another religion, which I adhere to, has the opposite viewpoint.
FCNTL() BUGS
For all of the hairy code to do individual section locking of a
file, it's clear that the designers of fcntl() locking never
considered some very basic locking operations. It's as if all they
knew about locking they got out of some CS textbook with not
investigation of real-world needs.
It is not possible to acquire an exclusive lock unless the file
is open for write. You could have append with shared read, and thus
you could have a case in which a read-only access may need to go
exclusive. This problem can be programmed around once the programmer
is aware of it.
If the file is opened on another file designator in the same
process, the file is unlocked even if no attempt is made to do any
form of locking on the second designator. This is a very bad bug. It
means that an application must keep track of all the files that it has
opened and locked.
If there is no statd/lockd on the NFS server, fcntl() will hang
forever waiting for them to appear. This is a bad bug. It means that
any attempt to lock on a server that doesn't run these daemons will
hang. There is no way for an application to request flock() style
``try to lock, but no-op if the mechanism ain't there''.
There is a rumor to the effect that fcntl() will hang forever on
local files too if there is no local statd/lockd. These daemons are
running on mailer.u, although they appear not to have much CPU time.
A useful experiment would be to kill them and see if imapd is affected
in any way, but I decline to do so without an OK from UCS! ;-) If
killing statd/lockd can be done without breaking fcntl() on local
files, this would become one of the primary means of dealing with this
problem.
The statd and lockd daemons have quite a reputation for extreme
fragility. There have been numerous reports about the locking
mechanism being wedged on a systemwide or even clusterwide basis,
requiring a reboot to clear. It is rumored that this wedge, once it
happens, also blocks local locking. Presumably killing and restarting
statd would suffice to clear the wedge, but I haven't verified this.
There appears to be a limit to how many locks may be in use at a
time on the system, although the documentation only mentions it in
passing. On some of their systems, UCS has increased lockd's ``size
of the socket buffer'', whatever that means.
?
C-CLIENT USAGE
c-client uses flock(). On System V systems, flock() is simulated
by an emulator that calls fcntl(). This emulator is provided by some
systems (e.g. AIX), or uses c-client's flock.c module.
BEZERK AND MMDF
Locking in the traditional UNIX formats was largely dictated by
the status quo in other applications; however, additional protection
is added against inadvertantly running multiple instances of a
c-client application on the same mail file.
(1) c-client attempts to create a .lock file (mail file name with
``.lock'' appended) whenever it reads from, or writes to, the mail
file. This is an exclusive lock, and is held only for short periods
of time while c-client is actually doing the I/O. There is a 5-minute
timeout for this lock, after which it is broken on the presumption
that it is a stale lock. If it can not create the .lock file due to
an EACCES (protection failure) error, it once silently proceeded
without this lock; this was for systems which protect /usr/spool/mail
from unprivileged processes creating files. Today, c-client reports
an error unless it is built otherwise. The purpose of this lock is to
prevent against unfavorable interactions with mail delivery.
(2) c-client applies a shared flock() to the mail file whenever
it reads from the mail file, and an exclusive flock() whenever it
writes to the mail file. This lock is freed as soon as it finishes
reading. The purpose of this lock is to prevent against unfavorable
interactions with mail delivery.
(3) c-client applies an exclusive flock() to a file on /tmp
(whose name represents the device and inode number of the file) when
it opens the mail file. This lock is maintained throughout the
session, although c-client has a feature (called ``kiss of death'')
which permits c-client to forcibly and irreversibly seize the lock
from a cooperating c-client application that surrenders the lock on
demand. The purpose of this lock is to prevent against unfavorable
interactions with other instances of c-client (rewriting the mail
file).
Mail delivery daemons use lock (1), (2), or both. Lock (1) works
over NFS; lock (2) is the only one that works on sites that protect
/usr/spool/mail against unprivileged file creation. Prudent mail
delivery daemons use both forms of locking, and of course so does
c-client.
If only lock (2) is used, then multiple processes can read from
the mail file simultaneously, although in real life this doesn't
really change things. The normal state of locks (1) and (2) is
unlocked except for very brief periods.
TENEX AND MTX
The design of the locking mechanism of these formats was
motivated by a design to enable multiple simultaneous read/write
access. It is almost the reverse of how locking works with
bezerk/mmdf.
(1) c-client applies a shared flock() to the mail file when it
opens the mail file. It upgrades this lock to exclusive whenever it
tries to expunge the mail file. Because of the flock() bug that
upgrading a lock actually releases it, it will not do so until it has
acquired an exclusive lock (2) first. The purpose of this lock is to
prevent against expunge taking place while some other c-client has the
mail file open (and thus knows where all the messages are).
(2) c-client applies a shared flock() to a file on /tmp (whose
name represents the device and inode number of the file) when it
parses the mail file. It applies an exclusive flock() to this file
when it appends new mail to the mail file, as well as before it
attempts to upgrade lock (1) to exclusive. The purpose of this lock
is to prevent against data being appended while some other c-client is
parsing mail in the file (to prevent reading of incomplete messages).
It also protects against the lock-releasing timing race on lock (1).
?
OBSERVATIONS
In a perfect world, locking works. You are protected against
unfavorable interactions with the mailer and against your own mistake
by running more than one instance of your mail reader. In tenex/mtx
formats, you have the additional benefit that multiple simultaneous
read/write access works, with the sole restriction being that you
can't expunge if there are any sharers of the mail file.
If the mail file is NFS-mounted, then flock() locking is a silent
no-op. This is the way BSD implements flock(), and c-client's
emulation of flock() through fcntl() tests for NFS files and
duplicates this functionality. There is no locking protection for
tenex/mtx mail files at all, and only protection against the mailer
for bezerk/mmdf mail files. This has been the accepted state of
affairs on UNIX for many sad years.
If you can not create .lock files, it should not affect locking,
since the flock() locks suffice for all protection. This is, however,
not true if the mailer does not check for flock() locking, or if the
the mail file is NFS-mounted.
What this means is that there is *no* locking protection at all
in the case of a client using an NFS-mounted /usr/spool/mail that does
not permit file creation by unprivileged programs. It is impossible,
under these circumstances, for an unprivileged program to do anything
about it. Worse, if EACCES errors on .lock file creation are no-op'ed
, the user won't even know about it. This is arguably a site
configuration error.
The problem with not being able to create .lock files exists on
System V as well, but the failure modes for flock() -- which is
implemented via fcntl() -- are different.
On System V, if the mail file is NFS-mounted and either the
client or the server lacks a functioning statd/lockd pair, then the
lock attempt would have hung forever if it weren't for the fact that
c-client tests for NFS and no-ops the flock() emulator in this case.
Systemwide or clusterwide failures of statd/lockd have been known to
occur which cause all locks in all processes to hang (including
local?). Without the special NFS test made by c-client, there would
be no way to request BSD-style no-op behavior, nor is there any way to
determine that this is happening other than the system being hung.
The additional locking introduced by c-client was shown to cause
much more stress on the System V locking mechanism than has
traditionally been placed upon it. If it was stressed too far, all
hell broke loose. Fortunately, this is now past history.
?
TRADEOFFS
c-client based applications have a reasonable chance of winning
as long as you don't use NFS for remote access to mail files. That's
what IMAP is for, after all. It is, however, very important to
realize that you can *not* use the lock-upgrade feature by itself
because it releases the lock as an interim step -- you need to have
lock-upgrading guarded by another lock.
If you have the misfortune of using System V, you are likely to
run into problems sooner or later having to do with statd/lockd. You
basically end up with one of three unsatisfactory choices:
1) Grit your teeth and live with it.
2) Try to make it work:
a) avoid NFS access so as not to stress statd/lockd.
b) try to understand the code in statd/lockd and hack it
to be more robust.
c) hunt out the system limit of locks, if there is one,
and increase it. Figure on at least two locks per
simultaneous imapd process and four locks per Pine
process. Better yet, make the limit be 10 times the
maximum number of processes.
d) increase the socket buffer (-S switch to lockd) if
it is offered. I don't know what this actually does,
but giving lockd more resources to do its work can't
hurt. Maybe.
3) Decide that it can't possibly work, and turn off the
fcntl() calls in your program.
4) If nuking statd/lockd can be done without breaking local
locking, then do so. This would make SVR4 have the same
limitations as BSD locking, with a couple of additional
bugs.
5) Check for NFS, and don't do the fcntl() in the NFS case.
This is what c-client does.
Note that if you are going to use NFS to access files on a server
which does not have statd/lockd running, your only choice is (3), (4),
or (5). Here again, IMAP can bail you out.
These problems aren't unique to c-client applications; they have
also been reported with Elm, Mediamail, and other email tools.
Of the other two SVR4 locking bugs:
Programmer awareness is necessary to deal with the bug that you
can not get an exclusive lock unless the file is open for write. I
believe that c-client has fixed all of these cases.
The problem about opening a second designator smashing any
current locks on the file has not been addressed satisfactorily yet.
This is not an easy problem to deal with, especially in c-client which
really doesn't know what other files/streams may be open by Pine.
Aren't you so happy that you bought an System V system?
Index: LongTermIssues
====================================================================
$Cambridge: exim/exim-doc/doc-misc/LongTermIssues,v 1.1 2004/10/08 10:38:47 ph10 Exp $
Exim Long Term Issues
---------------------
I restarted this list from scratch for Exim 4. I amalgamated it with another
list when creating the CVS repository (October 2004). But it still probably
needs a substantial spring clean. Some of it is very old now.
AUTOCONF
--------
Somebody once tried to \(autoconf)\ Exim, but found it too big a job. I now
have some experience with using \(autoconf)\ for PCRE, and I think maybe some
use could be made of it. I don't, however, believe that \(all)\ Exim build-time
configuration should be done that way. The reason is that, unlike something
like PCRE, there is quite a lot of information that is "user choice". Giving it
all as options to a \(configure)\ command does not seem the best way of doing
things.
Whenever I build something that needs more than a couple of obvious options to
\(configure)\, I always save them in a file anyway, so I know what I did for
next time. Therefore, I think it is sensible to retain the current Local file
structure for all the user choice configuration.
However, it might be helpful to use \(autoconf)\ to dig out various bits of
information about the operating system. At present, the \(OS/Makefile-*)\ files
have hard-wired settings, and maybe this information could be figured out by
running \(autoconf)\, which would save having to keep maintaining these files.
I would arrange things so that \(configure)\ is run automatically the first
time that \(make)\ is run, but it would be possible to run it manually first,
to override defaults. (For example, if you have both \(cc)\ and \(gcc)\
installed on your system, as I do, you need to be able to specify which to
use.) I will need to do some experiments to see exactly how this would work.
EXIMON and other utilities
--------------------------
. Consider optionally making it possible to link with something other than
Athena widgets - for example, gtk. Or indeed re-write the whole thing!
GENERAL
-------
. Convert os.c into a directory of separate functions, with the macro
switches defined elsewhere. Then make it into a library.
. Use a pointer to an address structure for expanding $domain etc, to make it
easier to save/restore this collection of variables. But note that $domain
and $local_part aren't always in an address. Check out when these are set.
Note also the new $address_data possibility.
. Spool_in and spool_out - speed up by using a table?
. Find a more compact way of encoding the options interpretation, and also of
checking for incompatible options.
. Find a more compact way of passing an open SMTP channel without having
to use options. What about the TLS state information? Could use a pipe to
pass more data.
. Some people have suggested separately loadable modules. But do all systems
have them? Is this going too far for just a few specialist users? In
particular, people want to be able to replace the logging with his own code.
Can we arrange this without going for the separately loaded modules? (cf the
incoming checking code.)
. SIGHUP the daemon - don't close the sockets; instead pass a list of them
somewhere for the new daemon to pick up. Iff started by exim or root, of
course. There might be quite a long list of them - argv might not be the best
idea. If this were done, then a non-setuid exim daemon could be SIGHUPped.
. Parallel deliveries. Currently dead host information doesn't get propagated
between them very well. Is there anyway this could be improved?
. In some environments the use of gethostbyname() seems to cause problems.
Check out its use, and see if having a "force DNS" option could be helpful.
But people would have to know what they were doing.
. accept_max_per_host is a slow, linear search. If smtp_accept_max is large,
this can be very slow. Is there some way we can speed this up? Some kind of
index based on the IP address? Remember, this is in the daemon, so it must
not consume store.
. Change the names of all the pcre_ stuff to, say, PCRE_ so that Exim can be
linked with libraries or whatever that also use an external PCRE library.
. Look at code in pidentd for running Exim in wait mode from inetd and re-using
the socket. This would allow it to run more tidily as non-root.
. Think up some scheme for checking for orphan files in the spool directories.
Perhaps -bp should always do it, but it would be nice to have it done
automatically now and again. Maybe we just leave this for a cron job? Perhaps
a new -bx, e.g. -bpck or something. Better, perhaps, is a separate Perl
script. Orphan = a file that is over 24h old (or 1s when test harness) and
either doesn't end in -D or -H, or is a -D without a matching -H (or vice
versa).
. Make set_process_info buffer bigger, and put the overflowed message at the
end, thereby leaving the start.
. Swamping with delays in checking for reserved hosts - the connections are
counted in the total allowed. Can we improve on this somehow? Maybe shared
memory can help here. Think about different states and different limits.
. Lists that must use colons: can we check for other cases, and fix them up
before passing them on? Is it worth it?
. Linux for S/390 - create configuration?
. Process receiving error message fails - can we get more info, such as the
stdout/stderr?
. dbmbuild - if renaming one of .dir/.pag fails, reinstate the other. Should
there be a lock?
. Write a script to check for format problems in the source - formats that are
not fixed strings and are built from outside code.
. freeze_tell: Don't if message is a bounce message containing From: the local
machine - even if the bounce comes from another host.
. Add additional data into the "frozen" log message at end of delivery, e.g. if
remote host was the local host or whatever. At least some cross referencing.
. Someone had a requirement to install the Exim binary in a different place to
the utilities, etc. Also, for different builds on the same host and
architecture.
. Include (part of?) the ppid in the message id? Or a random number?
. Re-implement the code in readconf that reads error names for retry rules.
Make it use a table for most of the error types. Then see if we can usefully
add any additional error types.
. Should there be "exim -bP acls" etc? It would mean inventing some kind of
"hide" facility within the ACL syntax.
. VERY LONG TERM: the message ID is too small now, with the recent changes to
cram in the sub-second time. It would be a big project to extend it; Exim
would have to recognize both forms for a while, and become stable, before
generating the new form. Probably a runtime switch needed. The new form needs
at least microsecond time (or more?) and should probably cope with 64-bit
pids, just to be safe (or leave expansion space that could be used for that).
It should also be able to hold big enough things in base 36.
. Take a look at libexec.
. Sort out the stcncpy/strlcpy issue once and for all. Time things.
. Error in transport filter. See test 407. All 3 processes see errors - which
one should be noticed? Transport_filter_temp_errors may be needed.
. Think about 5xx thresholds -- too many and you're out. What about 4xx?
. autoreply - should it call /usr/sbin/sendmail? Provide a way of not passing
-C and -D when creating the message ('cause it won't be privileged).
. Strings containing \000 - anything we can do?
. OpenSSL - can we pass an opened file for certificate? Repeatedly?
Otherwise pre-initialize while root? There do seem to be functions for
manipulating certificates, but documentation is scarce. Can we just load the
certificate in as root in the server?
. Consider using poll() to close unwanted fds. Is this efficient? Perhaps it
doesn't matter for the daemon.
. On a 64-bit system there are some cast warnings for casting addresses to
ints. Either we must find a way of not warning, or we'll have to use unions
to get round it.
. Run splint on the source?
. It has been suggested that rejection because not authenticated should use
530 and not 550, but this is hard to detect because of the way ACLs work.
. When there is a sender verify failure, $acl_verify_message contains "sender
verify failed", not the details of the failure. Should this change? Some of
the waffly details are added later in smtp_in.c. In the ACL that text is in
sender_verified_failed->user_message.
. An empty string for a transport filter currently causes an error. Should it
ignore? Tricky because of special expansion rules for commands.
. GFDL for documentation (www.gnu.org/licenses/fdl.html)? The 1.2 version of
this licence is still quite new (it is dated November 2002) so I think
waiting for reaction/opinion is the best plan. There are Debian concerns
about this licence. At very least, no Invariant Sections and no Cover Texts
can be used.
. Allow $recipients in other places. Not clear what this value should be if,
say, the system filter has overridden them. Default would be envelope
recipients, as now.
End
Index: RFC.conform
====================================================================
$Cambridge: exim/exim-doc/doc-misc/RFC.conform,v 1.1 2004/10/08 10:38:47 ph10 Exp $
Conformance with RFCs
---------------------
Exim is written to follow the rules laid down in the RFCs. However, there are
some circumstances where it either extends what is specified, or chooses not to
follow them strictly, for various reasons. Sometimes variations are controlled
by an option, which may default on or off. This document lists the variations
from the latest email RFCs, and discusses their background and implications.
Last Updated: 25 January 1999
1. RFC 822
----------
The original specification of the format of Internet mail messages is RFC 822,
later clarified and modified by RFC 1123. At the time of writing (January 1999)
a new RFC (currently known as draft-ietf-drums-msg-fmt-07) which updates and
consolidates all the material related to the message format is at a late stage
of drafting, and is expected to become an Internet Standard in due course.
The following is (I hope) a complete list of major variations from the draft
RFC. References in square brackets are to the -07 draft.
1.1 Line termination [2.1, 2.3]
-------------------------------
[Lines are terminated by CRLF; isolated CR and LF are not permitted.]
The CRLF requirement has to be interpreted carefully, because the RFC also says
that it does not cover the internal format "used by sites". Exim keeps messages
on its spool in Unix format, using only LF as the line terminator, and also
does local deliveries using only LF. I believe this is compliant with the RFC,
as these are both "internal formats".
Messages sent out by SMTP have CRLF line terminators. However, isolated CR
characters are treated as any other data characters, because Exim is eight-bit
clean (see 1.2 below).
See 2.1 below for a discussion of line terminators in incoming messages.
1.2 Eight-bit characters [2.1]
------------------------------
[Messages consist of 7-bit characters.]
Exim is eight-bit clean. It does not do any processing of the characters in the
body of a message.
1.3 Maximum line length [2.1, 2.3]
----------------------------------
[The maximum length of a line is 998 characters.]
Exim does not enforce any limit on line length.
1.4 The "phrase" part of an address [3.4]
-----------------------------------------
[The phrase is a sequence of "words"; a word is an "atom" or a quoted string.]
The characters that can be used in an "atom" do not include the full stop
(dot, period). Thus a header line such as
To: John Q. Public <jqp@???>
is syntactically invalid under a strict interpretation of the RFC because the
dot in the phrase part is not quoted. However, many MTAs do not enforce this
restriction, so Exim was changed to be relaxed about it as well. In fact, the
draft RFC is moving towards allowing this. In section [4.1], which is defining
"obsolete" syntax that programs must accept (but not generate), it says this:
The period character is added to obs-phrase.
Note: The period character in obs-phrase is not a form that was allowed
in earlier versions of this or any other standard. Period (nor any other
character from specials) was not allowed in phrase because it introduced
a parsing difficulty distinguishing between phrases and portions of an
addr-spec (see section 4.4). It appears here because the period
character is currently used in many messages in the display-name portion
of addresses, especially for initials in names, and therefore must be
interpreted properly. In the future, period may appear in the regular
syntax of phrase.
1.5 Source routed addresses [4.4]
---------------------------------
[Source routed addresses are always enclosed in <>.]
Source routed addresses are declared obsolete in the draft RFC, but MTAs are
still required to handle them. Strictly, a source-routed address must be
enclosed in <> characters, so a header such as
From: @a,@b:c@d
is syntactally invalid. Exim does not enforce this restriction.
1.6 Local parts [3.4.1]
-----------------------
[Dots in unquoted local parts may not be consecutive or at either end.]
Exim allows unquoted local parts to begin or end with a dot (period, full
stop), and it also permits two consecutive dots in a local part.
2. RFC 821
----------
The original specification of SMTP is RFC 821, later clarified and modified by
RFC 1123. Domain name system requirements and their implications for mail are
covered in RFCs 1035 and 974. A scheme for extending the SMTP protocol is
described in RFC 1869, and there are subsequent RFCs specifying particular
extensions.
At the time of writing (January 1999) a new RFC (currently known as
draft-ietf-drums-smtpupd-09) which updates and consolidates all the material
connected with SMTP message transmission is at a late stage of drafting, and is
expected to become an Internet Standard in due course.
The new draft is written using the terms MUST, SHOULD, and MAY, which, when
written in capital letters, have precise meanings. To quote from the draft:
"MUST" or "MUST NOT" identify absolute requirements for conformance to
this specification. Implementations that do not conform to them lie
outside the scope of this specification and often will not
interoperate properly with SMTP implementations that do conform.
Implementations that are fully conforming also adhere to all "SHOULD"
and "SHOULD NOT" requirements. Implementations that adhere to all
"MUST" ("MUST NOT") but not to all of these are considered to be
partially conforming. Such implementations may interoperate properly
with fully conforming ones and with each other, but this will
typically be the case only if great care is taken. Consequently, an
implementation should violate "SHOULD" ("SHOULD NOT") requirements
only under exceptional and well-understood circumstances.
The implementation of Exim is intended to conform to the spirit of this
paragraph. The following is (I hope) a complete list of major variations
from the draft RFC. In addition to the items listed here, there are other minor
extensions such as the tolerance of white space in places where it is not
strictly permitted by the RFC. References in square brackets are to the -09
draft sections, and brief summaries of the RFC requirement are also given in
square brackets.
2.1 Line termination [2.3.7, 4.1.1.4]
-------------------------------------
[SMTP lines are terminated by CRLF.]
Exim recognizes LF without CR as a line terminator in all forms of input. For
SMTP input, any preceding CR is discarded. An early version of Exim followed
the RFC strictly, and did not recognize LF without CR in SMTP input. However,
it seems that sites on the net send out messages with just LF terminators,
despite the warnings in the RFCs, and other MTAs handle this, so Exim was
changed. However, there is a compile time macro called STRICT_CRLF which can be
set to restore the strict behaviour, though this is undocumented.
2.2 Eight-bit characters [2.4.1]
--------------------------------
[SMTP transmits only 7-bit characters.]
Exim is eight-bit clean, and makes no attempt to modify the data in a message
in any way. In particular, for messages containing characters with the top bit
set, it neither tries to negotiate 8-bit transmission, nor converts such
characters into an encoded form. In other words, it adopts the "just send 8"
strategy. It can be configured to send out 8BITMIME in its response to EHLO
(which it does not do by default), and it recognizes the 8BITMIME keyword on
incoming messages, but neither of these affect its handling of message data.
"Just send 8" is the strategy of a number of MTAs; it is argued that it
achieves what the user wants more often than other strategies.
2.3 Use of EHLO/HELO [3.2]
--------------------------
[Client MTAs should always start with EHLO, not HELO.]
Exim sends EHLO only when it finds the string "ESMTP" in an SMTP greeting
message. If EHLO is refused with a 5xx return code, it then reverts to HELO as
required, but it does not contain logic for converting to HELO on other errors
such as loss of connection or timeout after EHLO. That is one reason why it
doesn't always send EHLO; there are reported to be ancient SMTP servers out
there which collapse on receiving EHLO. (There is also at least one server
whose banner reads "<host name> ignores ESMTP", but it is RFC 821 compliant in
that it responds with 5O0 to EHLO, so Exim successfully reverts to HELO.)
2.4 Closing the connection [4.1.1.10]
-------------------------------------
[Client must wait for response to QUIT before closing the connection.]
Exim closes the connection immediately after sending QUIT, without waiting for
the reply. There was a lot of discussion about this on one of the mailing
lists. The conclusion was that this behaviour is fine on Unix systems, which
have TCP/IP implementations that close down the underlying channel tidily even
when the associated process has terminated. Indeed, not waiting may be
beneficial, as it moves the TIME_WAIT state (waiting to ensure there's no more
data in transit) from the server to the client system. On some other operating
systems (I understand) it is a disaster to terminate the sending process
without waiting for the QUIT response, because all the data about the
connection lives in the client's process space, and is therefore thrown away
before the response arrives. The subsequent arrival of the response then causes
bad behaviour.
2.5 IPv6 address literals [4.1.2]
---------------------------------
[IPv6 address literals are introduced by "IPv6".]
Exim recognizes IPv6 literals as just the colon-separated hexadecimal form of
an IPv6 address, for example 1080:0:0:0:8:800:200C:417A, without the need for a
prefix. At present, it does not even recognize the prefix. When IPv6 becomes
more widespread, Exim will follow whatever the common usage is.
2.6 Underscores in domain names [4.1.2]
---------------------------------------
[Underscores are not legal in domain names.]
RFC 822 allows all characters except specials, space, and controls in domain
names, but the SMTP RFCs are stricter, allowing only letters, digits, and
hyphen. Exim is compliant when checking incoming addresses in SMTP commands,
but it is more relaxed by default when checking domain names that are supplied
by EHLO or HELO commands, because many client workstations get set up with
underscores in their names. There is an option that can be set to cause Exim to
refuse underscores. (There are also options to specify certain hosts from which
it will accept any old junk after EHLO or HELO. Such is the woeful state of
some SMTP clients.)
2.7 Removal of return-path headers [4.4]
----------------------------------------
[Relaying MTAs should not remove return-path.]
Exim removes Return-Path: headers from all messages, if return_path_remove is
set (the default). It does not attempt to determine if it is being a relay or
not. Indeed, for some messages it might be both a relay and a final destination
MTA for the same message.
2.8 Randomizing the order of addresses of multihomed hosts [5]
--------------------------------------------------------------
[Multihomed host addresses should not be randomized.]
Exim does randomize a list of several addresses for a single host, because
caching in resolvers will defeat the round-robinning that many namerservers
use. (Note: this is not the same as randomizing equal-valued MX records. That
is required by the RFC.)
2.9 Handling "MX points to self" [5]
------------------------------------
[MX points to self must be treated as an error.]
The RFC doesn't allow for the possibility of special-purpose routing in the
case when the lowest numbered MX record points to the local host. The default
Exim configuration is compliant, but it is possible to configure Exim to behave
differently, and there are several situations where this can be useful.
2.10 Source routing [6.1]
-------------------------
[Source routes should be stripped.]
The new RFC has moved forward in deprecating source-routed email addresses.
Exim does not strip them down by default, but can be made to do so by setting
collapse_source_routes. However, even when it is not stripping them down, it
does not add host routing to reverse-paths when processing a source-routed
forward-path.
2.11 Loop detection [6.2]
-------------------------
[Loop count for Received: headers should be at least 100.]
Exim's default setting of the received_headers_max option is 30. Most messages
these days seem to accumulate less than half a dozen Received: headers, and
even a couple of forwardings don't bring this anywhere near 30.
2.12 Addition of missing headers [6.3]
--------------------------------------
[Missing headers may be added, and domains qualified, only if client is
identified.]
Exim always adds Message-Id: and Date: headers if these are missing, whatever
the source of the message, and likewise when it expands non-fully-qualified
domains, it does so independently of the message's source.
2.13 Syntax of MAIL and RCPT commands [4.1.1.2, 4.1.1.3]
--------------------------------------------------------
Exim is more relaxed than the RFC requires:
(1) Trailing white space is ignored.
(2) It permits white space after the "FROM" and "TO" keywords.
(3) It does not insist on the address being enclosed in <> characters. In fact,
it recognizes addresses in RFC 822 format here, except that domain
components are restricted to containing only letters, digits, and hyphens.
(4) Local parts are permitted to contain null components, that is, may start or
end with an unquoted full stop (period) or contain two consecutive
unquoted full stops.
2.14 Non-fully-qualified domains [2.3.5]
----------------------------------------
[All domains must be fully qualified.]
A domain that is not fully qualified has some of its trailing components
missing, and is normally a local alias of some sort, for example, just a
single-component host name.
Exim can be configured to "widen" non-fully-qualified domains, either by using
the facilities of the DNS resolver, or by an explicit list of widening strings.
When this is done, it applies to addresses received by SMTP from other hosts,
as well as to locally-originated addresses. Address re-writing could also be
used for this purpose.
2.15 Unqualified addresses [4.1.2]
----------------------------------
[Addresses in SMTP commands must include domains.]
An unqualified address consists of a local part without a domain. Do not
confuse "qualified address" and "qualified domain". A qualified address may
include a non-fully-qualified domain.
There is one exception to the RFC rule: it is required that the unqualified
address "<postmaster>" always be accepted. Apart from this, Exim rejects
domainless addresses in SMTP commands by default, but it can be configured with
a list of hosts and/or networks that are permitted to send addresses without
domains in SMTP commands. Any such address that is accepted (including
<postmaster>) is qualified by adding the value of the qualify_domain option.
2.16 VRFY and EXPN [3.5.1, 3.5.2, 3.5.3, 7.3]
---------------------------------------------
[VRFY and EXPN should be supported.]
Exim does not support VRFY and EXPN by default, but a list of hosts and
networks for which they are permitted can be given.
2.17 Checking of EHLO/HELO commands [4.1.4]
-------------------------------------------
[Client must send EHLO. Server must not refuse message if EHLO/HELO check
fails.]
Exim, as a client, always sends EHLO or HELO (see 2.3 above). As a server, it
does not insist on there having been a valid EHLO or HELO command before the
start of a message transaction. Any EHLO or HELO command that is received is
rejected only if it contains a syntax error. That is, it is never rejected on
the basis of any validation checking that may be performed on the data it
contains.
However, Exim can be configured to insist that (a) there is valid EHLO/HELO
command before any message transaction and (b) the domain in that command
matches the domain obtained by looking up the IP address of the sending host.
It is possible to specify exception lists of hosts and/or networks for which
this check does not apply.
2.18 Format of delivery error messages [3.7]
--------------------------------------------
[Standard report formats should be used if possible.]
Exim's delivery failure reports do not conform to the format described in RFC
1894.
## End ##
Index: TexiNotes
====================================================================
$Cambridge: exim/exim-doc/doc-misc/TexiNotes,v 1.1 2004/10/08 10:38:47 ph10 Exp $
Notes for conversion of sgcal input into Texinfo input
------------------------------------------------------
(Dated 6 August 1996)
The escape character is @. Only @ and curly brackets are sensitive. Get them in
by @@ @{ and @} if required.
@: after a dot that is not a sentence end.
@. instead of . if sentence ends with capital letter
@copyright{} for copyright
@minus{} is a slighly longer minus sign
Input file ends with .texinfo usually.
MUST start the file with
\input texinfo
@c %**start of header
@setfilename INFO-FILE-NAME
@settitle NAME_OF_MANUAL
$c %**end of header
Then, typically
@ifinfo
summary and copyright
@end ifinfo
Followed by
@titlepage
title and copyright
@end titlepage
Then the top node and master menu - for info file only
@node Top, First Chapter, (dir), (dir)
@comment node-name next, previous, up
@top
@menu
* First Chapter:: The first chapter is the
only chapter in the sample
* Concept Index:: An index
@end menu
Then the body
@node First Chapter, Concept Index, Top, Top
@comment node-name next, previous, up
@chapter First Chapter
@cindex Sample index entry
This is the contents of the first chapter
@cindex Another sample index
Then stuff about indexes and tables of contents
@node Concept Index, , First Chapter, Top
@unnumbered Concept Index
@printindex cp
@contents
MUST end the file with
@bye
. NEWLINE AND NO-FILL MODE
@page for new page
@* forces a line break
. LINE CENTERING
@center stuff
. ROMAN, ITALIC, BOLD ITALIC, SMALL CAPS
@code{...} for 'code' => `...' in info
@file{...} for file names => `...' in info
@samp{...} for sample text => `...' in info
@var{...} for variable => caps in info
@dfn{...} defining a term => double quotes in info
@emph{...} produces italic
@strong{...} produces bold
@sc{...} small caps but with letters in lower case.
@i italic )
@b bold ) no effect on info file
@r roman )
. TABBING
. CHAPTERS & SECTIONS
@chapter <title>
@unnumbered <title> is an unnumbered chapter
@section
. SECTION
. FANCY VS PLAIN
@iftex ... @end iftex for printed only; likewise @ifinfo ... @end ifinfo
. LEAVING BLANK SPACE
@sp 10
. EM & NEM
no can no
. DISPLAY ASIS
@example ... @end example
@display ... @end display no change of font => rm
. COMMENTS
@comment or @c introduces comment lines
. NUMBERED LISTS
@enumerate
@item
first item
@item
second
@end enumerate
. BULLETED LISTS
@itemize @bullet
...
. CROSS REFERENCES
@xref start sentence
@ref{name}
@pxref (parenthesized)
5 args: node name (required), cross-ref name, topic description, name of
info file, name of printed manual.
. TABLES
@table for two-column tables
@table @asis
@item first column
second column
@item ...
. INDEX
@cindex concept index
@findex function index
@vindex variable index
@kindex key index
@pindex program index
@tindex data type index
***
Index: WishList
====================================================================
$Cambridge: exim/exim-doc/doc-misc/WishList,v 1.1 2004/10/08 10:38:47 ph10 Exp $
EXIM 4 WISH LIST
----------------
Even when it was first released, Exim 4 had a Wish List because not all the
things suggested for it were implemented. The list has not stopped growing...
Another reason it is so long is that I have retained some items from the Exim 3
Wish List that never got implemented, but which seem reasonable possibilities
for later addition to Exim 4.
I have guessed at the amount of work involved, and categorized the items as
Tiny, Small, Medium, Large, or Unknown. The guesses are not based on any
detailed investigation, so must be taken as very rough.
------------------------------------------------------------------------------
------------------------------------------------------------------------------
----- Retained from the Exim 3 Wish List ------
------------------------------------------------------------------------------
------------------------------------------------------------------------------
(10) 13-Jul-98 M more flexibility for pipe returns
Ben Smithurst
The ability to specify more precisely what happens concerning the return code
from the pipe and the presence/absence of STDOUT/STDERR is requested. The
particular configuration that was requested was:
> if the command exited EX_OK, *and* produced nothing on STDOUT or
> STDERR, it succeeded...
> if the command exited EX_TEMPFAIL, defer, regardless of
> STDOUT/STDERR...
> otherwise freeze the message (this will get my attention by way of
> freeze_tell_mailmaster)...
------------------------------------------------------------------------------
(11) 17-Jul-98 G support for DSN
Andy Mell
It is unclear to me how this should work in the presence of aliases and
forwarding. Local deliveries would have to explicitly configured as deliveries
or relaying or whatever. A substantial amount of code is probably needed.
Jeffrey Goldberg
I have nothing to add except to say that for many of the reasons you've
stated, I don't think that DSN is coherent enough to be worth the effort
to implement.
Another comment:
I thought the RFC was pretty clear on this. In a nutshell, if the
delivery rewrites the envelope from address, it's considered a
terminal delivery (i.e. delivery to a mailing list exploder), otherwise
treat it as a forwarding operation (the /etc/aliases case). I would
treat a .forward expansion as a final delivery event (it got to the
user as far as the MTA is concerned).
Yes, we need the DSN syntax. We also require the complete semantics of
NOTIFY=SUCCESS,FAILURE for our application to work.
Electronic Bill Presentment is really going to push the need for
DSN support in MTAs. We just don't want to get stuck in a situation
where we're faced with a non-DSN-aware MTA when we go to install
our bill/statement engine, thus our interest in what the MTA vendors
are planning to do about DSN.
------------------------------------------------------------------------------
(41) 14-Oct-98 M Find a way of modifying header lines
Oliver Smith
The problem with header_remove followed by header_add is that you can't refer
to the previous value of the header when adding a replacement. This could be
solved with a replace_header option.
------------------------------------------------------------------------------
(43) 15-Oct-98 M Sender rewrite *after* SMTP incoming checks
Andreas Edler
The anti-relaying check happens after the sender has been rewritten; there are
times when it would be helpful to do the check on the original sender, not on
the rewritten one. Quite how to configure this I'm not sure.
A related suggestion (from Steve Sargent) is to retain the original sender
address and make it accessible somehow.
------------------------------------------------------------------------------
(46) 20-Oct-98 L SMTP protocol hooks
Malcolm Ray
"But there are enough broken SMTP implementations to make me wonder whether
there isn't a case for providing hooks for tweaking the SMTP transport's
protocol exchange. Something which would allow me to say things like 'if, when
talking to lame.example.com, you get a 251 response to a MAIL command, rewrite
the response to 501 before continuing'."
------------------------------------------------------------------------------
(50) 13-Nov-98 M A "Focus" option for eximon
Frank Elsner
This is the opposite of "Hide"; it just displays a certain subset. Hmm. Could
something clever be done with regular expressions?
------------------------------------------------------------------------------
(61) 22-Dec-98 M Send failed error messages to somebody
Harald Meland
With sendmail, the failed error message is made into a error message,
with both envelope sender and recipient set to MAILER-DAEMON. The
original, bogus-envelope-sender message is then available to whoever
receives MAILER-DAEMON's mail. A more flexible approach would be to
specify a specific recipient.
------------------------------------------------------------------------------
(81) 01-Mar-99 M Addition of Content-MD5 support
Martin Hamilton
Martin supplied a suggested patch at
http://www.net.lut.ac.uk/~martin/antispam/exim-hacks/
------------------------------------------------------------------------------
(85) 15-Mar-99 M ability to rewrite addresses in non-standard headers
Dave Lewney
John Holman
Such as "return-receipt-to". See also 41.
------------------------------------------------------------------------------
(90) 21-Apr-99 M change wild prefix/suffix greediness
Ben Smithurst
Currently, when prefix or suffix containing * is set on a director, and the
fixed part occurs more than once in a local part, the length of the prefix or
suffix is maximized. For example, with suffix = -* and a local part of
foo-bar-baz the suffix is taken as bar-baz, leaving the local part as foo.
An option is proposed to invert this rule.
------------------------------------------------------------------------------
(91) 26-Apr-99 S make queue_run_in_order to newest first
"Andreas M. Kirchwitz"
The tidiest thing would be to have queue_run_order={random,oldest,newest},
and make queue_run_in_order obsolete.
------------------------------------------------------------------------------
(93) 04-May-1999 L fallback_transport
This would be a generic transport option, specifying a different transport to
be used if the first one failed. Failed hard, or failed soft? Or an option?
And if failed hard, is a bounce message sent as well, or not? There are uid
issues. Remote delivery would have to be done always in a subprocess so that
the main process could retain privilege in case the fallback transport was
local. That could be conditional. That's why this is labelled "Large". Some of
the things people want to do with this can be done by variations in the
routers, e.g. use $message_age to switch routers.
------------------------------------------------------------------------------
(94) 13-May-1999 M message to go with -Mg
Dave Holland
Alan Thew
So the admin can pass back a reason.
------------------------------------------------------------------------------
(99) 28-May-1999 M header to list failures for syntax_errors_to
mark david mcCreary
"I use the syntax_errors_to feature to email a copy of the error message.
It would be helpful to have the X-Failed-Receipients header in there,
identifying which addreses(s) are the problem, so that I don't have to
parse the body of the email message to figure out which addresses."
------------------------------------------------------------------------------
(100) 04-Jun-1999 S admin_users option, like trusted_users
Paul Mansfield
------------------------------------------------------------------------------
(102) 21-Jun-1999 M expanded basic variables
Julian King
Oh, and a wishlist entry, qualify_domain, and preferably other variables
can be set with a $lookup in the first part of the exim configuration
file, perhaps by an equivalent to backticks in shell script ("`command`")?
------------------------------------------------------------------------------
(105) 28-Jun-1999 M MIME-format bounce messages
Paul Makepeace
"Is there any work going/gone on/planned to enable exim to report delivery
status notifications using RFC1892 multipart/report MIME messages? It would be
great to have errors reported in a message/rfc822 attachment."
Jeffrey Goldberg
"I like plain bounces, so would hope that if you do this, that it be
configurable. I think that even for those who want it, it shouldn't be very
high on the wish list priority."
Other suggestions: toggle for bounces/warnings; override max_return for
certain addresses; use plain text if original not MIME. See Paul's hack
for background of what to do.
Nigel suggests using a specially named autoreply transport to generate bounces;
people could then replace this with another transport (e.g. pipe) if they want
to customize it themselves.
Eli Chen posted an unconditional patch for 3.32 that does some of this work.
That could form a basis.
------------------------------------------------------------------------------
(107) 12-Jul-1999 S defer transport at given load level
Marc Haber
------------------------------------------------------------------------------
(108) 16-Jul-1999 S remote sort by numbers of recipients
mark david mcCreary
In the absence of remote_sort, sort remote domains by the number of recipients
in each.
------------------------------------------------------------------------------
(114) 11-Nov-1999 S List of possible outgoing interfaces
Allow the smtp "interface" option to be a list: try them in turn until one
is found to work. Also allow masks to specify a range of addresses.
------------------------------------------------------------------------------
(123) 23-Dec-1999 L Use AUTH + TURN for dial-in hosts
Andrew Tverdokhleb
The way to do this would be to have Exim deliver messages into per-host
directories in, say, BSMTP format. Accept TURN if authenticated, and cause it
to run a helper program that is passed the socket in order to deliver the mail.
Provide a helper program!
------------------------------------------------------------------------------
(125) 04-Jan-2000 L Use shared memory segment for queue list
Theo Schlossnagle
The idea is that a queue-runner that finds no existing shared segment should
create one (if configured - possibly some fixed size) and all Exim processes
should maintain a list of messages in it, thereby saving on directory scans
when there are lots of messages. This needs a lot of careful thought to try to
eliminate any possibility of data loss. The interlocking could be quite tricky.
Further posters suggested using a db file to hold the list. See also 127.
------------------------------------------------------------------------------
(129) 14-Jan-2000 L Dynamically loadable lookup modules
Steve Haslam
Suggested patch provided.
------------------------------------------------------------------------------
(131) 17-Jan-2000 T Facility for assuming existence for EACCES
Peter Radcliffe
The opposite option for "+" in require_files: assume existence if cannot
peer into the directory (+ assumes non-existence).
------------------------------------------------------------------------------
(131) 29-Feb-2000 M? Control total number of outgoing SMTP calls
Brian White
This is for hosts with slow connections. Could some modification of
serialize_hosts be used for this? Or maybe use a semaphore? They seem to
be quite widely available.
------------------------------------------------------------------------------
(132) 01-Mar-2000 S Lookup host name from outgoing interface
Vadim Vygonets
Instead of primary_hostname, look up the name for the interface that is being
used for sending. Suggested patch supplied, but this should be an option of the
smtp transport.
------------------------------------------------------------------------------
(133) 06-Mar-2000 S Filter option not to log "previously sent"
Bruce Bowler
This is when using the "log" option of the autoreply driver.
------------------------------------------------------------------------------
(134) 09-Mar-2000 S Option to remove attachments when bouncing
------------------------------------------------------------------------------
(136) 13-Mar-2000 S/M Option for aliasfile to suppress "me too"
Could be tricky determining who "me" is.
------------------------------------------------------------------------------
(143) 08-May-2000 S Make quota_warn_threshold into a list
David Carter
So several warnings could be generated as the mailbox got bigger and bigger.
------------------------------------------------------------------------------
(146) 15-May-2000 M Allow SMTP error codes in retry rules
This would allow special handling of certain errors from certain hosts. In
particular, it would allow failing of certain 4xx codes.
This is now available for 4xx responses to RCPT commands. Is anything more
needed?
------------------------------------------------------------------------------
(148) 15-May-2000 S Warn recipient if message rejected for quota excession.
Heinz Ekker
Maybe not all that small, because the possibility of retrying must be taken
into account.
------------------------------------------------------------------------------
(149) 19-May-2000 L Make added headers visible in filters and other places
Hans Morten Kind
Headers added by directors/routers are not visible in subsequent processing.
This is a request to make them visible. What about removed headers? This could
be tricky to specify, hence the L.
A separate but related issue is the effect of headers added by "unseen"
directors. These are documented in chapter 19 as not being accumulated. Should
any change be made?
------------------------------------------------------------------------------
(155) 16-Jun-2000 M Special handling for certain hosts
mark david mcCreary
A means of changing the transport depending on the host name/IP of the most
preferred MX record so that all domains that route to certain hosts can be
handled specially. Maybe this could be a variable that is available in the
expansion of the "transport" option.
------------------------------------------------------------------------------
(158) 29-Jun-2000 S Configure "From" in bounces
Ben Parker
Cf Reply-To.
------------------------------------------------------------------------------
(159) 07-Jul-2000 M Keep messages for fixed time
Gary Palmer
An option to keep messages on the queue for a specified time, even if all their
destination hosts have timed out.
------------------------------------------------------------------------------
(164) 17-Aug-2000 S sender_unqualified_auth_hosts
To allow authenticated hosts to send unqualified addresses. Presumably it
needs received_... as well.
------------------------------------------------------------------------------
(167) 05-Sep-2000 L Support for ODBC
This would allow access to databases that don't have native support built into
Exim. See
http://www.openlinksw.com/info/docs/rel3doc/unix/odbcsdk.htm
------------------------------------------------------------------------------
(168) 06-Sep-2000 M Deliver messages that alias to nothing to a given address
Dr ZP Han
If other people are managing alias lists, and one is empty, bounce that
delivery to a given address rather than freezing the message. Use the errors_to
address?
------------------------------------------------------------------------------
(172) 11-Sep-2000 S Allow file/directory in appendfile to override
"Michael J. Tubby"
When appendfile is called from forward or filter files, it ignores file or
directory settings. Maybe they should override. The path set by the forward or
filter is available in $address_file these days, so it could be used to create
a longer path.
------------------------------------------------------------------------------
(173) 18-Sep-2000 S A way of doing lsearches with EOL terminated keys
Jason Robertson
This is for looking up things like subject contents. Probably need an option to
exim_dbmbuild to make them into DBM files.
------------------------------------------------------------------------------
(174) 19-Sep-2000 S A way of using a different port for fallback hosts.
Dean Brooks
------------------------------------------------------------------------------
(181) 10-Nov-2000 S Compile-time options for ignoring Sendmail options
So that new ones could be accommodated easily.
------------------------------------------------------------------------------
(183) 04-Dec-2000 L dns_means_nonexist_after
Dave C.
In other words, wait a bit before giving up. This needs a mechanism for
remembering, which is not currently available. To be borne in mind for the
future.
------------------------------------------------------------------------------
(184) 04-Dec-2000 M Log more details of local caller
J. Nick Koston
"I was wondering if it was possible for exim to log the parent pid's cwd and
exe when it is called from a script/invoked by actually running /usr/sbin/exim
or /usr/sbin/sendmail." Question: is this information actually/easily
available to Exim? Needs investigation.
------------------------------------------------------------------------------
(186) 19-Dec-2000 S A simple utility to reset a retry time
Marc Haber
Basically, to do what exim_fixdb "delete" can do, but straightforwardly. There
could be an interface from eximon.
------------------------------------------------------------------------------
(187) 02-Jan-2001 M Wildcarding in headers_remove
Tamas TEVESZ
What I'd like to see is it to handle globs (or regexps, but i'm not sure this
latter would worth the hassle), in a way like:
headers_remove = "X-*:Additional-header"
------------------------------------------------------------------------------
(188) 02-Jan-2001 S Make pipe timeout a temporary error
Georg v.Zezschwitz
A way to make a timeout into a temporary error.
------------------------------------------------------------------------------
(190) 03-Jan-2001 M Multiple message operations in eximon
------------------------------------------------------------------------------
(195) 19-Mar-2001 T TCP window size
TCP window size for receiving/sending, SMTP client/server.
------------------------------------------------------------------------------
------------------------------------------------------------------------------
------------------------------------------------------------------------------
------------------------------------------------------------------------------
----- Things that didn't make it into Exim 4 ------
------------------------------------------------------------------------------
------------------------------------------------------------------------------
. An option to send messages to postmaster when ignore_errmsg_errors_after
times out.
. When an address is being routed, its constituents are in $local_part and
$domain, but there is currently no variable that contains the whole thing. It
could be put into $recipient, but that risks confusion with $recipients
(which is available in system filters). Maybe $address could be used?
. The ability to relay to host X without knowing all the domains that host X
might have. At ACL time, one would need to verify the recipient, and determine
that it routed to host X.
. A new lookup library that operates on a specially prepared file of IP
addresses and masks so that a single "lookup" yields a yes/no answer. This
should be a freestanding thing - needs a utility to build the file from a list.
. People want to change the wording of messages; can we find an efficient way
of allowing this? (Maybe put all messages into a separate module?) The problem
is not in the messages themselves, but in the values that get inserted into
messages. Would have to invent a new kind of function that used identified
values rather than positional ones. Use GNU gettext?
. Invent lf_hosts for those that may use LF without CR. Any other RFC
things we need to worry about?
. A user would really like to see something similar, perhaps with
"ID=$authenticated_id", similar to "helo=" and "ident=" in the default received
header. BUT there are security issues. Maybe give it as a commented out option
in the default configuration?
. Consider expanding further options that take integer values. What about
smtp_xxx options for different limits at different times of day (for example)?
What about tls_advertise_hosts (so can look at incoming IP/port)?
. How about a "hold hosts" option (cf hold_domains) to hold delivery to certain
hosts?
. Allow user filters to use "headers add", but probably not remove. Or maybe
just implement "allow" options for both of these features.
. Have the return from pipe in a variable, so that (e.g. error_message_file)
can make use of it.
. Implement randomize for ldap/sql servers.
. Add an option for ETRN that says "wait for the command to finish, and use its
stdout as the SMTP response."
. -odsomething for "ignore retry when doing immediate delivery".
. Add an option to the smtp transport to make it treat 5xx on connection as if
it were 4xx. Or possible add a sophisticated "after command X, treat xxx as
yyy".
. A way of rewriting addresses in non-standard header lines such as
Mail-Followup-To.
. Global option to enable initgroups() for exim uid. Default off.
. When verifying a sender, should it be rewritten with any T rewrites, because
it would be so rewritten if it actually was a recipient in a message?
. Sean Witham wants a way of defining macros that are not privileged, and a
sort of #ifdef structure that allows for different configurations in the same
file.
. Allow :fail: to specify that 551 be used instead of 550. Maybe allow a code
at the start, optionally? What about :defer:?
. SMTP timeout in middle of receiving message: log sender address if known, and
possibly message_id if known.
. Make -brw show rewrites for transports too.
. Have the MTA log destinations that have timed-out on a ident request and
no longer send rfc1413_queries to them. Add an option for how not to cache
these entries.
. Options and/or a utility to enable non-privileged users to view the queue
(e.g. -bpp), manipulate their own messages, etc.
. Specify a port along with a host in a route_list.
. A generalized "From" escaping scheme that also escapes >From so that the
whole thing can be reversed.
. There was a request for the \dns_again_means_nonexist\ option not to be
instantaneous, but to operate only after the DNS has been giving "try again"
for some time. Use the misc hints database.
------------------------------------------------------------------------------
------------------------------------------------------------------------------
----- The Exim 4 Wish List ------
------------------------------------------------------------------------------
------------------------------------------------------------------------------
(1) 01-Jan-02 U Use of dynamically loaded libraries.
People want Exim to use dynamically loaded modules for a variety of reasons.
When I started to create Exim, I never expected anything other than source
distribution; the RPMs and inclusions in OS distributions caught me by
surprise. I know very little about the mechanics of dynamic loading, but I'm
aware that not all operating systems support it. I'm also aware that not all
people support it!
Furthermore, a way round this might be to supply more hooks along the lines of
local_scan(). Then people can write their own dynamic loaders if they want.
------------------------------------------------------------------------------
(3) 01-Jan-02 U Test for over-quota at SMTP time
This is a hard one, because the only way to test for over quota is to try to
deliver a message, certainly if system quotas are being used. And also, the
only available size at RCPT time is the SIZE option, though of course the test
could be run at DATA time. I think maybe we leave this one to an external
program, and require people to use ${run} to access the data. Let someone else
figure out how to extract the current mailbox size!
One suggestion is to implement
${file_size:/path/to/file}
${directory_size:/path/to/directory}
so that explicit checks can be done. It may be necessary to have four
operators, two being based on the block count, and two showing the "visible"
size. Directory scanning is expensive; is there any scope for caching? It would
seem not (you don't often get two addresses to the same user).
------------------------------------------------------------------------------
(4) 01-Jan-02 S Option to reject if no From: or Date: header line
Exim, in common with many other MTAs, inserts a From: or Date: header line if
one is missing. (It also inserts a blank Bcc:, but that is no longer needed by
RFC 2822 - it was by 822.) The suggestion is an option to give an error
instead. This could be done by making it possible to detect these insertions in
the acl_smtp_data ACL.
------------------------------------------------------------------------------
(6) 01-Jan-02 S Option to disable the use of -t
Dave C.
Would require work so that Exim itself doesn't use -t.
------------------------------------------------------------------------------
(7) 01-Jan-02 M Avoid showing LDAP passwords in log lines for LDAP errors
John W Baxter
May be tricky, because at the higher levels, the format of the query is not
understood.
------------------------------------------------------------------------------
(8) 01-Jan-02 S Expand once_repeat in autoreply
John Jetmore
------------------------------------------------------------------------------
(9) 01-Jan-02 S Headers as well as body in file for autoreply
Florian Laws
------------------------------------------------------------------------------
(10) 01-Jan-02 T Make "true" and "false" valid expansion conditions
This might help with "and" and "or" when one of the sub-conditions is, for
example, a lookup.
------------------------------------------------------------------------------
(11) 01-Jan-02 S Allow a filter to include another file.
------------------------------------------------------------------------------
(12) 01-Jan-02 M Support for different SQL servers per query
In other words, the global mysql_servers etc. is too restrictive.
------------------------------------------------------------------------------
(14) 01-Jan-02 M? Support for Sendmail milters
This could perhaps be done by extending the local_scan() idea and providing a
"standard" module which interfaced to milter.
------------------------------------------------------------------------------
(15) 01-Jan-02 M More hooks like local_scan()
One request has been for a similar hook at logging time. For other SMTP
interactions, maybe a hook into the ACL? See also 79 and 218.
------------------------------------------------------------------------------
(17) 11-Jan-02 M The construction of config.h needs refactoring
This has been hacked about substantially since the original implementation.
Given that there is a program (buildconfig), the messing around with the
environment could be abolished. Also, the distinction between "yes" and "no"
isn't always properly made (tests for #ifdef don't care about the value).
------------------------------------------------------------------------------
(18) 24-Jan-02 S Make $value retain its value after a top-level expansion
This was specifically for use in filter files. Currently it reverts to empty
as a consequence of save/restore for every lookup. It might be confusing to
do otherwise, however.
------------------------------------------------------------------------------
(19) 29-Jan-02 L Use of multiple DBM libraries
The problem is how to handle conflicting function names. Much research is
needed.
------------------------------------------------------------------------------
(20) 29-Jan-02 S Make system filter refreeze after manual thaw
Currently, a "freeze" in a system filter doesn't freeze after a manual thaw.
------------------------------------------------------------------------------
(21) 12-Feb-02 S Expand return_size_limit
Joachim Wieland
Is this really worth it? A per-transport value is also suggested - that would
mean remembering the value with each failed address and taking a minimum or
a maximimum (which?).
------------------------------------------------------------------------------
(24) 21-Feb-02 ? A way of testing TLS using -bh
------------------------------------------------------------------------------
(27) 06-Mar-02 M Distinguishing between different temporary callout errors
The request was to distinguish between a 4xx error and a failure to connect.
Problem is: how to cope when there is more than one host? Maybe only if ALL
fail to connect. An option like /callout_no_connect_ok.
------------------------------------------------------------------------------
(30) 12-Mar-02 S Add "recipients" precondition to routers.
This would avoid having to use "condition". (See also requirement for $address
mentioned above.) However, it would also require adding a caching feature, and
probably $recipient_data (cf $domain_data).
------------------------------------------------------------------------------
(31) 21-Mar-02 S Variables that indicate 8-bit message and 8-bit host, and
a way of using them to suppress a transport filter
A variable that is set if the message contains 8-bit characters, and another
that is set during the smtp transport if the host supports 8-bit. Then we also
need a condition that's expanded in the transport to control whether the filter
is run or not (e.g. transport_filter_condition).
------------------------------------------------------------------------------
(32) 22-Mar-02 M More info about callout fails for header sender verify
When there's a callout failure for an envelope address, the error message
contains details (by default) of the callout commands. This doesn't happen
for addresses in the header because there may be more than one of them, and
deciding how to give that information is tricky. Can we do better?
------------------------------------------------------------------------------
(33) 25-Mar-02 S Option to assume nomatch in dnslist lookups that time out
Currently this causes a DEFER.
------------------------------------------------------------------------------
(34) 26-Mar-02 S Access to DNS lookup functions via local_scan() API
This would make local_scan() writers lives easier for DNS usage.
------------------------------------------------------------------------------
(36) 02-Apr-02 ? A way of throttling, but allowing, relaying that would
otherwise be denied
This was suggested in connection with anonymizing messages. The "wait" command
in ACLs goes some way towards this. Is it enough?
------------------------------------------------------------------------------
(41) 17-Apr-02 T Make config.samples available as a directory for ftp
This is so that people can browse individual samples directly.
------------------------------------------------------------------------------
(42) 23-Apr-02 T An option not to flatten newlines in $message_body.
Or maybe better to provide $message_body_nl so as to have both.
------------------------------------------------------------------------------
(43) 23-Apr-02 T An option to treat 4xx as 5xx from STARTTLS
This would make Exim retry in clear unless the host is in hosts_require_tls.
------------------------------------------------------------------------------
(44) 24-Apr-02 ? Use errors_to for timeouts after redirect syntax errors
A syntax error in redirection data (with skip_syntax_errors false) causes a
defer. Eventually, the address may time out. This suggestion is that, when it
does, the bounce is sent to errors_to rather than to the sender.
------------------------------------------------------------------------------
(45) 13-May-02 T smtp_etrn_serialize_id = ....
The default behaviour would be equivalent to
smtp_etrn_serialize_id = $smtp_command_argument
------------------------------------------------------------------------------
(47) 16-May-02 S Access to all addresses in batched local delivery
Miquel van Smoorenburg
In a batched local delivery with more than one recipient, there's no way to
access the list of recipients for doing custom things, such as stuffing them
all into a header. (BSMTP is the only approach; not everybody can use it.)
Suggested patch supplied.
------------------------------------------------------------------------------
(48) 21-May-02 M Support for ATRN (server and client)
Brian Candler
Server: If Exim had the ability to accept an ATRN command and then simply
invoke an external program, passing the SMTP stream on stdin and stdout and
the authenticated id as a parameter, that would do the job nicely.
Client: We need a variant of 'exim -bs' which would connect to a specified
host, send AUTH/ATRN, and then accept incoming messages as usual.
------------------------------------------------------------------------------
(50) 22-May-02 T Add comment (duplicate address) to Envelope-To:
This is just to minimize the confusion some people have.
------------------------------------------------------------------------------
(51) 07-Jun-02 S Option to use another address in callout MAIL FROM
This would be an address to try if MAIL FROM:<> failed. Is this actually going
to be helpful? See also 101.
------------------------------------------------------------------------------
(53) 11-Jun-02 S Make local_scan() dynamically loadable
David Woodhouse sent a patch. There's a more sophisticated one from Marc
Merlin. (See also Peter Benie's comments.) But should the base Exim have all
this in it?
------------------------------------------------------------------------------
(54) 11-Jun-02 S Ignore -Ac if called as mailq
I am not sure if this makes sense. This flag requests a listing of a different
mail queue, but Exim doesn't work like that. Is is not better for people to be
aware of this?
------------------------------------------------------------------------------
(55) 13-Jun-02 M Rewriting whole header lines
Dave C.
Current rewriting rules apply to individual addresses in header lines. This
feature would use a regex to match whole lines and replace them. It could be
useful for patching up syntactically invalid lines from crappy clients, before
the syntax check kicks in. (It might also be useful for hiding local host names
in Received: headers.)
------------------------------------------------------------------------------
(58) 26-Jun-02 ? Extend PAM support
Apparently PAM can do challenge-response authentication. The Exim interface
can't handle this. Investigate and think about how to do this.
------------------------------------------------------------------------------
(59) 26-Jun-02 M A "custom" authenticator
... that is simply a front end to external code. For example, there may be
an external API that hides the user password and does CRAM-MD5 when passed the
details of the challenge and response.
------------------------------------------------------------------------------
(60) 27-Jun-02 S Make trusted_users a local part list
So that it can use lsearch etc.
------------------------------------------------------------------------------
(62) 28-Jun-02 S Remove headers before DATA ACL
Patrice Fournier
"I'd like to be able to give Exim a list of headers that must be removed
from the message at arrival, before data_acl processing (and before the
rcpt_acl warn headers are added to the message)."
------------------------------------------------------------------------------
(63) 28-Jun-02 S Access to ACL-added headers in ACLs
Patrice Fournier
"I'd like also to be able to look at the already added headers by a
rcpt_acl when still checking rcpt_acl (either later in the acl for the same
RCPT TO or for another RCPT TO)."
------------------------------------------------------------------------------
(65) 28-Jun-02 M Expand fallback hosts
See also 174 of the Exim 3 list.
------------------------------------------------------------------------------
(66) 01-Jul-02 M Use Berkeley DB 4 concurrent access features
This might give better performance on very busy sites by reducing the
contention for access to hints databases. Rob Butler points out that this could
also be useful to allow updates of other DB files used by Exim to happen
concurrently. Another thing to think about with BDB is the possible use of
B-trees.
------------------------------------------------------------------------------
(68) 01-Jul-02 S Add sender host to delivery line
"Would it be possible to have a "sending_host_on_delivery" option that
logs the IP of the sending host in the => line?" Also requested was amount of
data transmitted for a non-delivery attempt.
------------------------------------------------------------------------------
(69) 03-Jul-02 T Log selector to log whoson checs
Matt Bernstein
"I'd quite like a log_selector option which could spot you'd done a whoson
lookup in your DATA ACL and maybe log it as W=user."
------------------------------------------------------------------------------
(70) 09-Jul-02 S A way of changing the RCPT address in an accept router
So as to avoid duplication problems when sending multiple addresses in multiple
copies to the same address.
------------------------------------------------------------------------------
(73) 17-Jul-02 M Match a list from within a condition
e.g. ${if matchdomain {$domain}{+domainlist} ...
${if matchhost {$sender_host_address}{1.2.3.4/10:2.3.4.5/16}...
Thought needed about how to handle host names. This may be too messy to specify
cleanly.
22-Apr-04: Implemented for domains, addresses, and local parts. Hosts are
too messy!
------------------------------------------------------------------------------
(74) 22-Jul-02 M Extend -bV to do more semantic checking
For example, diagnose "local_hosts" that should probably be "+local_hosts".
------------------------------------------------------------------------------
(75) 23-Jul-02 S Reference option on command line
The idea here is that a spam scanner that re-injects a message can supply a
reference on the command line that gets logged with R=.
------------------------------------------------------------------------------
(78) 30-Jul-02 S Expand queue_only (and/or queue_only_file)
The requirement is to make it possible to queue messages if certain conditions
are met (e.g. messages from certain local users). See also 93.
This control can now be achieved in the ACL - is this still needed?
------------------------------------------------------------------------------
(79) 31-Jul-02 S Additional info for log lines
An option to set an expanded string to be added to <= lines. And also for the
other delivery lines? See also 15.
------------------------------------------------------------------------------
(84) 09-Aug-02 S Make interfaces available in a variable
Something like $local_interfaces. Maybe limit the max length.
------------------------------------------------------------------------------
(85) 12-Aug-02 S/M Notice database connection failures
The small version of this just removes a server from the list within a single
Exim process when a connection to it fails. The bigger project would use the
retry database - but that has implications for bottlenecking and may not be
helpful. See also item 109. Another suggestion is to randomize the order in
which database servers are tried (randomize_database_servers). And another is
to measure response times and remember which server is fastest.
------------------------------------------------------------------------------
(87) 12-Aug-02 M Partial lookups for query-style lookups
The suggestion is to allow the lookup to contain a keystring (same syntax as
single-key lookups) which is then permuted and place in a suitable variable
each time - $permuted_key or something.
------------------------------------------------------------------------------
(88) 20-Aug-02 S Allow special retrying for forced defer
See also 146 in Exim 3 wish list above.
------------------------------------------------------------------------------
(89) 20-Aug-02 S Also allow retry rules on routers and transports
------------------------------------------------------------------------------
(90) 23-Aug-02 M Macros with arguments, a la C
I don't like this, because of the cost of frequent interpretation.
------------------------------------------------------------------------------
(93) 27-Aug-02 S queue_only_condition
Peter A. Savitch
queue_only_condition global option, expanded string. This contain
condition, which if evaluated to `no' or `false' or `0', behaves like
queue_only (queue_only_load ?). Don't know what to do is the string
expansion fails with DEFER (either force queueing or continue with
immediate delivery). Another option can control Exim behaviour if the
expansion fails. Don't know how the name for it ;-) See also 78.
This control can now be achieved in the ACL - is the new feature now needed?
------------------------------------------------------------------------------
(95) 27-Aug-02 S Log all parents as a router option
So that specific addresses can be logged like this. Should there be more log
selector options per router? Per transport?
------------------------------------------------------------------------------
(99) 28-Aug-02 L Test pre-conditions in order given
This would get round certain problems with require_files. However, it is
totally incompatible, and therefore an "Exim 5" wish.
------------------------------------------------------------------------------
(101) 02-Oct-02 M Callout and <> rejections
Some people don't want to fail the callout if the MAIL FROM:<> command is
rejected. Think of a way of handling this tidily. See also 51.
------------------------------------------------------------------------------
(102) 03-Oct-02 M Log option to suppress message-id logging
M because it would involve a change to eximstats.
------------------------------------------------------------------------------
(106) 09-Oct-02 S Appendfile to create directory not as user
Arrange for the setup entry to appendfile to create the directory under some
other uid (and with given owners/permissions?)
------------------------------------------------------------------------------
(109) 15-Oct-02 M Remember when LDAP (etc) servers are down
The idea would be to use some kind of retry rule, just like for hosts.
See also 85.
------------------------------------------------------------------------------
(110) 18-Oct-02 M errors_to for pipe command in filter
To work in the same was as errors_to for deliver commands.
------------------------------------------------------------------------------
(113) 15-Nov-02 M support for XMLRPC
Patch supplied for 4.10 by Joel Vandal.
------------------------------------------------------------------------------
(114) 04-Dec-02 M local_scan: return message on accept
(This actually dates from earlier.) The problem with this is that the string
currently passes into $local_scan_data. Thus, an incompatible change of some
sort would be required. Possibly a global that local_scan can set?
------------------------------------------------------------------------------
(118) 10-Dec-02 S access to Perl from local_scan
------------------------------------------------------------------------------
(119) 12-Dec-02 M ability to specify additional headers in an autoreply
This is so that vacation messages etc can have MIME headers that specify, for
example, the character set.
------------------------------------------------------------------------------
(125) 02-Jan-03 M Per-host daemon logging
"So what I would like is an option like debug_hosts, that allows to specify
an hostlist, and if the current incoming/outgoing hosts matches, creates a
logfile like $hostname_(in|out).log in my logdirectory."
------------------------------------------------------------------------------
(127) 06-Jan-03 M Different messages for different callout failures
The real requirement here is to detect when a callout "MAIL FROM:<>" failed, so
that a specific warning about that can be sent, different to the message when a
callout "RCPT TO:" fails. I think this is in fact now mostly done.
------------------------------------------------------------------------------
(129) 09-Jan-03 M Keep track of DNSBL timeouts, and refrain from calling
If so configured, keep track of DNSBL timeouts in a hints record, and don't
retry that DNSBL for a while after (a sufficient number of) timeouts. It is
effectively disabled for a while. Log enable/disable, of course. Another
thought is an option not to apply +defer_unknown unless *all* DNSBL lookups in
a list defer.
------------------------------------------------------------------------------
(130) 09-Jan-03 M A number of LDAP-related things
Peter A. Savitch
OpenLDAP 2.1 is going to be more popular (2.1.9 is available with many
bug fixes). TLS-enabled LDAP is an interesting and usefull thing.
I can try to implement some things and send the patches, like with
ldapi.
How do You see:
1) The propagation of TLS options (key, certificate, CA certificate)
to the OpenLDAP library.
2) (was dereferencing; done in 4.23).
------------------------------------------------------------------------------
(131) 09-Jan-03 S Additional variables
Peter A. Savitch
$root_uid Why?
(Some that were previously here are done)
$smtp_accept_count -- used for acl_smtp_connect
$queue_runners -- children of the listening daemon could use this
value for controlling the number of queue runners
I don't like either of these because they cannot be real-time values. They
would be snapshots of the values at the time the process was forked from the
daemon, and I fear they would just be confusing. For processes that were not
forked from the daemon they couldn't be set at all.
------------------------------------------------------------------------------
(131) 09-Jan-03 S Additional options
Peter A. Savitch
exim_processes_max
exim_file_descriptors_max
queue_run_condition -- to deprecate queue_run_max, better system
load control
Given Exim's distributed nature, I'm not at all sure how the first two of these
can usefully be implemented.
------------------------------------------------------------------------------
(132) 16-Jan-03 M Option for when a transport filter fails (crashes)
Freezing is one obvious option. Currently, Exim just retries. Another user
wanted to retry without the filter, but that is much harder.
------------------------------------------------------------------------------
(136) 24-Jan-03 M Make "personal" available as a condition for use in routers
------------------------------------------------------------------------------
(138) 28-Jan-03 M A variable containing what was matched in a host list
Or, presumably, other lists. This is so that ACL messages can say things like
"your host name matches xxxx". Note: not the same as $domain_data. Also, this
could be tricky with lookups and things that match in files.
------------------------------------------------------------------------------
(143) 06-Mar-03 L Ability to have multiple authenticators of same type
For example, to have two PLAIN authenticators; if the first fails, try the
second.
------------------------------------------------------------------------------
(144) 07-Mar-03 T ACL control = local_scan_skip to skip the local scan
A bigger project would be control = local_scan <xxx> where xxx could select
different local_scan functions (possibly by dynamic loading).
This can now be simulated using the fact that ACL variables are preserved,
so it doesn't look as it once did.
------------------------------------------------------------------------------
(145) 07-Mar-03 T Export string_cat() to local_scan()
------------------------------------------------------------------------------
(147) 17-Mar-03 T Option to treat 5xx as 4xx if received on initial connection
This issue is controversial. That may be a good reason for not changing
anything.
------------------------------------------------------------------------------
(153) 25-Apr-03 S A way of making log_as_local apply to the smtp transport
Either an option on the transport, or log_remote_as_local for the router.
Messy, either way. Maybe log_local_as_local and log_remote_as_local, and
deprecate log_as_local?
------------------------------------------------------------------------------
(154) 01-May-03 M Teergrubing at the CR/LF level
It is believed that the most effective way to teergrube is to insert a delay
between transmitting CR and LF in the SMTP response. Furthermore, this is also
the best place to test for bad synchronization (i.e. at the last possible
time).
------------------------------------------------------------------------------
(155) 01-May-03 S "control=no_pipelining" for connect and EHLO ACLs
Yet more flexibility! Maybe this should be a more general control for what is
sent in response to EHLO.
------------------------------------------------------------------------------
(156) 06-May-02 M Finer-grained synchronisation checking
On operating systems that can be asked whether any sent bytes have not yet been
ACK'd at the TCP/IP level, a finer-grained check for proper synchronisation can
be done. All bytes must have been ACK'd if the client has received the previous
response before sending the next command. See also 293.
------------------------------------------------------------------------------
(157) 07-May-03 M Newline as a list item separator
This will make life easier for lists obtained form databases where the
separator is naturally a newline.
------------------------------------------------------------------------------
(158) 13-May-03 M Ability to add to OK message for SMTP commands
For sending reasons for slow response, etc.
------------------------------------------------------------------------------
(160) 19-May-03 M Remove headers using wild cards
------------------------------------------------------------------------------
(162) 28-May-03 M/L Use of real numbers in filters, expansions, and options
The motivation for this is for handling spam scores that are real numbers. The
questions are (a) how widely should it spread and (b) whether floating point or
fixed point representations should be used. And what about the eval operator?
------------------------------------------------------------------------------
(164) 02-Jun-03 S Set variables for interface and port in smtp transport
These could be useful for varying HELO data etc. See also several other
items about interfaces above.
------------------------------------------------------------------------------
(166) 18-Jun-03 S CN verification in client TLS code
A tls_verify_cn option is suggested by Sven Geggus.
------------------------------------------------------------------------------
(168) 19-Jun-03 S Ability to add a header recording envelope rewrites
Current code adds a deleted header with only some information. Maybe what is
needed is a flag for a rewrite rule.
------------------------------------------------------------------------------
(169) 19-Jun-03 M A way of detecting timeouts in callout returns
------------------------------------------------------------------------------
(170) 23-Jun-03 S Option to accept rather than defer after local scan timeout
Suggested patch supplied.
------------------------------------------------------------------------------
(171) 23-Jun-03 S Option to make timeout a soft failure on pipe transport
------------------------------------------------------------------------------
(172) 23-Jun-03 M Option to make SQL query to specific server
------------------------------------------------------------------------------
(175) 04-Jul-03 S show_all_ancestors_in_errmsg for the redirect router
This is the opposite of hide_child_in_errmsg in effect.
------------------------------------------------------------------------------
(180) 14-Jul-03 M Extend never_users to be more flexible
e.g. never_users = ! mailnull : ! cyrus : !mailman : 0-100
------------------------------------------------------------------------------
(183) 16-Jul-03 S freeze_tell_text to add custom text to the message
------------------------------------------------------------------------------
(185) 24-Jul-03 S An expansion operator that decodes RFC 2047 strings
------------------------------------------------------------------------------
(188) 13-Aug-03 T batch_max=0 to mean unlimited
------------------------------------------------------------------------------
(189) 22-Aug-03 S Allow filter "logwrite" to write to syslog
I feel this is a dangerous facility, and also of very minority interest, at
least for user's filters. Allowing a system filter to write to mainlog or
syslog may be different. However, writing the main log would only be possible
if the filter runs as root or exim.
------------------------------------------------------------------------------
(190) 22-Aug-03 S A way of testing "forced delivery" in filter and routers
------------------------------------------------------------------------------
(191) 26-Aug-03 M Preserve $address_data for a verified recipient
The idea is to preserve it in the recipients data structure so that local_scan
can have access to it. The value could also be used as the initial value of
$address_data while routing.
------------------------------------------------------------------------------
(192) 05-Sep-03 M Better handling of TXT records for dnslists
When multiple lists are accessible via a merged lookup, handling TXT records
is difficult. An option for doing the TXT lookup in a sub-list has been
suggested, with syntax such as
dnslists = list.example.org=127.0.0.2%dialups \
,127.0.0.3%relays \
,127.0.0.5%spews
------------------------------------------------------------------------------
(194) 10-Sep-03 M $addresslist_data to be like $host_data/$domain_data
------------------------------------------------------------------------------
(195) 29-Sep-03 M A variable containing the error for verify = header_syntax
Maybe there should always be a variable with the error message for all the
different kinds of verify failure.
------------------------------------------------------------------------------
(196) 30-Sep-03 S A way of detecting whether it was HELO or EHLO in the ACL
$received_protocol isn't reset until after the command is accepted (which
seems right), and $smtp_data shows only the arguments. Maybe $smtp_command?
------------------------------------------------------------------------------
(197) 30-Sep-03 S MACROS_DROP_PRIVS and ALT_CONFIG_DROP_PRIVS
Now that alternative configurations can be restricted to certain directories,
some more flexibility can be allowed. Not by default, though.
------------------------------------------------------------------------------
(198) 01-Oct-03 M Accept mail after local_scan() crash instead of defer
This may not be as easy to implement as it sounds; one is never sure of the
environment after a crash. Is is actually a good idea? The crashing local_scan
may have wrecked the memory in arbitrary ways; for example, screwing up the
recipients list...
------------------------------------------------------------------------------
(199) 01-Oct-03 M ${pipe which will pipe the message to a script ...
... and otherwise behave as ${run. Probably needs to have locking out features
so that it can be turned off for users .forwards if the sysadmin so desires.
------------------------------------------------------------------------------
(200) 07-Oct-03 L Alternative ways of storing hints
People want to store hints in databases. Some assert that SQL databases can
be made to perform satisfactorily. If a general interface could be worked on,
people could at least try different strategies. See also 66 above, which is
specifically concerned with Berkeley DB. Another possible option is a switch to
disable smtp-wait hints - to avoid contention problems.
------------------------------------------------------------------------------
(201) 07-Oct-03 M A "soft bounce" feature
This is an option that turns all hard bounces into soft bounces. The idea is
that it can be used as a safety-net while testing configurations. Instead of a
local bounce, the message stays on the queue; instead of 5xx SMTP responses,
4xx ones are given.
The ability to do the opposite - turn 4xx into 5xx under certain circumstances
might also be useful (e.g. after a certain time). This might best be done by
extending the retry logic to recognize 4xx as a special error. (This is now
done.)
------------------------------------------------------------------------------
(202) 10-Oct-03 S -bvsomething to do a callout after the verify
------------------------------------------------------------------------------
(203) 14-Oct-03 S verify=something to easily check for header presence
This is purely cosmetic; "condition" can already be used.
------------------------------------------------------------------------------
(204) 27-Oct-03 S an inverted queue_only_file
That is, queue if a file does NOT exist.
------------------------------------------------------------------------------
(205) 27-Oct-03 S expand smtp_accept_queue_per_connection
------------------------------------------------------------------------------
(206) 27-Oct-03 S appendfile: a variable containing the maildir base name
------------------------------------------------------------------------------
(207) 29-Oct-03 S ability to keep trusted users in a file - expand it.
------------------------------------------------------------------------------
(208) 31-Oct-03 M cache temporary verification errors and fail after a time
This request was for a way of turning temporary verification failures into
permanent ones after some fixed time.
------------------------------------------------------------------------------
(209) 31-Oct-03 S a way of making crashes in pipe commands temporary errors
------------------------------------------------------------------------------
(210) 31-Oct-03 S runtime option to change the daemon name used for tcprwappers
A patch for compile time was supplied, but this seems better as a runtime
option, for use with multiple Exim daemons.
------------------------------------------------------------------------------
(211) 31-Oct-03 S ability to disable debugging output from -bh & -bhc
------------------------------------------------------------------------------
(212) 31-Oct-03 M specify headers lines in HELO ACL to be added to all msgs
------------------------------------------------------------------------------
(214) 05-Nov-03 S Put the wild part of local part prefix/suffx in variables
Unfortunately, this isn't quite as trivial as it seems.
------------------------------------------------------------------------------
(215) 14-Nov-03 S A way of turning off message-submission fix-ups
Globally, and perhaps also via an ACL control so that it can be done on a
per-message basis.
------------------------------------------------------------------------------
(215) 26-Nov-03 M/L Conversion of IDNA domain names for logging
IDNA (RFCs 3490-3492) converts domains names containing non-ASCII characters
into ASCII strings of a special form. Exim will of course handle these.
However, it might be nice to convert them to a local code for logging. This
might be quite a big project: there's also output from -bp and eximon queue
display and no doubt other places as well. (Utilities that process the logs,
e.g. exigrep, eximstats, will be automatically handled if the logs are
changed.)
------------------------------------------------------------------------------
(216) 27-Nov-03 S Option to bounce if required TLS doesn't happen
This is for the smtp transport with hosts_require_tls set. Currently, it
defers. Possibly the best approach is to make the error one that can be seen by
the retry logic.
------------------------------------------------------------------------------
(217) 27-Nov-03 M A function to pass back variables from Perl
This is a function that can be called from Perl, to take a name and a value and
put that value into an Exim variable.
------------------------------------------------------------------------------
(218) 01-Dec-03 M A local_scan-like hook at system filter time
That is, make a C API available for custom filtering at this point.
------------------------------------------------------------------------------
(221) 18-Dec-03 U Merge routers and ACLs - or at least make more similar
"It will be very useful to be able to use most of the ACL conditions
(authenticated, hosts, senders, sender_domains, ... ) in routers and also the
possibility to have multiple conditions in routers. It will be great to also
be able to set variables in routers like in acl's." This is effectively a
radical suggestion for a complete re-design, and is therefore BIG.
------------------------------------------------------------------------------
(222) 19-Dec-03 S Iterative option for dnsdb
A way of getting a dnsdb lookup to chop off components until something is
found: e.g. ${lookup dndsb-i{ns=a.b.c.d}} would look for nameservers for
a.b.c.d, then b.c.d, etc.
------------------------------------------------------------------------------
(223) 22-Dec-03 S Support SOA lookup in dnsdb lookups
------------------------------------------------------------------------------
(225) 22-Dec-03 M Add acl= to routers
This would use an ACL to "control access" to a router, opening up a number
of interesting possibilities. Details of possible limitations need to be
investigated.
------------------------------------------------------------------------------
(226) 23-Dec-03 S A way of treating DEFER as fail in dnsdb lookups
(i.e. the dnsdb lookup failed, so accept the message)
------------------------------------------------------------------------------
(227) 30-Jan-04 M A configuration .if facility
"Second with the .ifdef and such, it would be nice to have a base .if,
so I could do something like
.if DEFINED_DATA == xyz
configuration here
.elseif DEFINED_DATA == abc
configuration here
.else
configuration here
.endif
also this would be nice at least in my case in the system filters, but
isn't required but you could pass the defined data to the system, in
variables."
------------------------------------------------------------------------------
(229) 30-Jan-04 M New expansion mechanism: {list ...}
"Proposed syntax: {list {separator}{item}{item}...}
This first expands the contents of {separator} and all of the {item}s,
then constructs a separator-delimited list. The twist is: if an {item}
generates the empty string, no separator will be generated for it.
The entire construct will fail is {separator} fails, or all {item}s
fail. If just some {item}s fail, they will be treated as if they
generated empty strings.
Examples:
{list {,}{aaaaaa}{bbbbbb}{cccccc}} -> aaaaaa,bbbbbb,cccccc
{list {,}{:fail:}{bbbbbb}{cccccc}} -> bbbbbb,cccccc
{list {,}{aaaaaa}{:fail:}{cccccc}} -> aaaaaa,cccccc
{list { }{aaaaaa}{bbbbbb}{}} -> aaaaaa bbbbbb
{list { }{:fail:}{:fail:}{:fail:}} -> :fail:
{list {:fail:}{aaaaa}{bbbb}{cccc}} -> :fail:
See particularly examples 2-4, which handle the case of a missing first
and last item with ease; doing this using {if ...} would be quite difficult!"
------------------------------------------------------------------------------
(230) 30-Jan-04 M Find IP addresses of a domain's nameservers
This needs some way of processing a list of things in a similar way, which
should perhaps be a more general facility.
------------------------------------------------------------------------------
(231) 30-Jan-04 ? -C has a number of problems when used for real
-C was intended for testing; people are using it for "alternate"
configurations, and it doesn't work too well. Can a better way of doing this be
invented?
------------------------------------------------------------------------------
(232) 02-Feb-04 ? Make parts of the code loadable
The idea being that drivers, etc. could be compiled separately. There are, of
course, security issues. This is not something I want to go into at present.
------------------------------------------------------------------------------
(235) 02-Feb-04 T Make smtp_accept_count available as a variable
This is for use in ACLs. Of course, it is a snapshot of the count at the
start of the receiving process.
------------------------------------------------------------------------------
(236) 02-Feb-04 S String in local_scan that's added to the binary version string
------------------------------------------------------------------------------
(237) 02-Feb-04 M Add_header in ACLs because "message" is overloaded
This would be useful for verbs where "message" is an error message.
------------------------------------------------------------------------------
(238) 05-Feb-04 S ${address to handle multiple addresses
At present, ${address expects to see just one address. An extension would let
it handle header lines with multiple addresses, just retaining the actual
addresses. Or perhaps a new operator is needed?
------------------------------------------------------------------------------
(239) 23-Feb-04 ? Expansion items for encryption/decryption
Perhaps for some kind of cookie handling? This would need an external crypto
library, because there's no crypto code in Exim itself.
------------------------------------------------------------------------------
(240) 23-Feb-04 ? Some way to know if a ip is a mx for a given domain
Some kind of iterative operation for dnsdb might be a general way of providing
this.
------------------------------------------------------------------------------
(242) 01-Mar-04 ? Run a filter from an expansion condition
This would add a lot of power to ACLs, but its implementation might be tricky
because of the possibility of recursion.
------------------------------------------------------------------------------
(243) 01-Mar-04 ? Run an ACL from an expansion condition
The problem here is knowing what data is available at an arbitrary time.
------------------------------------------------------------------------------
(244) 01-Mar-04 ? Add an on-success event to transports
This could just be an expansion string, whose value is either ignored or
logged, but it could be used to run SQL updates or run programs etc.
However, what is "success" when a transport has multiple recipients?
------------------------------------------------------------------------------
(245) 01-Mar-04 M Add all the string expansion conditions to filters
Some thought would be needed on how to design the syntax for this.
------------------------------------------------------------------------------
(247) 09-Mar-04 S IP addresses that are never looked up
It would be nice if we could prevent this for certain IP addresses for
which we _know_ we'll never get a valid PTR record, like 2002::/16.
So a new option might reasonably default to:
hosts_never_lookup = <; 2002::/16
------------------------------------------------------------------------------
(253) 05-Apr-04 M Use ESMTP and TLS for recipient callout verification
The best way to do this would involve quite a bit of refactoring so as to
abstract some of the code from the smtp transport into subroutines that could
also be used from the callout code. The tls parameters should probably be
taken from the transport. That might also require some substantial code
refactoring. See also 294.
------------------------------------------------------------------------------
(260) 30-Apr-04 S Respect +tls_cipher +tls_peerdn in rejectlog entries
------------------------------------------------------------------------------
(261) 05-May-04 S Add a "required_version" option
So that configurations can insist on a specific Exim version.
------------------------------------------------------------------------------
(262) 10-May-04 S Add "scratch" ACL variables
The idea is for variables that are flushed at the start of each ACL. I'm not
really convinced that these are worth implementing.
------------------------------------------------------------------------------
(263) 10-May-04 S Add variable $router_name $transport_name
These could be used in debug_print settings, which are output during -bt, and
thus don't need the privilege to run with -d.
------------------------------------------------------------------------------
(265) 25-May-04 M An init.d script for exim is needed
The old sendmail script used to "just work" because it just did -bd -q 20m or
whatever. Newer versions start more than one sendmail daemon, so do not work.
------------------------------------------------------------------------------
(267) 25-May-04 S tarpitting delay option
A modifier that sets a delay between lines for multiline responses.
------------------------------------------------------------------------------
(268) 25-May-04 S? Add a PID to every log line
Given that pids are reused non-cyclically these days, is this actually useful?
------------------------------------------------------------------------------
(269) 26-May-04 U Run both a system and a user filter in test mode
exim -bF systemfilter -bf userfilter -f sender@dom < message
This would allow testing the way the userfilter handles the system
variables set by the systemfilter.
------------------------------------------------------------------------------
(270) 01-Jun-04 M Add headers at top and middle
Various initiatives like SPF and DomainKeys require header lines to be added
above or in the middle of existing headers. Exim always adds at the bottom.
When these requirements are more standard and clearer, some way of controlling
where header lines are added will probably become necessary. Some new syntax
will be required.
This can now be done fairly generally from local_scan(), and at the start and
after the Received: block from an ACL. Is anything more needed?
------------------------------------------------------------------------------
(271) 02-Jun-04 L Callouts at routing time
From a user's message:
> I would like to be able to:
>[...]
> 2) Forcing callouts as address verification at router level
> [ check_callout just like check_local_user ]
>
> I would like to redirect messages in some domain to "domain with callout
> verification" and to "domain without callout verification"
>
> e.g.
> userA@??? -> userX@??? (use callout to verify)
> userB@??? -> userY@??? (do not use callout verify)
>
> [both out-* domains delivered via "callout ready" transports]
Other versions of the wish:
* limiting callouts in acls to specific transport
verify = recipient/callout=5s,transport:intranet_smtp
* adding "select transport" to ACL conditions
accept domains = +local_domains
transport = cyrus_ltcp
verify = recipient/callout=5s
------------------------------------------------------------------------------
(272) 07-Jun-04 S Expand hosts_randomize
It occurs in manualroute and in smtp.
------------------------------------------------------------------------------
(278) 21-Jun-04 M quota_warn_message_file option
Similar to the bounce and delivery warn message files.
------------------------------------------------------------------------------
(280) 23-Jun-04 M A way of adding a header line after callout defer_ok
This would record that, e.g., a sender domain verified, but the callout
could not be done.
------------------------------------------------------------------------------
(285) 16-Jul-04 M Separate and independent log_selector for rejectlog
For example: mainlog_selector and rejectlog_selector, with log_selector setting
both of them.
------------------------------------------------------------------------------
(286) 21-Jul-04 M Distinguishing a larger number of errors
For instance, detecting "connection reset by peer" (ENETRESET or ECONNRESET)
might be useful.
------------------------------------------------------------------------------
(288) 10-Aug-04 M Option for verify to require MX
e.g. verify=sender/require_mx
I'm not too keen because this is rather special purpose, and of course could
only apply if the verification happened to hit a dnslookup router.
------------------------------------------------------------------------------
(289) 10-Aug-04 L Option to treat defers in database lookups as "not found"
This is so that alternatives can be coded for when databases are down. A
suggested patch has been sent, but it just catches all instances of "defer"
from a lookup in an expansion string. These can occur for a number of different
reasons, not just connection failures. I think that we need a specific
"connection failed" indicator. Also, what about lookups in lists?
------------------------------------------------------------------------------
(291) 13-Aug-04 M An ACL or "local_scan()" to be run on size excession
The idea is to give something a chance to look at the data so far received when
more than message_size_limit (or some other limit) has arrived. I am not sure
how useful this would actually be in practice.
------------------------------------------------------------------------------
(292) 13-Aug-04 M Overall timeout for message reception
A client could in priciple keep an SMTP connection open for a very long time by
trickling in data very slowly. Also, after message_size_limit is exceeded, Exim
continues to swallow the data (though it does not write it to disk) until the
end is reached. Again, the connection could be held open for a very long time.
Some kind of overall time limit for an SMTP connection, possibly reset at the
start of each message, might be helpful in these situations.
------------------------------------------------------------------------------
(294) 23-Aug-04 L Callouts and AUTH and LMTP
People want to do callouts using LMTP as well as SMTP, and that would also
include sockets as well as TCP/IP connections. Also, people want to make use of
AUTH during the callout checking, on all types of connection. I suppose that
means making TLS available as well. This probably means a rewrite of the code
that actually does the callout. Should we use the relevant transport in a new
"callout" mode instead of keeping things separate? See also 253.
------------------------------------------------------------------------------
(296) 09-Sep-04 S Make deliver_time work for == lines as well as =>
What about ** lines?
------------------------------------------------------------------------------
--- HWM 297 ------------------------------------------------------------------
---------------------------- End of WishList ---------------------------------
Index: ABOUT
====================================================================
$Cambridge: exim/exim-doc/doc-scripts/ABOUT,v 1.1 2004/10/08 10:38:48 ph10 Exp $
CVS directory exim/exim-doc/doc-scripts
---------------------------------------
This directory contains various scripts that are used to build the distributed
documentation from its source files.
End
Index: ABOUT
====================================================================
$Cambridge: exim/exim-doc/doc-src/ABOUT,v 1.1 2004/10/08 10:38:48 ph10 Exp $
CVS directory exim/exim-doc/doc-src
-----------------------------------
This directory contains documentation files that are processed in some way in
order to make the documentation files that form part of Exim distributions. A
non-standard document processor is currently in use (October 2004), but in the
long term something more standard will have to take over.
End
Index: ABOUT
====================================================================
$Cambridge: exim/exim-doc/doc-txt/ABOUT,v 1.1 2004/10/08 10:38:48 ph10 Exp $
CVS directory exim/exim-doc/doc-txt
-----------------------------------
This directory contains various documentation files that exist only as plain
text files, and are distributed in that format.
End
Index: ABOUT
====================================================================
$Cambridge: exim/exim-src/ABOUT,v 1.1 2004/10/08 10:38:48 ph10 Exp $
CVS directory exim/exim-src
---------------------------
This directory contains everything that is included in an Exim distribution
tarball, with the exception of the doc directory and an empty Local directory.
You can build Exim from the contents of this directory by adding a Local
directory that contains appropriate configuration files.
End