Docs: notes on DBM library changeovers
[exim.git] / doc / doc-docbook / spec.xfpt
index 1b4a2572d2e0dd367ff56fa4be8063fdb2546084..8d61543cdff8be0b6ff22e397af0aab0bac1b730 100644 (file)
@@ -1,4 +1,3 @@
-
 . /////////////////////////////////////////////////////////////////////////////
 . 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
 . /////////////////////////////////////////////////////////////////////////////
 . 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
@@ -46,7 +45,7 @@
 . Update the Copyright year (only) when changing content.
 . /////////////////////////////////////////////////////////////////////////////
 
 . 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)"
 .include ./local_params
 
 .set ACL "access control lists (ACLs)"
@@ -55,7 +54,7 @@
 .set drivernamemax "64"
 
 .macro copyyear
 .set drivernamemax "64"
 
 .macro copyyear
-2023
+2024
 .endmacro
 
 . /////////////////////////////////////////////////////////////////////////////
 .endmacro
 
 . /////////////////////////////////////////////////////////////////////////////
@@ -1765,6 +1764,12 @@ distributors have chosen to bundle different libraries with their packaged
 versions. However, the more recent releases seem to have standardized on the
 Berkeley DB library.
 
 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:
 Different DBM libraries have different conventions for naming the files they
 use. When a program opens a file called &_dbmfile_&, there are several
 possibilities:
