X-Git-Url: https://git.exim.org/users/heiko/exim.git/blobdiff_plain/5f17d2f09733cc77355841fbf095a95186cc9fe5..b4d6cfa1dac6ac8175dec02cbb50fc57eb4b3acb:/doc/doc-docbook/spec.xfpt?ds=sidebyside
diff --git a/doc/doc-docbook/spec.xfpt b/doc/doc-docbook/spec.xfpt
index 6d440e938..ab76e873b 100644
--- a/doc/doc-docbook/spec.xfpt
+++ b/doc/doc-docbook/spec.xfpt
@@ -161,6 +161,13 @@
.macro index
.echo "** Don't use .index; use .cindex or .oindex or .vindex"
.endmacro
+
+
+. use this for a concept-index entry for a header line
+.macro chindex
+.cindex "&'$1'& header line"
+.cindex "header lines" $1
+.endmacro
. ////////////////////////////////////////////////////////////////////////////
@@ -193,6 +200,8 @@
. This chunk of literal XML implements index entries of the form "x, see y" and
. "x, see also y". However, the DocBook DTD doesn't allow entries
. at the top level, so we have to put the .chapter directive first.
+
+. These do not turn up in the HTML output, unfortunately. The PDF does get them.
. /////////////////////////////////////////////////////////////////////////////
.chapter "Introduction" "CHID1"
@@ -318,6 +327,10 @@
zero, binary
binary zero
+
+ headers
+ header lines
+
.literal off
@@ -1394,9 +1407,22 @@ Again, cutthrough delivery counts as a verification.
.next
Individual routers can be explicitly skipped when running the routers to
check an address given in the SMTP EXPN command (see the &%expn%& option).
+
.next
If the &%domains%& option is set, the domain of the address must be in the set
of domains that it defines.
+.new
+.cindex "tainted data" "de-tainting"
+A match verifies the variable &$domain$& (which carries tainted data)
+and assigns an untainted value to the &$domain_data$& variable.
+Such an untainted value is often needed in the transport.
+For specifics of the matching operation and the resulting untainted value,
+refer to section &<>&.
+
+When an untainted value is wanted, use this option
+rather than the generic &%condition%& option.
+.wen
+
.next
.vindex "&$local_part_prefix$&"
.vindex "&$local_part_prefix_v$&"
@@ -1405,13 +1431,26 @@ of domains that it defines.
.vindex "&$local_part_suffix_v$&"
.cindex affix "router precondition"
If the &%local_parts%& option is set, the local part of the address must be in
-the set of local parts that it defines. If &%local_part_prefix%& or
+the set of local parts that it defines.
+.new
+A match verifies the variable &$local_part$& (which carries tainted data)
+and assigns an untainted value to the &$local_part_data$& variable.
+Such an untainted value is often needed in the transport.
+For specifics of the matching operation and the resulting untainted value,
+refer to section &<>&.
+
+When an untainted value is wanted, use this option
+rather than the generic &%condition%& option.
+.wen
+
+If &%local_part_prefix%& or
&%local_part_suffix%& is in use, the prefix or suffix is removed from the local
part before this check. If you want to do precondition tests on local parts
that include affixes, you can do so by using a &%condition%& option (see below)
that uses the variables &$local_part$&, &$local_part_prefix$&,
&$local_part_prefix_v$&, &$local_part_suffix$&
and &$local_part_suffix_v$& as necessary.
+
.next
.vindex "&$local_user_uid$&"
.vindex "&$local_user_gid$&"
@@ -1421,23 +1460,37 @@ an account on the local host. If this check succeeds, the uid and gid of the
local user are placed in &$local_user_uid$& and &$local_user_gid$& and the
user's home directory is placed in &$home$&; these values can be used in the
remaining preconditions.
+
.next
If the &%router_home_directory%& option is set, it is expanded at this point,
because it overrides the value of &$home$&. If this expansion were left till
later, the value of &$home$& as set by &%check_local_user%& would be used in
subsequent tests. Having two different values of &$home$& in the same router
could lead to confusion.
+
.next
If the &%senders%& option is set, the envelope sender address must be in the
set of addresses that it defines.
+
.next
If the &%require_files%& option is set, the existence or non-existence of
specified files is tested.
+
.next
.cindex "customizing" "precondition"
If the &%condition%& option is set, it is evaluated and tested. This option
uses an expanded string to allow you to set up your own custom preconditions.
Expanded strings are described in chapter &<>&.
+
+.new
+Note that while using
+this option for address matching technically works,
+it does not set any de-tainted values.
+Such values are often needed, either for router-specific options or
+for transport options.
+Using the &%domains%& and &%local_parts%& options is usually the most
+convenient way to obtain them.
+.wen
.endlist
@@ -2643,10 +2696,8 @@ Exim through the local interface (see the &%-bm%& and &%-f%& options below).
See the &%untrusted_set_sender%& option for a way of permitting non-trusted
users to set envelope senders.
-.cindex "&'From:'& header line"
-.cindex "&'Sender:'& header line"
-.cindex "header lines" "From:"
-.cindex "header lines" "Sender:"
+.chindex From:
+.chindex Sender:
For a trusted user, there is never any check on the contents of the &'From:'&
header line, and a &'Sender:'& line is never added. Furthermore, any existing
&'Sender:'& line in incoming local (non-TCP/IP) messages is not removed.
@@ -3845,7 +3896,9 @@ id, and the remaining ones must be email addresses. However, if the message is
active (in the middle of a delivery attempt), it is not altered. This option
can be used only by an admin user.
-.vitem "&%-MC%&&~<&'transport'&>&~<&'hostname'&>&~<&'sequence&~number'&>&&&
+.vitem "&%-MC%&&~<&'transport'&>&~<&'hostname'&>&&&
+ &~<&'host&~IP'&>&&&
+ &~<&'sequence&~number'&>&&&
&~<&'message&~id'&>"
.oindex "&%-MC%&"
.cindex "SMTP" "passed connection"
@@ -3922,6 +3975,18 @@ This option is not intended for use by external callers. It is used internally
by Exim in conjunction with the &%-MC%& option, and passes on the fact that the
host to which Exim is connected supports TLS encryption.
+.new
+.vitem &%-MCr%&&~<&'SNI'&> &&&
+ &%-MCs%&&~<&'SNI'&>
+.oindex "&%-MCs%&"
+.oindex "&%-MCr%&"
+These options are not intended for use by external callers. It is used internally
+by Exim in conjunction with the &%-MCt%& option, and passes on the fact that
+a TLS Server Name Indication was sent as part of the channel establishment.
+The argument gives the SNI string.
+The "r" variant indicates a DANE-verified connection.
+.wen
+
.vitem &%-MCt%&&~<&'IP&~address'&>&~<&'port'&>&~<&'cipher'&>
.oindex "&%-MCt%&"
This option is not intended for use by external callers. It is used internally
@@ -4441,6 +4506,27 @@ of the syntax, and how it interacts with configuration file options, are given
in chapter &<>&. When &%-oX%& is used to start a daemon, no pid
file is written unless &%-oP%& is also present to specify a pid filename.
+.new
+.vitem &%-oY%&
+.oindex &%-oY%&
+.cindex "daemon notifier socket"
+This option controls the creation of an inter-process communications endpoint
+by the Exim daemon.
+It is only relevant when the &%-bd%& (start listening daemon) option is also
+given.
+Normally the daemon creates this socket, unless a &%-oX%& and &*no*& &%-oP%&
+option is also present.
+If this option is given then the socket will not be created. This could be
+required if the system is running multiple daemons.
+
+The socket is currently used for
+.ilist
+fast ramp-up of queue runner processes
+.next
+obtaining a current queue size
+.endlist
+.wen
+
.vitem &%-pd%&
.oindex "&%-pd%&"
.cindex "Perl" "starting the interpreter"
@@ -4709,9 +4795,9 @@ recognized when Exim is run normally. It allows for the setting up of explicit
.vitem &%-t%&
.oindex "&%-t%&"
.cindex "recipient" "extracting from header lines"
-.cindex "&'Bcc:'& header line"
-.cindex "&'Cc:'& header line"
-.cindex "&'To:'& header line"
+.chindex Bcc:
+.chindex Cc:
+.chindex To:
When Exim is receiving a locally-generated, non-SMTP message on its standard
input, the &%-t%& option causes the recipients of the message to be obtained
from the &'To:'&, &'Cc:'&, and &'Bcc:'& header lines in the message instead of
@@ -6671,11 +6757,11 @@ causes a second lookup to occur.
The lookup type may optionally be followed by a comma
and a comma-separated list of options.
Each option is a &"name=value"& pair.
-Whether an option is meaningful depands on the lookup type.
+Whether an option is meaningful depends on the lookup type.
All lookups support the option &"cache=no_rd"&.
If this is given then the cache that Exim manages for lookup results
-is not checked before diong the lookup.
+is not checked before doing the lookup.
The result of the lookup is still written to the cache.
.wen
@@ -8395,7 +8481,10 @@ will store a result in the &$host_data$& variable.
A &%local_parts%& router option or &%local_parts%& ACL condition
will store a result in the &$local_part_data$& variable.
.vitem domains
+.new
A &%domains%& router option or &%domains%& ACL condition
+will store a result in the &$domain_data$& variable
+.wen
.vitem senders
A &%senders%& router option or &%senders%& ACL condition
will store a result in the &$sender_data$& variable.
@@ -9430,6 +9519,9 @@ become case-sensitive after &"+caseful"& has been seen.
.section "Local part lists" "SECTlocparlis"
.cindex "list" "local part list"
.cindex "local part" "list"
+These behave in the same way as domain and host lists, with the following
+changes:
+
Case-sensitivity in local part lists is handled in the same way as for address
lists, as just described. The &"+caseful"& item can be used if required. In a
setting of the &%local_parts%& option in a router with &%caseful_local_part%&
@@ -9477,7 +9569,9 @@ reasons,
.cindex "tainted data" definition
.cindex expansion "tainted data"
and expansion of data deriving from the sender (&"tainted data"&)
-is not permitted.
+.new
+is not permitted (including acessing a file using a tainted name).
+.wen
.new
Common ways of obtaining untainted equivalents of variables with
@@ -9635,7 +9729,7 @@ If the ACL returns defer the result is a forced-fail. Otherwise the expansion f
.vitem "&*${authresults{*&<&'authserv-id'&>&*}}*&"
.cindex authentication "results header"
-.cindex headers "authentication-results:"
+.chindex Authentication-Results:
.cindex authentication "expansion item"
This item returns a string suitable for insertion as an
&'Authentication-Results:'&
@@ -10066,7 +10160,7 @@ newline at the very end. For the &%header%& and &%bheader%& expansion, for
those headers that contain lists of addresses, a comma is also inserted at the
junctions between headers. This does not happen for the &%rheader%& expansion.
-.cindex "tainted data"
+.cindex "tainted data" "message headers"
When the headers are from an incoming message,
the result of expanding any of these variables is tainted.
@@ -11635,6 +11729,11 @@ condition is true if the named file (or directory) exists. The existence test
is done by calling the &[stat()]& function. The use of the &%exists%& test in
users' filter files may be locked out by the system administrator.
+.new
+&*Note:*& Testing a path using this condition is not a sufficient way of
+de-tainting it.
+.wen
+
.vitem &*first_delivery*&
.cindex "delivery" "first"
.cindex "first delivery"
@@ -13111,6 +13210,8 @@ The name of the spool queue in use; empty for the default queue.
.cindex "spool" "number of messages"
This variable contains the number of messages queued.
It is evaluated on demand, but no more often than once every minute.
+If there is no daemon notifier socket open, the value will be
+an empty string.
.vitem &$r_...$&
.vindex &$r_...$&
@@ -13615,7 +13716,11 @@ filter file to set values that can be tested in users' filter files. For
example, a system filter could set a value indicating how likely it is that a
message is junk mail.
-.vitem &$spam_$&&'xxx'&
+.vitem &$spam_score$& &&&
+ &$spam_score_int$& &&&
+ &$spam_bar$& &&&
+ &$spam_report$& &&&
+ &$spam_action$&
A number of variables whose names start with &$spam$& are available when Exim
is compiled with the content-scanning extension. For details, see section
&<>&.
@@ -14005,6 +14110,10 @@ taint mode of the Perl interpreter. You are encouraged to set this
option to a true value. To avoid breaking existing installations, it
defaults to false.
+.new
+&*Note*&: This is entirely separate from Exim's tainted-data tracking.
+.wen
+
.section "Calling Perl subroutines" "SECID86"
When the configuration file includes a &%perl_startup%& option you can make use
@@ -14637,6 +14746,7 @@ listed in more than one group.
.row &%local_scan_timeout%& "timeout for &[local_scan()]&"
.row &%message_size_limit%& "for all messages"
.row &%percent_hack_domains%& "recognize %-hack for these domains"
+.row &%proxy_protocol_timeout%& "timeout for proxy protocol negotiation"
.row &%spamd_address%& "set interface to SpamAssassin"
.row &%strict_acl_vars%& "object to unset ACL variables"
.row &%spf_smtp_comment_template%& "template for &$spf_smtp_comment$&"
@@ -16687,10 +16797,16 @@ should need to modify the default.
The option is expanded before use.
If the platform supports Linux-style abstract socket names, the result
is used with a nul byte prefixed.
-Otherwise, it should be a full path name and use a directory accessible
+Otherwise,
+.new "if nonempty,"
+it should be a full path name and use a directory accessible
to Exim.
-If the Exim command line uses a &%-oX%& option and does not use &%-oP%&
+.new
+If this option is set as empty,
+or the command line &%-oY%& option is used, or
+.wen
+the command line uses a &%-oX%& option and does not use &%-oP%&,
then a notifier socket is not created.
@@ -16878,7 +16994,7 @@ not count as protocol errors (see &%smtp_max_synprot_errors%&).
.option pipelining_connect_advertise_hosts main "host list&!!" *
.cindex "pipelining" "early connection"
.cindex "pipelining" PIPE_CONNECT
-.cindex "ESMTP extensions" X_PIPE_CONNECT
+.cindex "ESMTP extensions" PIPE_CONNECT
If Exim is built with the SUPPORT_PIPE_CONNECT build option
this option controls which hosts the facility is advertised to
and from which pipeline early-connection (before MAIL) SMTP
@@ -16887,7 +17003,9 @@ When used, the pipelining saves on roundtrip times.
See also the &%hosts_pipe_connect%& smtp transport option.
-Currently the option name &"X_PIPE_CONNECT"& is used.
+.new
+The SMTP service extension keyword advertised is &"PIPE_CONNECT"&.
+.wen
.option prdr_enable main boolean false
@@ -16968,6 +17086,14 @@ admin user unless &%prod_requires_admin%& is set false. See also
&%queue_list_requires_admin%& and &%commandline_checks_require_admin%&.
+.new
+.option proxy_protocol_timeout main time 3s
+.cindex proxy "proxy protocol"
+This option sets the timeout for proxy protocol negotiation.
+For details see section &<>&.
+.wen
+
+
.option qualify_domain main string "see below"
.cindex "domain" "for qualifying addresses"
.cindex "address" "qualification"
@@ -17270,6 +17396,9 @@ manager, there is no way of controlling the total number of simultaneous
deliveries if the configuration allows a delivery attempt as soon as a message
is received.
+See also the &%max_parallel%& generic transport option,
+and the &%serialize_hosts%& smtp transport option.
+
.cindex "number of deliveries"
.cindex "delivery" "maximum number of"
If you want to control the total number of deliveries on the system, you
@@ -18428,7 +18557,9 @@ than the public cert of individual clients. With both OpenSSL and GnuTLS, if
the value is a file then the certificates are sent by Exim as a server to
connecting clients, defining the list of accepted certificate authorities.
Thus the values defined should be considered public data. To avoid this,
-use the explicit directory version.
+use the explicit directory version. (If your peer is Exim up to 4.85,
+using GnuTLS, you may need to send the CAs (thus using the file
+variant). Otherwise the peer doesn't send its certificate.)
See &<>& for discussion of when this option might be re-expanded.
@@ -18747,7 +18878,10 @@ address (with affixes removed if relevant) is the name of an account on the
local system. The check is done by calling the &[getpwnam()]& function rather
than trying to read &_/etc/passwd_& directly. This means that other methods of
holding password data (such as NIS) are supported. If the local part is a local
-user, &$home$& is set from the password data, and can be tested in other
+user,
+.cindex "tainted data" "de-tainting"
+&$local_part_data$& is set to an untainted version of the local part and
+&$home$& is set from the password data. The latter can be tested in other
preconditions that are evaluated after this one (the order of evaluation is
given in section &<>&). However, the value of &$home$& can be
overridden by &%router_home_directory%&. If the local part is not a local user,
@@ -18894,7 +19028,8 @@ This applies to all of the SRV, MX, AAAA, A lookup sequence.
If this option is set, the router is skipped unless the current domain matches
the list. If the match is achieved by means of a file lookup, the data that the
lookup returned for the domain is placed in &$domain_data$& for use in string
-expansions of the driver's private options. See section &<>& for
+expansions of the driver's private options and in the transport.
+See section &<>& for
a list of the order in which preconditions are evaluated.
@@ -19257,12 +19392,13 @@ section &<>& for a discussion of local part lists. Because the
string is expanded, it is possible to make it depend on the domain, for
example:
.code
-local_parts = dbm;/usr/local/specials/$domain
+local_parts = dbm;/usr/local/specials/$domain_data
.endd
.vindex "&$local_part_data$&"
If the match is achieved by a lookup, the data that the lookup returned
for the local part is placed in the variable &$local_part_data$& for use in
-expansions of the router's private options. You might use this option, for
+expansions of the router's private options or in the transport.
+You might use this option, for
example, if you have a large number of local virtual domains, and you want to
send all postmaster mail to the same place without having to set up an alias in
each virtual domain:
@@ -19607,6 +19743,10 @@ Values containing a list-separator should have them doubled.
When a router runs, the strings are evaluated in order,
to create variables which are added to the set associated with
the address.
+.new
+This is done immediately after all the preconditions, before the
+evaluation of the &%address_data%& option.
+.wen
The variable is set with the expansion of the value.
The variables can be used by the router options
(not including any preconditions)
@@ -22454,7 +22594,7 @@ This defaults to the incoming sender address, but can be changed by setting
.option return_path_add transports boolean false
-.cindex "&'Return-path:'& header line"
+.chindex Return-path:
If this option is true, a &'Return-path:'& header is added to the message.
Although the return path is normally available in the prefix line of BSD
mailboxes, this is commonly not displayed by MUAs, and so the user does not
@@ -24982,12 +25122,14 @@ authenticated as a client.
.option command_timeout smtp time 5m
+.cindex timeout "smtp transport command"
This sets a timeout for receiving a response to an SMTP command that has been
sent out. It is also used when waiting for the initial banner line from the
remote host. Its value must not be zero.
.option connect_timeout smtp time 5m
+.cindex timeout "smtp transport connect"
This sets a timeout for the &[connect()]& function, which sets up a TCP/IP call
to a remote host. A setting of zero allows the system timeout (typically
several minutes) to act. To have any effect, the value of this option must be
@@ -25023,6 +25165,7 @@ be treated as unset and &%tls_require_ciphers%& will be used instead.
.option data_timeout smtp time 5m
+.cindex timeout "for transmitted SMTP data blocks"
This sets a timeout for the transmission of each block in the data portion of
the message. As a result, the overall timeout for a message depends on the size
of the message. Its value must not be zero. See also &%final_timeout%&.
@@ -25161,6 +25304,7 @@ fails"& facility.
.option final_timeout smtp time 10m
+.cindex timeout "for transmitted SMTP data accept"
This is the timeout that applies while waiting for the response to the final
line containing just &"."& that terminates a message. Its value must not be
zero.
@@ -25407,9 +25551,12 @@ incoming messages, use an appropriate ACL.
.cindex "authentication" "optional in client"
This option provides a list of servers to which, provided they announce
authentication support, Exim will attempt to authenticate as a client when it
-connects. If authentication fails, Exim will try to transfer the message
-unauthenticated. See also &%hosts_require_auth%&, and chapter
-&<>& for details of authentication.
+connects. If authentication fails
+.new
+and &%hosts_require_auth%& permits,
+.wen
+Exim will try to transfer the message unauthenticated.
+See also chapter &<>& for details of authentication.
.option hosts_try_chunking smtp "host list&!!" *
.cindex CHUNKING "enabling, in client"
@@ -25542,6 +25689,12 @@ It is expanded per-address and can depend on any of
&$address_data$&, &$domain_data$&, &$local_part_data$&,
&$host$&, &$host_address$& and &$host_port$&.
+.new
+If the connection is DANE-enabled then this option is ignored;
+only messages having the domain used for the DANE TLSA lookup are
+sent on the connection.
+.wen
+
.option port smtp string&!! "see below"
.cindex "port" "sending TCP/IP"
.cindex "TCP/IP" "setting outgoing port"
@@ -25724,7 +25877,11 @@ See &<>& for details.
.cindex "TLS" SNI
.cindex SNI "setting in client"
.vindex "&$tls_sni$&"
-If this option is set then it sets the $tls_out_sni variable and causes any
+If this option is set
+.new
+and the connection is not DANE-validated
+.wen
+then it sets the $tls_out_sni variable and causes any
TLS session to pass this value as the Server Name Indication extension to
the remote side, which can be used by the remote side to select an appropriate
certificate and private key for the session.
@@ -27228,7 +27385,7 @@ conditions:
.ilist
The client host must match &%auth_advertise_hosts%& (default *).
.next
-It the &%server_advertise_condition%& option is set, its expansion must not
+If the &%server_advertise_condition%& option is set, its expansion must not
yield the empty string, &"0"&, &"no"&, or &"false"&.
.endlist
@@ -27336,7 +27493,7 @@ encode '\0user@domain.com\0pas$$word'
.endd
gives an incorrect answer because of the unescaped &"@"& and &"$"& characters.
-If you have the &%mimencode%& command installed, another way to do produce
+If you have the &%mimencode%& command installed, another way to produce
base64-encoded strings is to run the command
.code
echo -e -n `\0user\0password' | mimencode
@@ -27678,7 +27835,14 @@ fixed_plain:
client_send = ^username^mysecret
.endd
The lack of colons means that the entire text is sent with the AUTH
-command, with the circumflex characters converted to NULs. A similar example
+command, with the circumflex characters converted to NULs.
+.new
+Note that due to the ambiguity of parsing three consectutive circumflex characters
+there is no way to provide a password having a leading circumflex.
+.wen
+
+
+A similar example
that uses the LOGIN mechanism is:
.code
fixed_login:
@@ -28035,6 +28199,10 @@ supplied by the server.
.option server_channelbinding gsasl boolean false
Do not set this true and rely on the properties
without consulting a cryptographic engineer.
+. Unsure what that's about. It might be the "Triple Handshake"
+. vulnerability; cf. https://www.mitls.org/pages/attacks/3SHAKE
+. If so, we're ok, requiring Extended Master Secret if TLS
+. Session Resumption was used.
Some authentication mechanisms are able to use external context at both ends
of the session to bind the authentication to that context, and fail the
@@ -28730,6 +28898,12 @@ Some other recently added features may only be available in one or the other.
This should be documented with the feature. If the documentation does not
explicitly state that the feature is infeasible in the other TLS
implementation, then patches are welcome.
+.new
+.next
+The output from "exim -bV" will show which (if any) support was included
+in the build.
+Also, the macro "_HAVE_OPENSSL" or "_HAVE_GNUTLS" will be defined.
+.wen
.endlist
@@ -29203,6 +29377,61 @@ There is no current way to staple a proof for a client certificate.
.endd
+.new
+.section "Caching of static server configuration items" "SECTserverTLScache"
+.cindex certificate caching
+.cindex privatekey caching
+.cindex crl caching
+.cindex ocsp caching
+.cindex ciphers caching
+.cindex "CA bundle" caching
+.cindex "certificate authorities" caching
+.cindex tls_certificate caching
+.cindex tls_privatekey caching
+.cindex tls_crl caching
+.cindex tls_ocsp_file caching
+.cindex tls_require_ciphers caching
+.cindex tls_verify_certificate caching
+.cindex caching certificate
+.cindex caching privatekey
+.cindex caching crl
+.cindex caching ocsp
+.cindex caching ciphers
+.cindex caching "certificate authorities
+If any of the main configuration options &%tls_certificate%&, &%tls_privatekey%&,
+&%tls_crl%& and &%tls_ocsp_file%& have values with no
+expandable elements,
+then the associated information is loaded at daemon startup.
+It is made available
+to child processes forked for handling received SMTP connections.
+
+This caching is currently only supported under Linux and FreeBSD.
+
+If caching is not possible, for example if an item has to be dependent
+on the peer host so contains a &$sender_host_name$& expansion, the load
+of the associated information is done at the startup of the TLS connection.
+
+The cache is invalidated and reloaded after any changes to the directories
+containing files specified by these options.
+
+The information specified by the main option &%tls_verify_certificates%&
+is similarly cached so long as it specifies files explicitly
+or (under GnuTLS) is the string &"system,cache"&.
+The latter case is not automatically invalidated;
+it is the operator's responsibility to arrange for a daemon restart
+any time the system certificate authority bundle is updated.
+A HUP signal is sufficient for this.
+The value &"system"& results in no caching under GnuTLS.
+
+The macro _HAVE_TLS_CA_CACHE will be defined if the suffix for "system"
+is acceptable in configurations for the Exim executavble.
+
+Caching of the system Certificate Authorities bundle can
+save siginificant time and processing on every TLS connection
+accepted by Exim.
+.wen
+
+
.section "Configuring an Exim client to use TLS" "SECTclientTLS"
@@ -29243,7 +29472,10 @@ unencrypted.
The &%tls_certificate%& and &%tls_privatekey%& options of the &(smtp)&
transport provide the client with a certificate, which is passed to the server
-if it requests it. If the server is Exim, it will request a certificate only if
+if it requests it.
+This is an optional thing for TLS connections, although either end
+may insist on it.
+If the server is Exim, it will request a certificate only if
&%tls_verify_hosts%& or &%tls_try_verify_hosts%& matches the client.
&*Note*&: Do not use a certificate which has the OCSP-must-staple extension,
@@ -29323,6 +29555,62 @@ outgoing connection.
+.new
+.section "Caching of static client configuration items" "SECTclientTLScache"
+.cindex certificate caching
+.cindex privatekey caching
+.cindex crl caching
+.cindex ciphers caching
+.cindex "CA bundle" caching
+.cindex "certificate authorities" caching
+.cindex tls_certificate caching
+.cindex tls_privatekey caching
+.cindex tls_crl caching
+.cindex tls_require_ciphers caching
+.cindex tls_verify_certificate caching
+.cindex caching certificate
+.cindex caching privatekey
+.cindex caching crl
+.cindex caching ciphers
+.cindex caching "certificate authorities
+If any of the transport configuration options &%tls_certificate%&, &%tls_privatekey%&
+and &%tls_crl%& have values with no
+expandable elements,
+then the associated information is loaded per smtp transport
+at daemon startup, at the start of a queue run, or on a
+command-line specified message delivery.
+It is made available
+to child processes forked for handling making SMTP connections.
+
+This caching is currently only supported under Linux.
+
+If caching is not possible, the load
+of the associated information is done at the startup of the TLS connection.
+
+The cache is invalidated in the daemon
+and reloaded after any changes to the directories
+containing files specified by these options.
+
+The information specified by the main option &%tls_verify_certificates%&
+is similarly cached so long as it specifies files explicitly
+or (under GnuTLS) is the string &"system,cache"&.
+The latter case is not automatically invaludated;
+it is the operator's responsibility to arrange for a daemon restart
+any time the system certificate authority bundle is updated.
+A HUP signal is sufficient for this.
+The value &"system"& results in no caching under GnuTLS.
+
+The macro _HAVE_TLS_CA_CACHE will be defined if the suffix for "system"
+is acceptable in configurations for the Exim executavble.
+
+Caching of the system Certificate Authorities bundle can
+save siginificant time and processing on every TLS connection
+initiated by Exim.
+.wen
+
+
+
+
.section "Use of TLS Server Name Indication" "SECTtlssni"
.cindex "TLS" "Server Name Indication"
.cindex "TLS" SNI
@@ -29358,6 +29646,11 @@ nothing more to it. Choosing a sensible value not derived insecurely is the
only point of caution. The &$tls_out_sni$& variable will be set to this string
for the lifetime of the client connection (including during authentication).
+.new
+If DANE validated the connection attempt then the value of the &%tls_sni%& option
+is forced to the domain part of the recipient address.
+.wen
+
Except during SMTP client sessions, if &$tls_in_sni$& is set then it is a string
received from a client.
It can be logged with the &%log_selector%& item &`+tls_sni`&.
@@ -29655,7 +29948,7 @@ by (a) is thought to be smaller than that of the set of root CAs.
It also allows the server to declare (implicitly) that connections to it should use TLS. An MITM could simply
fail to pass on a server's STARTTLS.
-DANE scales better than having to maintain (and side-channel communicate) copies of server certificates
+DANE scales better than having to maintain (and communicate via side-channel) copies of server certificates
for every possible target server. It also scales (slightly) better than having to maintain on an SMTP
client a copy of the standard CAs bundle. It also means not having to pay a CA for certificates.
@@ -29800,6 +30093,7 @@ If DANE is requested and useable (see above) the following transport options are
tls_verify_certificates
tls_crl
tls_verify_cert_hostnames
+ tls_sni
.endd
If DANE is not usable, whether requested or not, and CA-anchored
@@ -32543,7 +32837,7 @@ in kilobytes, megabytes, or gigabytes, respectively.
The &%per_rcpt%& option causes Exim to limit the rate at which recipients are
accepted. It can be used in the &%acl_smtp_rcpt%&, &%acl_smtp_predata%&,
-&%acl_smtp_mime%&, &%acl_smtp_data%&, or &%acl_smtp_rcpt%& ACLs. In
+&%acl_smtp_mime%&, or &%acl_smtp_data%& ACLs. In
&%acl_smtp_rcpt%& the rate is updated one recipient at a time; in the other
ACLs the rate is updated with the total (accepted) recipient count in one go. Note that
in either case the rate limiting engine will see a message with many
@@ -35747,8 +36041,7 @@ incoming SMTP message from a source that is not permitted to send them.
.section "Resent- header lines" "SECID220"
-.cindex "&%Resent-%& header lines"
-.cindex "header lines" "Resent-"
+.chindex Resent-
RFC 2822 makes provision for sets of header lines starting with the string
&`Resent-`& to be added to a message when it is resent by the original
recipient to somebody else. These headers are &'Resent-Date:'&,
@@ -35804,8 +36097,7 @@ existing &'Bcc:'& is not removed.
.section "The Date: header line" "SECID223"
-.cindex "&'Date:'& header line"
-.cindex "header lines" "Date:"
+.cindex Date:
If a locally-generated or submission-mode message has no &'Date:'& header line,
Exim adds one, using the current date and time, unless the
&%suppress_local_fixups%& control has been specified.
@@ -35822,8 +36114,7 @@ messages.
.section "The Envelope-to: header line" "SECID225"
-.cindex "&'Envelope-to:'& header line"
-.cindex "header lines" "Envelope-to:"
+.chindex Envelope-to:
.oindex "&%envelope_to_remove%&"
&'Envelope-to:'& header lines are not part of the standard RFC 2822 header set.
Exim can be configured to add them to the final delivery of messages. (See the
@@ -35834,8 +36125,7 @@ messages.
.section "The From: header line" "SECTthefrohea"
-.cindex "&'From:'& header line"
-.cindex "header lines" "From:"
+.chindex From:
.cindex "Sendmail compatibility" "&""From""& line"
.cindex "message" "submission"
.cindex "submission mode"
@@ -35878,8 +36168,7 @@ name as described in section &<>&.
.section "The Message-ID: header line" "SECID226"
-.cindex "&'Message-ID:'& header line"
-.cindex "header lines" "Message-ID:"
+.chindex Message-ID:
.cindex "message" "submission"
.oindex "&%message_id_header_text%&"
If a locally-generated or submission-mode incoming message does not contain a
@@ -35894,8 +36183,7 @@ in this header line by setting the &%message_id_header_text%& and/or
.section "The Received: header line" "SECID227"
-.cindex "&'Received:'& header line"
-.cindex "header lines" "Received:"
+.chindex Received:
A &'Received:'& header line is added at the start of every message. The
contents are defined by the &%received_header_text%& configuration option, and
Exim automatically adds a semicolon and a timestamp to the configured string.
@@ -35911,8 +36199,7 @@ changed to the time of acceptance, which is (apart from a small delay while the
.section "The References: header line" "SECID228"
-.cindex "&'References:'& header line"
-.cindex "header lines" "References:"
+.chindex References:
Messages created by the &(autoreply)& transport include a &'References:'&
header line. This is constructed according to the rules that are described in
section 3.64 of RFC 2822 (which states that replies should contain such a
@@ -35926,8 +36213,7 @@ incoming message. If there are more than 12, the first one and then the final
.section "The Return-path: header line" "SECID229"
-.cindex "&'Return-path:'& header line"
-.cindex "header lines" "Return-path:"
+.chindex Return-path:
.oindex "&%return_path_remove%&"
&'Return-path:'& header lines are defined as something an MTA may insert when
it does the final delivery of messages. (See the generic &%return_path_add%&
@@ -35940,7 +36226,7 @@ default), Exim removes &'Return-path:'& header lines from incoming messages.
.section "The Sender: header line" "SECTthesenhea"
.cindex "&'Sender:'& header line"
.cindex "message" "submission"
-.cindex "header lines" "Sender:"
+.chindex Sender:
For a locally-originated message from an untrusted user, Exim may remove an
existing &'Sender:'& header line, and it may add a new one. You can modify
these actions by setting the &%local_sender_retain%& option true, the
@@ -38025,7 +38311,8 @@ fields record the router and transport that were used to process the address.
If SMTP AUTH was used for the delivery there is an additional item A=
followed by the name of the authenticator that was used.
If an authenticated identification was set up by the authenticator's &%client_set_id%&
-option, this is logged too, separated by a colon from the authenticator name.
+option, this is logged too, as a second colon-separated list item.
+Optionally (see the &%smtp_mailauth%& &%log_selector%&) there may be a third list item.
If a shadow transport was run after a successful local delivery, the log line
for the successful delivery has an item added on the end, of the form
@@ -38039,8 +38326,11 @@ parentheses afterwards.
When more than one address is included in a single delivery (for example, two
SMTP RCPT commands in one transaction) the second and subsequent addresses are
flagged with &`->`& instead of &`=>`&. When two or more messages are delivered
-down a single SMTP connection, an asterisk follows the IP address in the log
-lines for the second and subsequent messages.
+down a single SMTP connection, an asterisk follows the
+.new
+remote IP address (and port if enabled)
+.wen
+in the log lines for the second and subsequent messages.
When two or more messages are delivered down a single TLS connection, the
DNS and some TLS-related information logged for the first message delivered
will not be present in the log lines for the second and subsequent messages.
@@ -38407,6 +38697,7 @@ routing email addresses, but it does apply to &"byname"& lookups.
client's ident port times out.
.next
.cindex "log" "incoming interface"
+.cindex "log" "outgoing interface"
.cindex "log" "local interface"
.cindex "log" "local address and port"
.cindex "TCP/IP" "logging local address and port"
@@ -38415,7 +38706,10 @@ client's ident port times out.
to the &"<="& line as an IP address in square brackets, tagged by I= and
followed by a colon and the port number. The local interface and port are also
added to other SMTP log lines, for example, &"SMTP connection from"&, to
-rejection lines, and (despite the name) to outgoing &"=>"& and &"->"& lines.
+rejection lines, and (despite the name) to outgoing
+.new
+&"=>"&, &"->"&, &"=="& and &"**"& lines.
+.wen
The latter can be disabled by turning off the &%outgoing_interface%& option.
.next
.cindex log "incoming proxy address"
@@ -38763,9 +39057,9 @@ the next chapter. The utilities described here are:
"check address acceptance from given IP"
.irow &<>& &'exim_dbmbuild'& "build a DBM file"
.irow &<>& &'exinext'& "extract retry information"
-.irow &<>& &'exim_dumpdb'& "dump a hints database"
-.irow &<>& &'exim_tidydb'& "clean up a hints database"
-.irow &<>& &'exim_fixdb'& "patch a hints database"
+.irow &<>& &'exim_dumpdb'& "dump a hints database"
+.irow &<>& &'exim_tidydb'& "clean up a hints database"
+.irow &<>& &'exim_fixdb'& "patch a hints database"
.irow &<>& &'exim_lock'& "lock a mailbox file"
.endtable
@@ -39271,7 +39565,7 @@ in a transport)
-.section "exim_dumpdb" "SECID261"
+.section "exim_dumpdb" "SECTdumpdb"
.cindex "&'exim_dumpdb'&"
The entire contents of a database are written to the standard output by the
&'exim_dumpdb'& program, which has no options or arguments other than the
@@ -39308,7 +39602,7 @@ cross-references.
-.section "exim_tidydb" "SECID262"
+.section "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
@@ -39357,7 +39651,7 @@ databases is likely to keep on increasing.
-.section "exim_fixdb" "SECID263"
+.section "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
@@ -40743,7 +41037,7 @@ but for EC keys it is the base64 of the pure key; no ASN.1 wrapping.
Signing is enabled by setting private options on the SMTP transport.
These options take (expandable) strings as arguments.
-.option dkim_domain smtp string list&!! unset
+.option dkim_domain smtp "string list&!!" unset
The domain(s) you want to sign with.
After expansion, this can be a list.
Each element in turn,
@@ -40753,7 +41047,7 @@ while expanding the remaining signing options.
If it is empty after expansion, DKIM signing is not done,
and no error will result even if &%dkim_strict%& is set.
-.option dkim_selector smtp string list&!! unset
+.option dkim_selector smtp "string list&!!" unset
This sets the key selector string.
After expansion, which can use &$dkim_domain$&, this can be a list.
Each element in turn is put in the expansion
@@ -41417,7 +41711,7 @@ Example usage:
.code
#macro
SRS_SECRET =
-
+
#routers
outbound:
@@ -41427,7 +41721,7 @@ Example usage:
transport = ${if eq {$local_part@$domain} \
{$original_local_part@$original_domain} \
{remote_smtp} {remote_forwarded_smtp}}
-
+
inbound_srs:
driver = redirect
senders = :
@@ -41435,7 +41729,7 @@ Example usage:
# detect inbound bounces which are SRS'd, and decode them
condition = ${if inbound_srs {$local_part} {SRS_SECRET}}
data = $srs_recipient
-
+
inbound_srs_failure:
driver = redirect
senders = :
@@ -41447,7 +41741,7 @@ Example usage:
#... further routers here
-
+
# transport; should look like the non-forward outbound
# one, plus the max_rcpt and return_path options
remote_forwarded_smtp:
@@ -41576,7 +41870,7 @@ mean, refer to the DMARC website above. Valid strings are:
&'reject '& The DMARC check failed and the library recommends rejecting the email.
&'quarantine '& The DMARC check failed and the library recommends keeping it for further inspection.
&'none '& The DMARC check passed and the library recommends no specific action, neutral.
-&'norecord '& No policy section in the DMARC record for this sender domain.
+&'norecord '& No policy section in the DMARC record for this RFC5322.From field
&'nofrom '& Unable to determine the domain of the sender.
&'temperror '& Library error or dns error.
&'off '& The DMARC check was disabled for this email.
@@ -41740,7 +42034,8 @@ automatically determines which version is in use.
The Proxy Protocol header is the first data received on a TCP connection
and is inserted before any TLS-on-connect handshake from the client; Exim
negotiates TLS between Exim-as-server and the remote client, not between
-Exim and the proxy server.
+Exim and the proxy server. The Proxy Protocol header must be received
+within &%proxy_protocol_timeout%&, which defaults to 3s.
The following expansion variables are usable
(&"internal"& and &"external"& here refer to the interfaces