-
. /////////////////////////////////////////////////////////////////////////////
. This is the primary source of the Exim Manual. It is an xfpt document that is
. converted into DocBook XML for subsequent conversion into printable and online
. Update the Copyright year (only) when changing content.
. /////////////////////////////////////////////////////////////////////////////
-.set previousversion "4.97"
+.set previousversion "4.98"
.include ./local_params
.set ACL "access control lists (ACLs)"
.set drivernamemax "64"
.macro copyyear
-2023
+2024
.endmacro
. /////////////////////////////////////////////////////////////////////////////
.cindex "FAQ"
As well as Exim distribution tar files, the Exim website contains a number of
differently formatted versions of the documentation. A recent addition to the
-online information is the Exim wiki (&url(https://wiki.exim.org)),
+online information is &url(https://wiki.exim.org,the Exim wiki),
which contains what used to be a separate FAQ, as well as various other
examples, tips, and know-how that have been contributed by Exim users.
The wiki site should always redirect to the correct place, which is currently
.cindex "bug reports"
.cindex "reporting bugs"
Reports of obvious bugs can be emailed to &'bugs@exim.org'& or reported
-via the Bugzilla (&url(https://bugs.exim.org)). However, if you are unsure
+via &url(https://bugs.exim.org,the Bugzilla). However, if you are unsure
whether some behaviour is a bug or not, the best thing to do is to post a
message to the &'exim-dev'& mailing list and have it discussed.
versions. However, the more recent releases seem to have standardized on the
Berkeley DB library.
+.new
+Ownership of the Berkeley DB library has moved to a major corporation;
+development seems to have stalled and documentation is not freely available.
+This is probably not tenable for the long term use by Exim.
+.wen
+
Different DBM libraries have different conventions for naming the files they
use. When a program opens a file called &_dbmfile_&, there are several
possibilities:
Yet another DBM library, called &'tdb'&, is available from
&url(https://sourceforge.net/projects/tdb/files/). It has its own interface, and also
operates on a single file.
+.next
+It is possible to use &url(https://www.sqlite.org/index.html,sqlite3)
+for the DBM library.
.endlist
.cindex "USE_DB"
.code
USE_DB=yes
.endd
-Similarly, for gdbm you set USE_GDBM, and for tdb you set USE_TDB. An
-error is diagnosed if you set more than one of these.
+Similarly, for gdbm you set USE_GDBM, for tdb you set USE_TDB,
+and for sqlite3 you set USE_SQLITE.
+An error is diagnosed if you set more than one of these.
You can set USE_NDBM if needed to override an operating system default.
At the lowest level, the build-time configuration sets none of these options,
.code
DBMLIB = -ldb
DBMLIB = -ltdb
+DBMLIB = -lsqlite3
DBMLIB = -lgdbm -lgdbm_compat
.endd
The last of those was for a Linux having GDBM provide emulated NDBM facilities.
There is further detailed discussion about the various DBM libraries in the
file &_doc/dbm.discuss.txt_& in the Exim distribution.
+.new
+When moving from one DBM library to another,
+for the hints databases it suffices to just remove all the files in the
+directory named &"db/"& under the spool directory.
+This is because hints are only for optimisation and will be rebuilt
+during normal operations.
+Non-hints DBM databases (used by &"dbm"& lookups in the configuration)
+will need individual rebuilds for the new DBM library.
+This is not done automatically
+.wen
+
.section "Pre-building configuration" "SECID25"
-.section "Dynamically loaded lookup module support" "SECTdynamicmodules"
+.section "Dynamically loaded module support" "SECTdynamicmodules"
.cindex "lookup modules"
+.cindex "router modules"
+.cindex "transport modules"
+.cindex "authenticator modules"
.cindex "dynamic modules"
.cindex ".so building"
On some platforms, Exim supports not compiling all lookup types directly into
the main binary, instead putting some into external modules which can be loaded
on demand.
This permits packagers to build Exim with support for lookups with extensive
-library dependencies without requiring all users to install all of those
+library dependencies without requiring all systems to install all of those
dependencies.
-Most, but not all, lookup types can be built this way.
+.new
+Any combination of lookup types can be built this way.
+Lookup types that provide several variants will be loaded as
+Exim starts.
+Types that provide only one method are not loaded until used by
+the runtime configuration.
+.wen
-Set &`LOOKUP_MODULE_DIR`& to the directory into which the modules will be
+For building
+set &`LOOKUP_MODULE_DIR`& to the directory into which the modules will be
installed; Exim will only load modules from that directory, as a security
measure. You will need to set &`CFLAGS_DYNAMIC`& if not already defined
for your OS; see &_OS/Makefile-Linux_& for an example.
Then, for each module to be loaded dynamically, define the relevant
&`LOOKUP_`&<&'lookup_type'&> flags to have the value "2" instead of "yes".
For example, this will build in lsearch but load sqlite and mysql support
-on demand:
+only if each is installed:
.code
LOOKUP_LSEARCH=yes
LOOKUP_SQLITE=2
LOOKUP_MYSQL=2
.endd
+Set also &`LOOKUP_`&<&'lookup_type'&>&` INCLUDE`& and
+&`LOOKUP_`&<&'lookup_type'&>`_LIBS if needed for each lookup type,
+ensuring that duplicates are not present in more global values.
+
+.new
+Similarly, authenticator, router and transport drivers can be built
+as external modules.
+Modules will be searched for as demanded by the runtime configuration,
+permitting a smaller Exim binary.
+
+For building, as above but using
+&`AUTH_*`&, &`ROUTER_*`& and &`TRANSPORT_*`& instead of &`LOOKUP_*`&,
+.wen
.section "The building process" "SECID29"
The word &"set"& at the start of a line, followed by a single space,
is recognised specially as defining a value for a variable.
+.cindex "tainted data" "expansion testing"
+If the sequence &",t"& is inserted before the space,
+the value is marked as tainted.
The syntax is otherwise the same as the ACL modifier &"set ="&.
.cmdopt -bem <&'filename'&>
Features such as authentication and encryption, where the client input is not
plain text, cannot easily be tested with &%-bh%&. Instead, you should use a
specialized SMTP test program such as
-&url(https://www.jetmore.org/john/code/swaks/,swaks).
+&url(https://www.jetmore.org/john/code/swaks/,swaks,swaks).
.cmdopt -bhc <&'IP&~address'&>
This option operates in the same way as &%-bh%&, except that address
suppressing this for special cases.
Policy checks on the contents of local messages can be enforced by means of
-the non-SMTP ACL. See chapter &<<CHAPACL>>& for details.
+the non-SMTP ACL. See section &<<SECnonSMTP>>& for details.
.cindex "return code" "for &%-bm%&"
The return code is zero if the message is successfully accepted. Otherwise, the
provoked if the terminating dot is missing. A further message may then follow.
As for other local message submissions, the contents of incoming batch SMTP
-messages can be checked using the non-SMTP ACL (see chapter &<<CHAPACL>>&).
+messages can be checked using the non-SMTP ACL (see section &<<SECnonSMTP>>&).
Unqualified addresses are automatically qualified using &%qualify_domain%& and
&%qualify_recipient%&, as appropriate, unless the &%-bnq%& option is used.
The &%-R%& option makes it straightforward to initiate delivery of all messages
to a given domain after a host has been down for some time. When the SMTP
-command ETRN is accepted by its ACL (see chapter &<<CHAPACL>>&), its default
+command ETRN is accepted by its ACL (see section &<<SECTETRN>>&), its default
effect is to run Exim with the &%-R%& option, but it can be configured to run
an arbitrary command instead.
colon in the example above are necessary. If they were not there, the list would
be interpreted as the two items 127.0.0.1:: and 1.
-.section "Changing list separators" "SECTlistsepchange"
+.subsection "Changing list separators" "SECTlistsepchange"
.cindex "list separator" "changing"
.cindex "IPv6" "addresses in lists"
Doubling colons in IPv6 addresses is an unwelcome chore, so a mechanism was
-.section "Empty items in lists" "SECTempitelis"
+.subsection "Empty items in lists" "SECTempitelis"
.cindex "list" "empty item in"
An empty item at the end of a list is always ignored. In other words, trailing
separator characters are ignored. Thus, the list in
.cindex "dsearch lookup type"
The given file must be an absolute directory path; this is searched for an entry
whose name is the key by calling the &[lstat()]& function.
-The key may not contain any forward slash characters.
+Unless the options (below) permit a path,
+the key may not contain any forward slash characters.
If &[lstat()]& succeeds then so does the lookup.
.cindex "tainted data" "dsearch result"
The result is regarded as untainted.
separated by a comma. Options, if present, are a comma-separated list having
each element starting with a tag name and an equals.
-Two options are supported, for the return value and for filtering match
+Three options are supported, for the return value and for filtering match
candidates.
The "ret" option requests an alternate result value of
the entire path for the entry. Example:
${lookup {passwd} dsearch,ret=full {/etc}}
.endd
The default result is just the requested entry.
+
The "filter" option requests that only directory entries of a given type
are matched. The match value is one of "file", "dir" or "subdir" (the latter
not matching "." or ".."). Example:
The default matching is for any entry type, including directories
and symlinks.
+The "key" option relaxes the restriction that only a simple path component can
+be searched for, to permit a sequence of path components. Example:
+.code
+${lookup {foo/bar} dsearch,key=path {/etc}}
+.endd
+If this option is used, a ".." component in the key is specifically disallowed.
+The default operation is that the key may only be a single path component.
+
An example of how this
lookup can be used to support virtual domains is given in section
&<<SECTvirtualdomains>>&.
lookup types support only literal keys.
&*Warning 2*&: In a host list, you must always use &(net-iplsearch)& so that
-the implicit key is the host's IP address rather than its name (see section
-&<<SECThoslispatsikey>>&).
+the implicit key is the host's IP address rather than its name
+(see section &<<SECThoslispatsikey>>&).
&*Warning 3*&: Do not use an IPv4-mapped IPv6 address for a key; use the
IPv4, in dotted-quad form. (Exim converts IPv4-mapped IPv6 addresses to this
The given file is an LMDB database.
LMDB is a memory-mapped key-value store,
with API modeled loosely on that of BerkeleyDB.
-See &url(https://symas.com/products/lightning-memory-mapped-database/)
+See &url(https://symas.com/products/lightning-memory-mapped-database/,LMDB)
for the feature set and operation modes.
Exim provides read-only access via the LMDB C library.
${lookup pgsql,servers=master/db/name/pw {UPDATE ...} }
.endd
-.new
A now-deprecated syntax places the servers specification before the query,
semicolon separated:
.code
The new version avoids issues with tainted
arguments explicitly expanded as part of the query.
The entire string within the braces becomes tainted,
-including the server sepcification - which is not permissible.
+including the server specification - which is not permissible.
If the older sytax is used, a warning message will be logged.
This syntax will be removed in a future release.
-.wen
&*Note*&: server specifications in list-style lookups are still problematic.
anything (for example, setting a field to the value it already has), the result
is zero because no rows are affected.
+To get an encryted connection, use a Mysql option file with the required
+parameters for the connection.
+
.subsection "Special PostgreSQL features" SECID74
PostgreSQL lookups can also use Unix domain socket connections to the database.
&*Reminder*&: With this kind of pattern, you must have host &'names'& as
keys in the file, not IP addresses. If you want to do lookups based on IP
-addresses, you must precede the search type with &"net-"& (see section
-&<<SECThoslispatsikey>>&). There is, however, no reason why you could not use
+addresses, you must precede the search type with &"net-"&
+(see section &<<SECThoslispatsikey>>&).
+There is, however, no reason why you could not use
two items in the same list, one doing an address lookup and one doing a name
lookup, both using the same file.
.vitem &*${srs_encode&~{*&<&'secret'&>&*}{*&<&'return&~path'&>&*}{*&<&'original&~domain'&>&*}}*&
-SRS encoding. See SECT &<<SECTSRS>>& for details.
+SRS encoding. See section &<<SECTSRS>>& for details.
.cindex "&%utf8_localpart_from_alabel%& expansion item"
These convert EAI mail name components between UTF-8 and a-label forms.
For information on internationalisation support see &<<SECTi18nMTA>>&.
+
+
+.vitem &*${xtextd:*&<&'string'&>&*}*&
+.cindex "text forcing in strings"
+.cindex "string" "xtext decoding"
+.cindex "xtext"
+.cindex "&%xtextd%& expansion item"
+This performs xtext decoding of the string (per RFC 3461 section 4).
+
+
+
.endlist
.next
The item @[] matches any of the local host's interface addresses.
.next
-Single-key lookups are assumed to be like &"net-"& style lookups in host lists,
+Single-key lookups are assumed to be like &"net-"& style lookups in host lists
+(see section &<<SECThoslispatsikey>>&),
even if &`net-`& is not specified. There is never any attempt to turn the IP
address into a host name. The most common type of linear search for
&*match_ip*& is likely to be &*iplsearch*&, in which the file can contain CIDR
.vindex "&$config_file$&"
The name of the main configuration file Exim is using.
+.vitem &$connection_id$&
+.vindex "&$connection_id$&"
+.cindex connection "identifier logging"
+An identifier for the accepted connection, for use in custom logging.
+
.vitem &$dkim_verify_status$&
Results of DKIM verification.
For details see section &<<SECDKIMVFY>>&.
.row &%acl_smtp_rcpt%& "ACL for RCPT"
.row &%acl_smtp_starttls%& "ACL for STARTTLS"
.row &%acl_smtp_vrfy%& "ACL for VRFY"
+.row &%acl_smtp_wellknown%& "ACL for WELLKNOWN"
.row &%av_scanner%& "specify virus scanner"
.row &%check_rfc2047_length%& "check length of RFC 2047 &""encoded &&&
words""&"
.row &%prdr_enable%& "advertise PRDR to all hosts"
.row &%smtputf8_advertise_hosts%& "advertise SMTPUTF8 to these hosts"
.row &%tls_advertise_hosts%& "advertise TLS to these hosts"
+.row &%wellknown_advertise_hosts%& "advertise WELLKNOWN to these hosts"
.endtable
.cindex "&ACL;" "for non-SMTP messages"
.cindex "non-SMTP messages" "ACLs for"
This option defines the ACL that is run when a non-SMTP message has been
-read and is on the point of being accepted. See chapter &<<CHAPACL>>& for
+read and is on the point of being accepted. See section &<<SECnonSMTP>>& for
further details.
.option acl_not_smtp_mime main string&!! unset
.cindex "&ACL;" "at start of non-SMTP message"
.cindex "non-SMTP messages" "ACLs for"
This option defines the ACL that is run before Exim starts reading a
-non-SMTP message. See chapter &<<CHAPACL>>& for further details.
+non-SMTP message. See section &<<SECnonSMTP>>& for further details.
.option acl_smtp_auth main string&!! unset
.cindex "&ACL;" "setting up for SMTP commands"
.cindex "AUTH" "ACL for"
This option defines the ACL that is run when an SMTP AUTH command is
-received. See chapter &<<CHAPACL>>& for further details.
+received.
+See chapter &<<CHAPACL>>& for general information on ACLs, and chapter
+&<<CHAPSMTPAUTH>>& for details of authentication.
.option acl_smtp_connect main string&!! unset
.cindex "&ACL;" "on SMTP connection"
This option defines the ACL that is run when an SMTP connection is received.
-See chapter &<<CHAPACL>>& for further details.
+See section &<<SECconnectACL>>& for further details.
.option acl_smtp_data main string&!! unset
.cindex "DATA" "ACL for"
This option defines the ACL that is run after an SMTP DATA command has been
processed and the message itself has been received, but before the final
-acknowledgment is sent. See chapter &<<CHAPACL>>& for further details.
+acknowledgment is sent. See section &<<SECdataACLS>>& for further details.
.option acl_smtp_data_prdr main string&!! accept
.cindex "PRDR" "ACL for"
if the PRDR feature has been negotiated,
is run for each recipient after an SMTP DATA command has been
processed and the message itself has been received, but before the
-acknowledgment is sent. See chapter &<<CHAPACL>>& for further details.
+acknowledgment is sent. See section &<<SECTPRDRACL>>& for further details.
.option acl_smtp_dkim main string&!! unset
.cindex DKIM "ACL for"
.option acl_smtp_etrn main string&!! unset
.cindex "ETRN" "ACL for"
+.cindex "ETRN" advertisement
This option defines the ACL that is run when an SMTP ETRN command is
-received. See chapter &<<CHAPACL>>& for further details.
+received.
+If no value is set then the ETRN facility is not advertised.
+See chapter &<<CHAPACL>>& for further details.
.option acl_smtp_expn main string&!! unset
.cindex "EXPN" "ACL for"
.cindex "EHLO" "ACL for"
.cindex "HELO" "ACL for"
This option defines the ACL that is run when an SMTP EHLO or HELO
-command is received. See chapter &<<CHAPACL>>& for further details.
+command is received. See section &<<SECheloACL>>& for further details.
.option acl_smtp_mail main string&!! unset
.option acl_smtp_mailauth main string&!! unset
.cindex "AUTH" "on MAIL command"
This option defines the ACL that is run when there is an AUTH parameter on
-a MAIL command. See chapter &<<CHAPACL>>& for details of ACLs, and chapter
+a MAIL command.
+See chapter &<<CHAPACL>>& for general information on ACLs, and chapter
&<<CHAPSMTPAUTH>>& for details of authentication.
.option acl_smtp_mime main string&!! unset
.cindex "not-QUIT, ACL for"
This option defines the ACL that is run when an SMTP session
ends without a QUIT command being received.
-See chapter &<<CHAPACL>>& for further details.
+See section &<<SECTNOTQUITACL>>& for further details.
.option acl_smtp_predata main string&!! unset
This option defines the ACL that is run when an SMTP DATA command is
.option acl_smtp_rcpt main string&!! unset
.cindex "RCPT" "ACL for"
This option defines the ACL that is run when an SMTP RCPT command is
-received. See chapter &<<CHAPACL>>& for further details.
+received. See section &<<SECTQUITACL>>& for further details.
.option acl_smtp_starttls main string&!! unset
.cindex "STARTTLS, ACL for"
This option defines the ACL that is run when an SMTP VRFY command is
received. See chapter &<<CHAPACL>>& for further details.
+.option acl_smtp_wellknown main string&!! unset
+.cindex "WELLKNOWN, ACL for"
+This option defines the ACL that is run when an SMTP WELLKNOWN command is
+received. See section &<<SECTWELLKNOWNACL>>& for further details.
+
.option add_environment main "string list" empty
.cindex "environment" "set values"
This option adds individual environment variables that the
See section &<<SECDKIMVFY>>&.
-.option dmarc_forensic_sender main string&!! unset &&&
- dmarc_history_file main string unset &&&
- dmarc_tld_file main string unset
+.options dmarc_forensic_sender main string&!! unset &&&
+ dmarc_history_file main string unset &&&
+ dmarc_tld_file main string unset
.cindex DMARC "main section options"
These options control DMARC processing.
See section &<<SECDMARC>>& for details.
. Allow this long option name to split; give it unsplit as a fifth argument
. for the automatic .oindex that is generated by .option.
+. WAS:
+. .option "extract_addresses_remove_ &~&~arguments"
+. but apparently this results in searchability problems; bug 1197
-.option "extract_addresses_remove_arguments" main boolean true &&&
- extract_addresses_remove_arguments
+.option extract_addresses_remove_arguments main boolean true
.oindex "&%-t%&"
.cindex "command line" "addresses with &%-t%&"
.cindex "Sendmail compatibility" "&%-t%& option"
.cindex "EHLO" "underscores in"
.cindex "underscore in EHLO/HELO"
This option can be set to a string of rogue characters that are permitted in
-all EHLO and HELO names in addition to the standard letters, digits,
-hyphens, and dots. If you really must allow underscores, you can set
+non-ip-literal EHLO and HELO names in addition to the standard letters, digits,
+hyphens, and dots. For example if you really must allow underscores,
+you can set
.code
helo_allow_chars = _
.endd
+This option does not apply to names that look like ip-literals.
Note that the value is one string, not a list.
-.new
.option limits_advertise_hosts main "host list&!!" *
.cindex LIMITS "suppressing advertising"
.cindex "ESMTP extensions" LIMITS
This option can be used to suppress the advertisement of the SMTP
LIMITS extension (RFC 9422) to specific hosts.
-If permitted, Exim as a servier will advertise in the EHLO response
+If permitted, Exim as a server will advertise in the EHLO response
the limit for RCPT commands set by the &%recipients_max%& option (if it is set)
and the limit for MAIL commands set by the &%smtp_accept_max_per_connection%&
option.
-,wen
.option local_from_check main boolean true
.cindex "&'Sender:'& header line" "disabling addition of"
The SMTP service extension keyword advertised is &"PIPECONNECT"&;
it permits the client to pipeline
-TCP connection and hello command (inclear phase),
+TCP connection and hello command (cleatext phase),
or TLS-establishment and hello command (encrypted phase),
on later connections to the same host.
Non-SMTP messages with too many recipients are failed, and no deliveries are
done.
-.new
For SMTP message the expansion is done after the connection is
accepted (but before any SMTP conversation) and may depend on
the IP addresses and port numbers of the connection.
&*Note*&: If an expansion is used for the option,
care should be taken that a resonable value results for
non-SMTP messages.
-.wen
.cindex "RCPT" "maximum number of incoming"
&*Note*&: The RFCs specify that an SMTP server should accept at least 100
. searchable. NM changed this occurrence for bug 1197 to no longer allow
. the option name to split.
-.option "smtp_accept_max_per_connection" main integer&!! 1000 &&&
- smtp_accept_max_per_connection
+.option smtp_accept_max_per_connection main integer&!! 1000
.cindex "SMTP" "limiting incoming message count"
.cindex "limit" "messages per SMTP connection"
The value of this option limits the number of MAIL commands that Exim is
. See the comment on smtp_accept_max_per_connection
-.option "smtp_accept_queue_per_connection" main integer 10 &&&
- smtp_accept_queue_per_connection
+.option smtp_accept_queue_per_connection main integer 10
.cindex "queueing incoming messages"
.cindex "message" "queueing by message count"
This option limits the number of delivery processes that Exim starts
See also &%bounce_message_file%&.
+.option wellknown_advertise_hosts main boolean unset
+.cindex WELLKNOWN advertisement
+.cindex "ESMTP extensions" WELLKNOWN
+This option enables the advertising of the SMTP WELLKNOWN extension.
+See also the &%acl_smtp_wellknown%& ACL (&<<SECTWELLKNOWNACL>>&).
+
.option write_rejectlog main boolean true
.cindex "reject log" "disabling"
If this option is set false, Exim no longer writes anything to the reject log.
and are rewritten according to the global rewriting rules.
+.option sieve_inbox redirect string&!! inbox
+.new
+The value of this option is passed to a Sieve filter to specify the
+name of the mailbox used for "keep" operations (explicit or implicit).
+.wen
+
.option sieve_subaddress redirect string&!! unset
The value of this option is passed to a Sieve filter to specify the
:subaddress part of an address.
.endd
In this situation, the expansion of &%file%& or &%directory%& in the transport
must transform the relative path into an appropriate absolute filename. In the
-case of Sieve filters, the name &'inbox'& must be handled. It is the name that
+case of Sieve filters, the name &'inbox'& must be handled. It is the
+.new
+default
+.wen
+name that
is used as a result of a &"keep"& action in the filter. This example shows one
way of handling this requirement:
.code
location, absolute paths are used without change, and other folders are in the
&_mail_& directory within the home directory.
+.new
+An alternative for the &"keep"& aspect is to use the &%sieve_inbox%& option
+on the redirect router that calls the Sieve filter,
+to explicitly set the filename used.
+.wen
+
&*Note 1*&: While processing an Exim filter, a relative path such as
&_folder23_& is turned into an absolute path if a home directory is known to
the router. In particular, this is the case if &%check_local_user%& is set. If
&*Note 2*&: An absolute path in &$address_file$& is not treated specially;
the &%file%& or &%directory%& option is still used if it is set.
+.new
+&*Note 3*&: Permitting a user to enable writes to an absolute path
+may be a security issue.
+.wen
.cindex "transports" "&(lmtp)&"
.cindex "&(lmtp)& transport"
.cindex "LMTP" "over a pipe"
-.cindex "LMTP" "over a socket"
+.cindex "LMTP" "over a unix-domain socket"
The &(lmtp)& transport runs the LMTP protocol (RFC 2033) over a pipe to a
specified command
or by interacting with a Unix domain socket.
For testing purposes, this value can be overridden by the &%-oB%& command line
option.
-.new
.cindex "ESMTP extensions" LIMITS
If the peer advertises a LIMITS extension with a MAILMAX value,
and either TLSS is in use or was not advertised,
that value also constrains the result of this option.
-.wen
.option dane_require_tls_ciphers smtp string&!! unset
During the expansion of this option the &$item$& variable will have the
server's EHLO response.
-.new
For TLS-on-connect connections we do not have an EHLO
response to use. Because of this the default value of this option is
set to a static string for those cases, meaning that resumption will
always be attempted if permitted by the &%tls_resumption_hosts%& option.
-.wen
The result of the option expansion is included in the key used to store and
retrieve the TLS session, for session resumption.
so can cause parallel connections to the same host if &%remote_max_parallel%&
permits this.
-.new
.cindex "ESMTP extensions" LIMITS
If the peer advertises a LIMITS extension with a RCPTMAX value,
and either TLSS is in use or was not advertised,
that value also constrains the result of this option
and no parallel connections will be caused on meeting the RCPTMAX limit.
-.wen
.option message_linelength_limit smtp integer 998
only messages having the domain used for the DANE TLSA lookup are
sent on the connection.
-.new
.cindex "ESMTP extensions" LIMITS
If the peer advertises a LIMITS extension with a RCPTDOMAINMAX value,
and either TLSS is in use or was not advertised,
this option is regarded as being false.
-.wen
.option port smtp string&!! "see below"
deliveries into closed message stores. Exim also has support for running LMTP
over a pipe to a local process &-- see chapter &<<CHAPLMTP>>&.
+&*Note*&: When using LMTP it should be considered whether the default values
+for some other features, such as DANE, are appropriate.
+
If this option is set to &"smtps"&, the default value for the &%port%& option
changes to &"smtps"&, and the transport initiates TLS immediately after
connecting, as an outbound SSL-on-connect, instead of using STARTTLS to upgrade.
Password Authentication'& mechanism,
which is also sometimes known as NTLM (NT LanMan). The code for client side of
this authenticator was contributed by Marc Prud'hommeaux, and much of it is
-taken from the Samba project (&url(https://www.samba.org/)). The code for the
+taken from the &url(https://www.samba.org/,Samba project). The code for the
server side was subsequently contributed by Tom Kistner. The mechanism works as
follows:
.cindex "Certificate-based authentication"
The &(external)& authenticator provides support for
authentication based on non-SMTP information.
-The specification is in RFC 4422 Appendix A
-(&url(https://tools.ietf.org/html/rfc4422)).
+The specification is in
+&url(https://tools.ietf.org/html/rfc4422,PFC 4422) Appendix A.
It is only a transport and negotiation mechanism;
the process of authentication is entirely controlled
by the server configuration.
this authentication method on a secure (eg. under TLS) connection.
One possible use, compatible with the
-K-9 Mail Android client (&url(https://k9mail.github.io/)),
+&url(https://k9mail.github.io/,K-9 Mail Android client)
is for using X509 client certificates.
It thus overlaps in function with the TLS authenticator
.subsection General
Under GnuTLS, DANE is only supported from version 3.0.0 onwards.
-DANE is specified in published RFCs and decouples certificate authority trust
+DANE is specified in RFC 6698. It decouples certificate authority trust
selection from a "race to the bottom" of "you must trust everything for mail
to get through".
-There is an alternative technology called MTA-STS, which
-instead publishes MX trust anchor information on an HTTPS website. At the
-time this text was last updated, MTA-STS was still a draft, not yet an RFC.
+It does retain the need to trust the assurances provided by the DNSSEC tree.
+
+There is an alternative technology called MTA-STS (RFC 8461), which
+instead publishes MX trust anchor information on an HTTPS website.
+The discovery of the address for that website does not (per standard)
+require DNSSEC, and could be regarded as being less secure than DANE
+as a result.
+
Exim has no support for MTA-STS as a client, but Exim mail server operators
can choose to publish information describing their TLS configuration using
MTA-STS to let those clients who do use that protocol derive trust
.cindex "RCPT" "ACL for"
.cindex "STARTTLS, ACL for"
.cindex "VRFY" "ACL for"
+.cindex "WELLKNOWN" "ACL for"
.cindex "SMTP" "connection, ACL for"
.cindex "non-SMTP messages" "ACLs for"
.cindex "MIME content scanning" "ACL for"
.irow &%acl_smtp_rcpt%& "ACL for RCPT"
.irow &%acl_smtp_starttls%& "ACL for STARTTLS"
.irow &%acl_smtp_vrfy%& "ACL for VRFY"
+.irow &%acl_smtp_wellknown%& "ACL for WELLKNOWN"
.endtable
For example, if you set
testing as possible at RCPT time.
-.subsection "The non-SMTP ACLs" SECID190
+.subsection "The non-SMTP ACLs" SECnonSMTP
.cindex "non-SMTP messages" "ACLs for"
The non-SMTP ACLs apply to all non-interactive incoming messages, that is, they
apply to batched SMTP as well as to non-SMTP messages. (Batched SMTP is not
temporary error for these kinds of message.
-.subsection "The SMTP connect ACL" SECID191
+.subsection "The SMTP connect ACL" SECconnectACL
.cindex "SMTP" "connection, ACL for"
.oindex &%smtp_banner%&
The ACL test specified by &%acl_smtp_connect%& happens at the start of an SMTP
any TLS startup attempt and without any SMTP response being transmitted.
-.subsection "The EHLO/HELO ACL" SECID192
+.subsection "The EHLO/HELO ACL" SECheloACL
.cindex "EHLO" "ACL for"
.cindex "HELO" "ACL for"
The ACL test specified by &%acl_smtp_helo%& happens when the client issues an
an EHLO response.
-.subsection "The DATA ACLs" SECID193
+.subsection "The DATA ACLs" SECdataACLS
.cindex "DATA" "ACLs for"
Two ACLs are associated with the DATA command, because it is two-stage
command, with two responses being sent to the client.
If the ACL is not defined, processing completes as if
the feature was not requested by the client.
+.subsection "The SMTP WELLKNOWN ACL" SECTWELLKNOWNACL
+.cindex "WELLKNOWN" "ACL for"
+.oindex "&%acl_smtp_wellknown%&"
+The &%acl_smtp_wellknown%& ACL is available only when Exim is compiled
+with WELLKNOWN support enabled.
+
+The ACL determines the response to an SMTP WELLKNOWN command, using the normal
+accept/defer/deny verbs for the response code,
+and a new &"control=wellknown"& modifier.
+This modifier takes a single option, separated by a '/'
+character, which must be the name of a file containing the response
+cleartext. The modifier is expanded before use in the usual way before
+it is used. The configuration is responsible for picking a suitable file
+to return and, most importantly, not returning any unexpected file.
+The argument for the SMTP verb will be available in the &$smtp_command_argument$&
+variable and can be used for building the file path.
+If the file path given in the modifier is empty or inacessible, the control will
+fail.
+
+For example:
+.code
+ check_wellknown:
+ accept control = wellknown/\
+ ${lookup {${xtextd:$smtp_command_argument}} \
+ dsearch,key=path,filter=file,ret=full \
+ {$spooldir/wellknown.d}}
+.endd
+File content will be encoded in &"xtext"& form, and line-wrapping
+for line-length limitation will be done before transmission.
+A response summary line will be prepended, with the (pre-encoding) file size.
+
+The above example uses the expansion operator ${xtextd:<coded-string>}
+which is needed to decode the xtext-encoded key from the SMTP verb.
+
+Under the util directory there is a "mailtest" utility which can be used
+to test/retrieve WELLKNOWN items. Syntax is
+.code
+ mailtest -h host.example.com -w security.txt
+.endd
+
+WELLKNOWN is a ESMTP extension providing access to extended
+information about the server. It is modelled on the webserver
+facilities documented in RFC 8615 and can be used for a security.txt
+file and could be used for ACME handshaking (RFC 8555).
+
+Exim will advertise WELLKNOWN support in the EHLO response
+.oindex &%wellknown_advertise_hosts%&
+(conditional on a new option &%wellknown_advertise_hosts%&)
+and service WELLKNOWN smtp verbs having a single parameter
+giving a key for an item of "site-wide metadata".
+The verb and key are separated by whitespace,
+and the key is xtext-encoded (per RFC 3461 section 4).
+
+
.subsection "The QUIT ACL" SECTQUITACL
.cindex "QUIT, ACL for"
The ACL for the SMTP QUIT command is anomalous, in that the outcome of the ACL
&%acl_smtp_mime%&, &%acl_smtp_predata%&, and &%acl_smtp_starttls%&, the action
when the ACL is not defined is &"accept"&.
-For the others (&%acl_smtp_etrn%&, &%acl_smtp_expn%&, &%acl_smtp_rcpt%&, and
-&%acl_smtp_vrfy%&), the action when the ACL is not defined is &"deny"&.
-This means that &%acl_smtp_rcpt%& must be defined in order to receive any
-messages over an SMTP connection. For an example, see the ACL in the default
-configuration file.
-
+For the others (&%acl_smtp_etrn%&, &%acl_smtp_expn%&, &%acl_smtp_rcpt%&,
+&%acl_smtp_vrfy%&
+and &%acl_smtp_wellknown%&),
+the action when the ACL
+is not defined is &"deny"&. This means that &%acl_smtp_rcpt%& must be
+defined in order to receive any messages over an SMTP connection.
+For an example, see the ACL in the default configuration file.
.section "Format of an ACL" "SECID199"
.cindex "&ACL;" "format of"
.cindex "&ACL;" "verbs, definition of"
-An individual ACL consists of a number of statements. Each statement starts
+An individual ACL definition consists of a number of statements.
+Each statement starts
with a verb, optionally followed by a number of conditions and &"modifiers"&.
Modifiers can change the way the verb operates, define error and log messages,
set variables, insert delays, and vary the processing of accepted messages.
all the conditions make sense at every testing point. For example, you cannot
test a sender address in the ACL that is run for a VRFY command.
+The definition of an ACL ends where another starts,
+or a different configuration section starts.
+
.section "ACL verbs" "SECID200"
The ACL verbs are as follows:
the operation and configuration of DKIM, see section &<<SECDKIM>>&.
-.vitem &*control&~=&~dmarc_disable_verify*&
+.vitem &*control&~=&~dmarc_disable_verify*& &&&
+ &*control&~=&~dmarc_enable_forensic*&
.cindex "disable DMARC verify"
-.cindex "DMARC" "disable verify"
-This control turns off DMARC verification processing entirely. For details on
+.cindex DMARC "disable verify"
+.cindex DMARC controls
+.cindex DMARC "forensic mails"
+These control affect DMARC processing. For details on
the operation and configuration of DMARC, see section &<<SECDMARC>>&.
+The &"disable"& turns off DMARC verification processing entirely.
+
.vitem &*control&~=&~dscp/*&<&'value'&>
.cindex "&ACL;" "setting DSCP value"
This control enables conversion of UTF-8 in message envelope addresses
to a-label form.
For details see section &<<SECTi18nMTA>>&.
+
+.vitem &*control&~=&~wellknown*&
+This control sets up a response data file for a WELLKNOWN SMTP command.
+It may only be used in an ACL servicing that command.
+For details see section &<<SECTWELLKNOWNACL>>&.
.endlist vlist
filename, and the default path is then used.
.endlist
The &%decode%& condition normally succeeds. It is only false for syntax
-errors or unusual circumstances such as memory shortages. You can easily decode
-a file with its original, proposed filename using
-.code
-decode = $mime_filename
-.endd
-However, you should keep in mind that &$mime_filename$& might contain
-anything. If you place files outside of the default path, they are not
+errors or unusual circumstances such as memory shortages.
+The variable &$mime_filename$& will have the suggested name for the file.
+Note however that this might contain anything, and is very difficult
+to safely use as all or even part of the filename.
+If you place files outside of the default path, they are not
automatically unlinked.
For RFC822 attachments (these are messages attached to messages, with a
.vitem &*void&~debug_printf(char&~*,&~...)*&
-This is Exim's debugging function, with arguments as for &'(printf()'&. The
+This is Exim's debugging function, with arguments as for &'printf()'&. The
output is written to the standard error stream. If no debugging is selected,
calls to &'debug_printf()'& have no effect. Normally, you should make calls
conditional on the &`local_scan`& debug selector by coding like this:
.cindex "SMTP" "batching over TCP/IP"
When a message is successfully delivered over a TCP/IP SMTP connection, Exim
looks in the hints database for the transport to see if there are any queued
-messages waiting for the host to which it is connected. If it finds one, it
-creates a new Exim process using the &%-MC%& option (which can only be used by
-a process running as root or the Exim user) and passes the TCP/IP socket to it
-so that it can deliver another message using the same socket. The new process
-does only those deliveries that are routed to the connected host, and may in
-turn pass the socket on to a third process, and so on.
+messages waiting for the host to which it is connected.
+If it finds one, it arranges to attempt that message on the same connection.
The &%connection_max_messages%& option of the &(smtp)& transport can be used to
limit the number of messages sent down a single TCP/IP connection.
.subsection "The ETRN command" SECTETRN
.cindex "ETRN" "processing"
.cindex "ESMTP extensions" ETRN
+Most modern installations never need to use this.
+It is used for managing messages queued for an intermittently-connecting
+destination (eg. one using a dialup connection).
+
+.oindex "&%acl_smtp_etrn%&"
+The command is only available if permitted by an ACL
+specfied by the main-section &%acl_smtp_etrn%& option.
+
RFC 1985 describes an ESMTP command called ETRN that is designed to
overcome the security problems of the TURN command (which has fallen into
disuse). When Exim receives an ETRN command on a TCP/IP connection, it runs
only way to log such cases is to interpose a script such as &_util/logargs.sh_&
between the caller and Exim.
.next
-.cindex "log" "connection identifier"
-&%connection_identifier%&: An identifier for the accepted connection is added to
+.cindex log "connection identifier"
+.cindex connection "identifier logging"
+&%connection_id%&: An identifier for the accepted connection is added to
connection start and end lines and to message accept lines.
The identifier is tagged by Ci=.
The value is PID-based, so will reset on reboot and will wrap.
.next
-.cindex "log" "connection rejections"
+.cindex log "connection rejections"
+.cindex connection "rejection logging"
&%connection_reject%&: A log entry is written whenever an incoming SMTP
connection is rejected, for whatever reason.
.next
-.cindex "log" "delayed delivery"
+.cindex log "delayed delivery"
.cindex "delayed delivery, logging"
&%delay_delivery%&: A log entry is written whenever a delivery process is not
started for an incoming message because the load is too high or too many
.cindex log "DKIM verification"
.cindex DKIM "verification logging"
&%dkim_verbose%&: A log entry is written for each attempted DKIM verification.
-.new
Also, on message delivery lines signing information (domain and selector)
is added, tagged with DKIM=.
-.wen
.next
.cindex "log" "dnslist defer"
.cindex "DNS list" "logging defer"
The &'misc'& database is used for
.ilist
-Serializing ETRN runs (when &%smtp_etrn_serialize%& is set)
-.next
Serializing delivery to a specific host (when &%serialize_hosts%& is set in an
&(smtp)& transport)
.next
in a transport)
.next
Recording EHLO-time facilities advertised by hosts
+.next
+Serializing ETRN runs (when &%smtp_etrn_serialize%& is set)
.endlist
-.section "exim_dumpdb" "SECTdumpdb"
+.subsection "exim_dumpdb" "SECTdumpdb"
.cindex "&'exim_dumpdb'&"
The entire contents of a database are written to the standard output by the
&'exim_dumpdb'& program,
-.section "exim_tidydb" "SECTtidydb"
+.subsection "exim_tidydb" "SECTtidydb"
.cindex "&'exim_tidydb'&"
The &'exim_tidydb'& utility program is used to tidy up the contents of a hints
database. If run with no options, it removes all records that are more than 30
-.section "exim_fixdb" "SECTfixdb"
+.subsection "exim_fixdb" "SECTfixdb"
.cindex "&'exim_fixdb'&"
The &'exim_fixdb'& program is a utility for interactively modifying databases.
Its main use is for testing Exim, but it might also be occasionally useful for
.next
A queue runner process retains root privilege throughout its execution. Its
job is to fork a controlled sequence of delivery processes.
+
.next
-A delivery process retains root privilege throughout most of its execution,
-but any actual deliveries (that is, the transports themselves) are run in
-subprocesses which always change to a non-root uid and gid. For local
-deliveries this is typically the uid and gid of the owner of the mailbox; for
-remote deliveries, the Exim uid and gid are used. Once all the delivery
+A delivery process retains root privilege throughout most of its execution.,
+including while the recipient addresses in a message are being routed.
+
+.ilist
+However, if a user's filter file has to be processed,
+this is done in a subprocess that runs under the individual user's uid and
+gid. A system filter is run as root unless &%system_filter_user%& is set.
+.endlist
+
+Any actual deliveries (that is, the transports themselves) are run in
+subprocesses which always change to a non-root uid and gid.
+.ilist
+For local
+deliveries this is typically the uid and gid of the owner of the mailbox.
+.next
+For remote deliveries, the Exim uid and gid are used.
+.endlist
+
+Once all the delivery
subprocesses have been run, a delivery process changes to the Exim uid and gid
while doing post-delivery tidying up such as updating the retry database and
generating bounce and warning messages.
-While the recipient addresses in a message are being routed, the delivery
-process runs as root. However, if a user's filter file has to be processed,
-this is done in a subprocess that runs under the individual user's uid and
-gid. A system filter is run as root unless &%system_filter_user%& is set.
.next
A process that is testing addresses (the &%-bt%& option) runs as root so that
the routing is done in the same environment as a message delivery.
Signing outgoing messages: This function is implemented in the SMTP transport.
It can co-exist with all other Exim features
(including transport filters) except cutthrough delivery.
-.new
However, signing options may not depend on headers modified by
routers, the transport or a transport filter.
-.wen
.next
Verifying signatures in incoming messages: This is implemented by an additional
ACL (acl_smtp_dkim), which can be called several times per message, with
openssl genrsa -out dkim_rsa.private 2048
openssl rsa -in dkim_rsa.private -out /dev/stdout -pubout -outform PEM
.endd
-The result file from the first command should be retained, and
-this option set to use it.
+The result file from the first command should be retained,
+permissions set so that Exim can read it,
+and this option set to use it.
Take the base-64 lines from the output of the second command, concatenated,
for the DNS TXT record.
See section 3.6 of RFC6376 for the record specification.
.option dkim_timestamps smtp integer&!! unset
This option controls the inclusion of timestamp information in the signature.
If not set, no such information will be included.
-.new
Otherwise, must be an unsigned number giving an offset in seconds from the
current time for the expiry tag (e.g. 1209600 for two weeks); both creation
(t=) and expiry (x=) tags will be included unless the offset is 0 (no expiry).
-.wen
RFC 6376 lists these tags as RECOMMENDED.
ACL condition that checks a colon-separated list of possible DKIM verification
results against the actual result of verification,
given by &$dkim_verify_status$& if that is non-empty or "none" if empty.
-.new
This condition may be used in DKIM, MIME, PRDR and DATA ACLs.
-.wen
A basic verification might be:
.code
for more information of what they mean.
The condition is true if the status
-.new
(or any of the list of status values)
-.wen
is any one of the supplied list.
.endlist
SPF verification support is built into Exim if SUPPORT_SPF=yes is set in
&_Local/Makefile_&. The support uses the &_libspf2_& library
&url(https://www.libspf2.org/).
+.new
+.cindex "dynamic modules"
+The support can be built as a dynamic-load module if desired;
+see the comments in that Makefile.
+.wen
+
There is no Exim involvement in the transmission of messages;
publishing certain DNS records is all that is required.
allow_fail
data = :fail: Invalid SRS recipient address
- #... further routers here
+ #... further routers here get inbound_srs-redirected recipients
+ # and any that were not SRS'd
# transport; should look like the non-forward outbound
DMARC combines feedback from SPF, DKIM, and header From: in order
to attempt to provide better indicators of the authenticity of an
email. This document does not explain the fundamentals; you
-should read and understand how it works by visiting the website at
-&url(http://www.dmarc.org/).
+should read and understand how it works by visiting the
+&url(http://www.dmarc.org/,DMARC website).
If Exim is built with DMARC support,
the libopendmarc library is used.
For building Exim yourself, obtain the library from
-&url(http://sourceforge.net/projects/opendmarc/)
+&url(http://sourceforge.net/projects/opendmarc/,sourceforge)
to obtain a copy, or find it in your favorite package
repository. You will need to attend to the local/Makefile feature
SUPPORT_DMARC and the associated LDFLAGS addition.
The name is placed in the variable &$event_name$& and the event action
expansion must check this, as it will be called for every possible event type.
+.new
The current list of events is:
.itable all 0 0 4 25* left 10* center 15* center 50* left
.row auth:fail after both "per driver per authentication attempt"
.row dane:fail after transport "per connection"
+.row dns:fail after both "per lookup"
.row msg:complete after main "per message"
.row msg:defer after transport "per message per delivery try"
.row msg:delivery after transport "per recipient"
.row tls:fail:connect after main "per connection"
.row smtp:connect after transport "per connection"
.row smtp:ehlo after transport "per connection"
+.row smtp:fail:protocol after main "per connection"
+.row smtp:fail:syntax after main "per connection"
.endtable
+.wen
New event types may be added in future.
The event name is a colon-separated list, defining the type of
An additional variable, &$event_data$&, is filled with information varying
with the event type:
+.new
.itable all 0 0 2 20* left 80* left
.row auth:fail "smtp response"
.row dane:fail "failure reason"
+.row dns:fail "failure reason, key and lookup-type"
.row msg:defer "error string"
.row msg:delivery "smtp confirmation message"
.row msg:fail:internal "failure reason"
.row tls:fail:connect "error string"
.row smtp:connect "smtp banner"
.row smtp:ehlo "smtp ehlo response"
+.row smtp:fail:protocol "error string"
+.row smtp:fail:syntax "error string"
.endtable
+.wen
The :defer events populate one extra variable: &$event_defer_errno$&.
For OpenSSL it will trigger for every chain element including those
loaded locally.
+For dns:fail events from dnsdb lookups, a &"defer_never"& option does not
+affect the reporting of DNS_AGAIN.
+
. ////////////////////////////////////////////////////////////////////////////
. ////////////////////////////////////////////////////////////////////////////