@@ -1805,6 +1810,9 @@ suited to Exim's usage model.
 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.
 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 sqlite3 (&url(https://www.sqlite.org/index.html))
+for the DBM library.
 .endlist
 
 .cindex "USE_DB"
 .endlist
 
 .cindex "USE_DB"
@@ -1816,8 +1824,9 @@ USE_DB in an appropriate configuration file (typically
 .code
 USE_DB=yes
 .endd
 .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,
 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,
@@ -1833,6 +1842,7 @@ in one of these lines:
 .code
 DBMLIB = -ldb
 DBMLIB = -ltdb
 .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.
 DBMLIB = -lgdbm -lgdbm_compat
 .endd
 The last of those was for a Linux having GDBM provide emulated NDBM facilities.
@@ -1848,6 +1858,17 @@ DBMLIB=/usr/local/lib/db-4.1/libdb.a
 There is further detailed discussion about the various DBM libraries in the
 file &_doc/dbm.discuss.txt_& in the Exim distribution.
 
 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 "Pre-building configuration" "SECID25"
@@ -2886,11 +2907,9 @@ available to admin users.
 
 The word &"set"& at the start of a line, followed by a single space,
 is recognised specially as defining a value for a variable.
 
 The word &"set"& at the start of a line, followed by a single space,
 is recognised specially as defining a value for a variable.
-.new
 .cindex "tainted data" "expansion testing"
 If the sequence &",t"& is inserted before the space,
 the value is marked as tainted.
 .cindex "tainted data" "expansion testing"
 If the sequence &",t"& is inserted before the space,
 the value is marked as tainted.
-.wen
 The syntax is otherwise the same as the ACL modifier &"set ="&.
 
 .cmdopt -bem <&'filename'&>
 The syntax is otherwise the same as the ACL modifier &"set ="&.
 
 .cmdopt -bem <&'filename'&>
@@ -3101,7 +3120,7 @@ options, as appropriate. The &%-bnq%& option (see below) provides a way of
 suppressing this for special cases.
 
 Policy checks on the contents of local messages can be enforced by means of
 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
 
 .cindex "return code" "for &%-bm%&"
 The return code is zero if the message is successfully accepted. Otherwise, the
@@ -3377,7 +3396,7 @@ dots doubled), terminated by a line containing just a single dot. An error is
 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
 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.
 
 Unqualified addresses are automatically qualified using &%qualify_domain%& and
 &%qualify_recipient%&, as appropriate, unless the &%-bnq%& option is used.
 
@@ -4715,7 +4734,7 @@ all selected messages, not just the first; frozen messages are included when
 
 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
 
 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.
 
 effect is to run Exim with the &%-R%& option, but it can be configured to run
 an arbitrary command instead.
 
@@ -6846,7 +6865,8 @@ by default, but has an option to omit them (see section &<<SECTdbmbuild>>&).
 .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.
 .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.
 If &[lstat()]& succeeds then so does the lookup.
 .cindex "tainted data" "dsearch result"
 The result is regarded as untainted.
@@ -6855,7 +6875,7 @@ Options for the lookup can be given by appending them after the word "dsearch",
 separated by a comma.  Options, if present, are a comma-separated list having
 each element starting with a tag name and an equals.
 
 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:
 candidates.
 The "ret" option requests an alternate result value of
 the entire path for the entry. Example:
@@ -6863,6 +6883,7 @@ the entire path for the entry. Example:
 ${lookup {passwd} dsearch,ret=full {/etc}}
 .endd
 The default result is just the requested entry.
 ${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 "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:
@@ -6872,6 +6893,14 @@ ${lookup {passwd} dsearch,filter=file {/etc}}
 The default matching is for any entry type, including directories
 and symlinks.
 
 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>>&.
 An example of how this
 lookup can be used to support virtual domains is given in section
 &<<SECTvirtualdomains>>&.
@@ -8161,7 +8190,6 @@ option, you can still update it by a query of this form:
 ${lookup pgsql,servers=master/db/name/pw {UPDATE ...} }
 .endd
 
 ${lookup pgsql,servers=master/db/name/pw {UPDATE ...} }
 .endd
 
-.new
 A now-deprecated syntax places the servers specification before the query,
 semicolon separated:
 .code
 A now-deprecated syntax places the servers specification before the query,
 semicolon separated:
 .code
@@ -8173,7 +8201,6 @@ The entire string within the braces becomes tainted,
 including the server sepcification - 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.
 including the server sepcification - 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.
 
 
 &*Note*&: server specifications in list-style lookups are still problematic.
 
@@ -8202,6 +8229,9 @@ or delete command), the result of the lookup is the number of rows affected.
 anything (for example, setting a field to the value it already has), the result
 is zero because no rows are affected.
 
 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.
 
 .subsection "Special PostgreSQL features" SECID74
 PostgreSQL lookups can also use Unix domain socket connections to the database.
@@ -11568,6 +11598,17 @@ literal question mark).
 .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>>&.
 .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
 
 
 .endlist
 
 
@@ -14819,6 +14860,7 @@ listed in more than one group.
 .row &%acl_smtp_rcpt%&               "ACL for RCPT"
 .row &%acl_smtp_starttls%&           "ACL for STARTTLS"
 .row &%acl_smtp_vrfy%&               "ACL for VRFY"
 .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 &%av_scanner%&                  "specify virus scanner"
 .row &%check_rfc2047_length%&        "check length of RFC 2047 &""encoded &&&
                                       words""&"
@@ -14985,6 +15027,7 @@ See also the &'Policy controls'& section above.
 .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 &%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
 
 
 .endtable
 
 
@@ -15108,7 +15151,7 @@ log_selector = +8bitmime
 .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
 .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
 further details.
 
 .option acl_not_smtp_mime main string&!! unset
@@ -15120,24 +15163,26 @@ SMTP messages.
 .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
 .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
 
 .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.
 
 .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
 
 .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"
 
 .option acl_smtp_data_prdr main string&!! accept
 .cindex "PRDR" "ACL for"
@@ -15148,7 +15193,7 @@ This option defines the ACL that,
 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
 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_dkim main string&!! unset
 .cindex DKIM "ACL for"
@@ -15171,7 +15216,7 @@ received. See chapter &<<CHAPACL>>& for further details.
 .cindex "EHLO" "ACL for"
 .cindex "HELO" "ACL for"
 This option defines the ACL that is run when an SMTP EHLO or HELO
 .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_mail main string&!! unset
@@ -15182,7 +15227,8 @@ received. See chapter &<<CHAPACL>>& for further details.
 .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
 .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
 &<<CHAPSMTPAUTH>>& for details of authentication.
 
 .option acl_smtp_mime main string&!! unset
@@ -15195,7 +15241,7 @@ section &<<SECTscanmimepart>>& for details.
 .cindex "not-QUIT, ACL for"
 This option defines the ACL that is run when an SMTP session
 ends without a QUIT command being received.
 .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_predata main string&!! unset
 This option defines the ACL that is run when an SMTP DATA command is
@@ -15210,7 +15256,7 @@ received. See chapter &<<CHAPACL>>& for further details.
 .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
 .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"
 
 .option acl_smtp_starttls main string&!! unset
 .cindex "STARTTLS, ACL for"
@@ -15222,6 +15268,11 @@ received. See chapter &<<CHAPACL>>& for further details.
 This option defines the ACL that is run when an SMTP VRFY command is
 received. See chapter &<<CHAPACL>>& for further details.
 
 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
 .option add_environment main "string list" empty
 .cindex "environment" "set values"
 This option adds individual environment variables that the
@@ -16196,11 +16247,13 @@ set.
 .cindex "EHLO" "underscores in"
 .cindex "underscore in EHLO/HELO"
 This option can be set to a string of rogue characters that are permitted in
 .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 examplem if you really must allow underscores,
+you can set
 .code
 helo_allow_chars = _
 .endd
 .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.
 
 
 Note that the value is one string, not a list.
 
 
@@ -16564,7 +16617,6 @@ has been built with LDAP support.
 
 
 
 
 
 
-.new
 .option limits_advertise_hosts main "host list&!!" *
 .cindex LIMITS "suppressing advertising"
 .cindex "ESMTP extensions" LIMITS
 .option limits_advertise_hosts main "host list&!!" *
 .cindex LIMITS "suppressing advertising"
 .cindex "ESMTP extensions" LIMITS
@@ -16574,7 +16626,6 @@ If permitted, Exim as a servier 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.
 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"
 
 .option local_from_check main boolean true
 .cindex "&'Sender:'& header line" "disabling addition of"
@@ -17490,14 +17541,12 @@ all recipients over the limit; earlier recipients are delivered as normal.
 Non-SMTP messages with too many recipients are failed, and no deliveries are
 done.
 
 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.
 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
 
 .cindex "RCPT" "maximum number of incoming"
 &*Note*&: The RFCs specify that an SMTP server should accept at least 100
@@ -18891,6 +18940,12 @@ absolute and untainted.
 See also &%bounce_message_file%&.
 
 
 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.
 .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.
@@ -24529,7 +24584,7 @@ when the message is specified by the transport.
 .cindex "transports" "&(lmtp)&"
 .cindex "&(lmtp)& transport"
 .cindex "LMTP" "over a pipe"
 .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.
 The &(lmtp)& transport runs the LMTP protocol (RFC 2033) over a pipe to a
 specified command
 or by interacting with a Unix domain socket.
@@ -25386,12 +25441,10 @@ over a single TCP/IP connection. If the value is zero, there is no limit.
 For testing purposes, this value can be overridden by the &%-oB%& command line
 option.
 
 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.
 .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
 
 
 .option dane_require_tls_ciphers smtp string&!! unset
@@ -25616,12 +25669,10 @@ suffices for one known case.
 During the expansion of this option the &$item$& variable will have the
 server's EHLO response.
 
 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.
 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.
 
 The result of the option expansion is included in the key used to store and
 retrieve the TLS session, for session resumption.
@@ -25969,13 +26020,11 @@ each set of addresses is treated independently, and
 so can cause parallel connections to the same host if &%remote_max_parallel%&
 permits this.
 
 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.
 .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
 
 
 .option message_linelength_limit smtp integer 998
@@ -26008,12 +26057,10 @@ 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.
 
 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.
 .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"
 
 
 .option port smtp string&!! "see below"
@@ -26049,6 +26096,9 @@ protocol (RFC 2033) instead of SMTP. This protocol is sometimes used for local
 deliveries into closed message stores. Exim also has support for running LMTP
 over a pipe to a local process &-- see chapter &<<CHAPLMTP>>&.
 
 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.
 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.
@@ -30623,6 +30673,7 @@ options in the main part of the configuration. These options are:
 .cindex "RCPT" "ACL for"
 .cindex "STARTTLS, ACL for"
 .cindex "VRFY" "ACL for"
 .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"
 .cindex "SMTP" "connection, ACL for"
 .cindex "non-SMTP messages" "ACLs for"
 .cindex "MIME content scanning" "ACL for"
@@ -30649,6 +30700,7 @@ options in the main part of the configuration. These options are:
 .irow &%acl_smtp_rcpt%&        "ACL for RCPT"
 .irow &%acl_smtp_starttls%&    "ACL for STARTTLS"
 .irow &%acl_smtp_vrfy%&        "ACL for VRFY"
 .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
 .endtable
 
 For example, if you set
@@ -30664,7 +30716,7 @@ trying to deliver the message. It is therefore recommended that you do as much
 testing as possible at RCPT time.
 
 
 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
 .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
@@ -30698,7 +30750,7 @@ kind of rejection is treated as permanent, because there is no way of sending a
 temporary error for these kinds of message.
 
 
 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
 .cindex "SMTP" "connection, ACL for"
 .oindex &%smtp_banner%&
 The ACL test specified by &%acl_smtp_connect%& happens at the start of an SMTP
@@ -30713,7 +30765,7 @@ is accepted; if the ACL does not accept then the TCP connection is dropped witho
 any TLS startup attempt and without any SMTP response being transmitted.
 
 
 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
 .cindex "EHLO" "ACL for"
 .cindex "HELO" "ACL for"
 The ACL test specified by &%acl_smtp_helo%& happens when the client issues an
@@ -30734,7 +30786,7 @@ affect the EHLO options that are listed on the second and subsequent lines of
 an EHLO response.
 
 
 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.
 .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.
@@ -30831,6 +30883,60 @@ This ACL is evaluated after &%acl_smtp_dkim%& but before &%acl_smtp_data%&.
 If the ACL is not defined, processing completes as if
 the feature was not requested by 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
 .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
@@ -31001,12 +31107,13 @@ For &%acl_not_smtp%&, &%acl_smtp_auth%&, &%acl_smtp_connect%&,
 &%acl_smtp_mime%&, &%acl_smtp_predata%&, and &%acl_smtp_starttls%&, the action
 when the ACL is not defined is &"accept"&.
 
 &%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.
 
 
 
 
 
 
@@ -32111,6 +32218,11 @@ that are being submitted at the same time using &%-bs%& or &%-bS%&.
 This control enables conversion of UTF-8 in message envelope addresses
 to a-label form.
 For details see section &<<SECTi18nMTA>>&.
 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
 
 
 .endlist vlist
 
 
@@ -35100,13 +35212,11 @@ If the string does not start with a slash, it is used as the
 filename, and the default path is then used.
 .endlist
 The &%decode%& condition normally succeeds. It is only false for syntax
 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
 automatically unlinked.
 
 For RFC822 attachments (these are messages attached to messages, with a
@@ -39266,10 +39376,8 @@ verifies successfully a tag of DKIM is added, with one of the verified domains.
 .cindex log "DKIM verification"
 .cindex DKIM "verification logging"
 &%dkim_verbose%&: A log entry is written for each attempted DKIM verification.
 .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=.
 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"
 .next
 .cindex "log" "dnslist defer"
 .cindex "DNS list" "logging defer"
@@ -41617,10 +41725,8 @@ Exim's DKIM implementation allows for
 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.
 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.
 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
 .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
@@ -41828,11 +41934,9 @@ name will be appended.
 .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.
 .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).
 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.
 
 
 RFC 6376 lists these tags as RECOMMENDED.
 
@@ -42106,9 +42210,7 @@ for that check for empty &$h_DKIM-Signature:$& in the data ACL.
 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.
 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.
 This condition may be used in DKIM, MIME, PRDR and DATA ACLs.
-.wen
 
 A basic verification might be:
 .code
 
 A basic verification might be:
 .code
@@ -42130,9 +42232,7 @@ see the documentation of the &%$dkim_verify_status%& expansion variable above
 for more information of what they mean.
 
 The condition is true if the status
 for more information of what they mean.
 
 The condition is true if the status
-.new
 (or any of the list of status values)
 (or any of the list of status values)
-.wen
 is any one of the supplied list.
 .endlist
 
 is any one of the supplied list.
 .endlist
 
@@ -43020,6 +43120,7 @@ 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"
 .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 msg:complete           after    main       "per message"
 .row msg:defer              after    transport  "per message per delivery try"
 .row msg:delivery           after    transport  "per recipient"
@@ -43053,6 +43154,7 @@ with the event type:
 .itable all 0 0 2 20* left 80* left
 .row auth:fail           "smtp response"
 .row dane:fail            "failure reason"
 .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 msg:defer            "error string"
 .row msg:delivery         "smtp confirmation message"
 .row msg:fail:internal    "failure reason"
@@ -43102,6 +43204,9 @@ chain element received on the connection.
 For OpenSSL it will trigger for every chain element including those
 loaded locally.
 
 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.
+
 . ////////////////////////////////////////////////////////////////////////////
 . ////////////////////////////////////////////////////////////////////////////
 
 . ////////////////////////////////////////////////////////////////////////////
 . ////////////////////////////////////////////////////////////////////////////