X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/de768ba0626a60f094593c6e43fc808fe0e898b7..a243c20fbe33a8eb196f1447816c491bfdd7128d:/doc/doc-docbook/spec.xfpt diff --git a/doc/doc-docbook/spec.xfpt b/doc/doc-docbook/spec.xfpt index 4e41acf42..193884227 100644 --- a/doc/doc-docbook/spec.xfpt +++ b/doc/doc-docbook/spec.xfpt @@ -45,7 +45,7 @@ . Update the Copyright year (only) when changing content. . ///////////////////////////////////////////////////////////////////////////// -.set previousversion "4.96" +.set previousversion "4.98" .include ./local_params .set ACL "access control lists (ACLs)" @@ -54,7 +54,7 @@ .set drivernamemax "64" .macro copyyear -2022 +2024 .endmacro . ///////////////////////////////////////////////////////////////////////////// @@ -76,6 +76,16 @@ . --- table with four columns. For cases when the option name is given with . --- a space, so that it can be split, a fifth argument is used for the . --- index entry. +. --- Also one for multiple option def headings be grouped in a single +. --- table (but without the split capability). + +.macro otable +.itable all 0 0 4 8* left 6* center 6* center 6* right +.endmacro + +.macro orow +.row "&%$1%&" "Use: &'$2'&" "Type: &'$3'&" "Default: &'$4'&" +.endmacro .macro option .arg 5 @@ -84,8 +94,19 @@ .arg -5 .oindex "&%$1%&" .endarg -.itable all 0 0 4 8* left 6* center 6* center 6* right -.row "&%$1%&" "Use: &'$2'&" "Type: &'$3'&" "Default: &'$4'&" +.otable +.orow "$1" "$2" "$3" "$4" +.endtable +.endmacro + +.macro options +.eacharg +.oindex "&%$+1%&" +.endeach 4 +.otable +.eacharg +.orow "$+1" "$+2" "$+3" "$+4" +.endeach 4 .endtable .endmacro @@ -425,7 +446,7 @@ website, are hosted at the University of Cambridge. .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 @@ -443,10 +464,11 @@ Please do not ask for configuration help in the bug-tracker. The following Exim mailing lists exist: .table2 140pt -.row &'exim-announce@exim.org'& "Moderated, low volume announcements list" -.row &'exim-users@exim.org'& "General discussion list" -.row &'exim-dev@exim.org'& "Discussion of bugs, enhancements, etc." -.row &'exim-cvs@exim.org'& "Automated commit messages from the VCS" +.row &'exim-announce@lists.exim.org'& "Moderated, low volume announcements list" +.row &'exim-users@lists.exim.org'& "General discussion list" +.row &'exim-users-de@lists.exim.org'& "General discussion list in German language" +.row &'exim-dev@lists.exim.org'& "Discussion of bugs, enhancements, etc." +.row &'exim-cvs@lists.exim.org'& "Automated commit messages from the VCS" .endtable You can subscribe to these lists, change your existing subscriptions, and view @@ -465,7 +487,7 @@ lists. .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. @@ -555,7 +577,8 @@ distribution, and are also available in &_.bz2_& and &_.xz_& forms. .cindex "limitations of Exim" .cindex "bang paths" "not handled by Exim" Exim is designed for use as an Internet MTA, and therefore handles addresses in -RFC 2822 domain format only. It cannot handle UUCP &"bang paths"&, though +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +domain format only. It cannot handle UUCP &"bang paths"&, though simple two-component bang paths can be converted by a straightforward rewriting configuration. This restriction does not prevent Exim from being interfaced to UUCP as a transport mechanism, provided that domain addresses are used. @@ -667,7 +690,8 @@ line. .cindex "local part" "definition of" .cindex "domain" "definition of" -The term &'local part'&, which is taken from RFC 2822, is used to refer to the +The term &'local part'&, which is taken from +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822), is used to refer to the part of an email address that precedes the @ sign. The part that follows the @ sign is called the &'domain'& or &'mail domain'&. @@ -930,7 +954,7 @@ of filtering are available: .ilist Sieve filters are written in the standard filtering language that is defined -by RFC 3028. +by &url(https://www.rfc-editor.org/rfc/rfc3028.html,RFC 3028). .next Exim filters are written in a syntax that is unique to Exim, but which is more powerful than Sieve, which it pre-dates. @@ -948,9 +972,10 @@ User filters are run as part of the routing process, described below. .cindex "base36" .cindex "Darwin" .cindex "Cygwin" -Every message handled by Exim is given a &'message id'& which is sixteen +.cindex "exim_msgdate" +Every message handled by Exim is given a &'message id'& which is 23 characters long. It is divided into three parts, separated by hyphens, for -example &`16VDhn-0001bo-D3`&. Each part is a sequence of letters and digits, +example &`16VDhn-000000001bo-D342`&. Each part is a sequence of letters and digits, normally encoding numbers in base 62. However, in the Darwin operating system (Mac OS X) and when Exim is compiled to run under Cygwin, base 36 (avoiding the use of lower case letters) is used instead, because the message @@ -971,20 +996,24 @@ started to be received, to a granularity of one second. That is, this field contains the number of seconds since the start of the epoch (the normal Unix way of representing the date and time of day). .next -After the first hyphen, the next six characters are the id of the process that -received the message. +After the first hyphen, the next +eleven +characters are the id of the process that received the message. .next -There are two different possibilities for the final two characters: +There are two different possibilities for the final four characters: .olist .oindex "&%localhost_number%&" If &%localhost_number%& is not set, this value is the fractional part of the -time of reception, normally in units of 1/2000 of a second, but for systems +time of reception, normally in units of +microseconds. +but for systems that must use base 36 instead of base 62 (because of case-insensitive file -systems), the units are 1/1000 of a second. +systems), the units are +2 us. .next -If &%localhost_number%& is set, it is multiplied by 200 (100) and added to -the fractional part of the time, which in this case is in units of 1/200 -(1/100) of a second. +If &%localhost_number%& is set, it is multiplied by +500000 (250000) and added to +the fractional part of the time, which in this case is in units of 2 us (4 us). .endlist .endlist @@ -994,6 +1023,10 @@ received by the same process, or by another process with the same (re-used) pid, it is guaranteed that the time will be different. In most cases, the clock will already have ticked while the message was being received. +The exim_msgdate utility (see section &<>&) can be +used to display the date, and optionally the process id, of an Exim +Message ID. + .section "Receiving mail" "SECID13" .cindex "receiving mail" @@ -1733,6 +1766,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. +.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: @@ -1773,6 +1812,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. +.next +It is possible to use &url(https://www.sqlite.org/index.html,sqlite3) +for the DBM library. .endlist .cindex "USE_DB" @@ -1784,8 +1826,9 @@ USE_DB in an appropriate configuration file (typically .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, @@ -1801,6 +1844,7 @@ in one of these lines: .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. @@ -1816,6 +1860,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. +.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" @@ -1878,7 +1933,8 @@ do this. .cindex "&[iconv()]& support" .cindex "RFC 2047" The contents of header lines in messages may be encoded according to the rules -described RFC 2047. This makes it possible to transmit characters that are not +described in &url(https://www.rfc-editor.org/rfc/rfc2047,RFC 2047). +This makes it possible to transmit characters that are not in the ASCII character set, and to label them as being in a particular character set. When Exim is inspecting header lines by means of the &%$h_%& mechanism, it decodes them, and translates them into a specified character set @@ -1903,7 +1959,8 @@ to your &_Local/Makefile_& and rebuild Exim. .cindex "OpenSSL" "building Exim with" .cindex "GnuTLS" "building Exim with" Exim is usually built to support encrypted SMTP connections, using the STARTTLS -command as per RFC 2487. It can also support clients that expect to +command as per &url(https://www.rfc-editor.org/rfc/rfc2487,RFC 2487). +It can also support clients that expect to start a TLS session immediately on connection to a non-standard port (see the &%tls_on_connect_ports%& runtime option and the &%-tls-on-connect%& command line option). @@ -2016,19 +2073,29 @@ withdrawn. -.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. @@ -2038,12 +2105,25 @@ see &_src/EDITME_& for details. 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" @@ -2757,6 +2837,12 @@ displayed. These options are used by Sendmail for selecting configuration files and are ignored by Exim. +.new +.cmdopt -atrn <&'host'&> <&'domainlist'&> +This option requests an ODMR customer connection. +See &<>& for details. +.wen + .cmdopt -B <&'type'&> .oindex "&%-B%&" .cindex "8-bit characters" @@ -2810,6 +2896,12 @@ of Exim is installed. It is not necessary to do this when other files that are referenced from the configuration (for example, alias files) are changed, because these are reread each time they are used. +Either a SIGTERM or a SIGINT signal should be used to cause the daemon +to cleanly shut down. +Subprocesses handling recceiving or delivering messages, +or for scanning the queue, +will not be affected by the termination of the daemon process. + .cmdopt -bdf This option has the same effect as &%-bd%& except that it never disconnects from the controlling terminal, even when no debugging is specified. @@ -2846,11 +2938,12 @@ defined and macros will be expanded. Because macros in the config file are often used for secrets, those are only available to admin users. -.new 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 ="&. -.wen .cmdopt -bem <&'filename'&> .cindex "testing" "string expansion" @@ -2974,7 +3067,8 @@ test your relay controls using &%-bh%&. &*Warning 1*&: .cindex "RFC 1413" -You can test features of the configuration that rely on ident (RFC 1413) +You can test features of the configuration that rely on ident +(&url(https://www.rfc-editor.org/rfc/rfc2487,RFC 1413)) information by using the &%-oMt%& option. However, Exim cannot actually perform an ident callout when testing using &%-bh%& because there is no incoming SMTP connection. @@ -2997,7 +3091,7 @@ acceptable or not. See section &<>&. 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 @@ -3040,7 +3134,9 @@ recognised DSCP names. .cindex "Sieve filter" "capabilities" This option causes Exim to emit an alphabetically sorted list of all supported Sieve protocol extensions on stdout, one per line. This is anticipated to be -useful for ManageSieve (RFC 5804) implementations, in providing that protocol's +useful for ManageSieve +(&url(https://datatracker.ietf.org/doc/html/rfc5804.html,RFC 5804)) +implementations, in providing that protocol's &`SIEVE`& capability response line. As the precise list may depend upon compile-time build options, which this option will adapt to, this is the only way to guarantee a correct response. @@ -3050,7 +3146,9 @@ way to guarantee a correct response. This option runs an Exim receiving process that accepts an incoming, locally-generated message on the standard input. The recipients are given as the command arguments (except when &%-t%& is also present &-- see below). Each -argument can be a comma-separated list of RFC 2822 addresses. This is the +argument can be a comma-separated list of +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) addresses. +This is the default option for selecting the overall action of an Exim call; it is assumed if no other conflicting option is present. @@ -3060,7 +3158,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 -the non-SMTP ACL. See chapter &<>& for details. +the non-SMTP ACL. See section &<>& for details. .cindex "return code" "for &%-bm%&" The return code is zero if the message is successfully accepted. Otherwise, the @@ -3072,7 +3170,9 @@ The format .cindex "&""From""& line" .cindex "UUCP" "&""From""& line" .cindex "Sendmail compatibility" "&""From""& line" -of the message must be as defined in RFC 2822, except that, for +of the message must be as defined in +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822), +except that, for compatibility with Sendmail and Smail, a line in one of the forms .code From sender Fri Jan 5 12:55 GMT 1997 @@ -3258,6 +3358,12 @@ to the standard output. It is restricted to admin users, unless &%queue_list_requires_admin%& is set false. +.cmdopt -bpi +.cindex queue "list of message IDs" +This option operates like &%-bp%&, but only outputs message ids +(one per line). + + .cmdopt -bpr This option operates like &%-bp%&, but the output is not sorted into chronological order of message arrival. This can speed it up when there are @@ -3267,6 +3373,9 @@ going to be post-processed in a way that doesn't need the sorting. .cmdopt -bpra This option is a combination of &%-bpr%& and &%-bpa%&. +.cmdopt -bpri +This option is a combination of &%-bpr%& and &%-bpi%&. + .cmdopt -bpru This option is a combination of &%-bpr%& and &%-bpu%&. @@ -3327,12 +3436,12 @@ 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 -messages can be checked using the non-SMTP ACL (see chapter &<>&). +messages can be checked using the non-SMTP ACL (see section &<>&). Unqualified addresses are automatically qualified using &%qualify_domain%& and &%qualify_recipient%&, as appropriate, unless the &%-bnq%& option is used. Some other SMTP commands are recognized in the input. HELO and EHLO act -as RSET; VRFY, EXPN, ETRN, and HELP act as NOOP; +as RSET; VRFY, EXPN, ETRN, ATRN, and HELP act as NOOP; QUIT quits, ignoring the rest of the standard input. .cindex "return code" "for &%-bS%&" @@ -3967,7 +4076,7 @@ user. This option requests Exim to give up trying to deliver the listed messages, including any that are frozen. However, if any of the messages are active, their status is not altered. For non-bounce messages, a delivery error message -is sent to the sender, containing the text &"cancelled by administrator"&. +is sent to the sender. Bounce messages are just discarded. This option can be used only by an admin user. @@ -4050,8 +4159,9 @@ written to the standard output. This option can be used only by an admin user. .cindex "message" "listing in RFC 2822 format" .cindex "listing" "message in RFC 2822 format" This option causes a copy of the complete message (header lines plus body) to -be written to the standard output in RFC 2822 format. This option can be used -only by an admin user. +be written to the standard output in +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +format. This option can be used only by an admin user. .cmdopt -Mvh <&'message&~id'&> .cindex "listing" "message headers" @@ -4397,13 +4507,17 @@ 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. +If this option is given then the socket will not be created. This is required +if the system is running multiple daemons, in which case it should +be used on all. +The features supported by the socket will not be available in such cases. The socket is currently used for .ilist fast ramp-up of queue runner processes .next +caching compiled regexes +.next obtaining a current queue size .endlist @@ -4489,22 +4603,30 @@ every domain. Addresses are routed, local deliveries happen, but no remote transports are run. Performance will be best if the &%queue_run_in_order%& option is false. -If that is so and the &%queue_fast_ramp%& option is true then -in the first phase of the run, +If that is so and +the &%queue_fast_ramp%& option is true +and a daemon-notifier socket is available +then in the first phase of the run, once a threshold number of messages are routed for a given host, a delivery process is forked in parallel with the rest of the scan. .cindex "hints database" "remembering routing" The hints database that remembers which messages are waiting for specific hosts -is updated, as if delivery to those hosts had been deferred. After this is -complete, a second, normal queue scan happens, with routing and delivery taking -place as normal. Messages that are routed to the same host should mostly be +is updated, as if delivery to those hosts had been deferred. + +After the first queue scan complete, +a second, normal queue scan is done, with routing and delivery taking +place as normal. +Messages that are routed to the same host should mostly be delivered down a single SMTP .cindex "SMTP" "passed connection" .cindex "SMTP" "multiple deliveries" .cindex "multiple SMTP deliveries" connection because of the hints that were set up during the first queue scan. -This option may be useful for hosts that are connected to the Internet + +Two-phase queue runs should be used on systems which, even intermittently, +have a large queue (such as mailing-list operators). +They may also be useful for hosts that are connected to the Internet intermittently. .vitem &%-q[q]i...%& @@ -4591,6 +4713,13 @@ combined daemon at system boot time is to use a command such as Such a daemon listens for incoming SMTP calls, and also starts a queue runner process every 30 minutes. +.cindex "named queues" "queue runners" +It is possible to set up runners for multiple named queues within one daemon, +For example: +.code +exim -qGhipri/2m -q10m -qqGmailinglist/1h +.endd + When a daemon is started by &%-q%& with a time value, but without &%-bd%&, no pid file is written unless one is explicitly requested by the &%-oP%& option. @@ -4646,7 +4775,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 -command ETRN is accepted by its ACL (see chapter &<>&), its default +command ETRN is accepted by its ACL (see section &<>&), its default effect is to run Exim with the &%-R%& option, but it can be configured to run an arbitrary command instead. @@ -4697,7 +4826,8 @@ lines instead of from &'To:'&, &'Cc:'&, and &'Bcc:'&. This is for compatibility with Sendmail and other MTAs. (Prior to release 4.20, Exim gave an error if &%-t%& was used in conjunction with &%Resent-%& header lines.) -RFC 2822 talks about different sets of &%Resent-%& header lines (for when a +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +talks about different sets of &%Resent-%& header lines (for when a message is resent several times). The RFC also specifies that they should be added at the front of the message, and separated by &'Received:'& lines. It is not at all clear how &%-t%& should operate in the present of multiple sets, @@ -5103,6 +5233,10 @@ The following classes of macros are defined: &` _DRIVER_ROUTER_* `& router drivers &` _DRIVER_TRANSPORT_* `& transport drivers &` _DRIVER_AUTHENTICATOR_* `& authenticator drivers +&` _EXP_COND_* `& expansion conditions +&` _EXP_ITEM_* `& expansion items +&` _EXP_OP_* `& expansion operators +&` _EXP_VAR_* `& expansion variables &` _LOG_* `& log_selector values &` _OPT_MAIN_* `& main config options &` _OPT_ROUTERS_* `& generic router options @@ -5360,7 +5494,7 @@ list items, it is not ignored when parsing the list. The spaces around the first 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 @@ -5401,7 +5535,7 @@ enclosing an empty list item. -.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 @@ -5660,9 +5794,11 @@ Mail submission from mail clients (MUAs) should be separate from inbound mail to your domain (MX delivery) for various good reasons (eg, ability to impose much saner TLS protocol and ciphersuite requirements without unintended consequences). -RFC 6409 (previously 4409) specifies use of port 587 for SMTP Submission, +&url(https://www.rfc-editor.org/rfc/rfc6409,RFC 6409) (previously 4409) +specifies use of port 587 for SMTP Submission, which uses STARTTLS, so this is the &"submission"& port. -RFC 8314 specifies use of port 465 as the &"submissions"& protocol, +&url(https://www.rfc-editor.org/rfc/rfc8314,RFC 8314) +specifies use of port 465 as the &"submissions"& protocol, which should be used in preference to 587. You should also consider deploying SRV records to help clients find these ports. @@ -5721,8 +5857,9 @@ Note that it is not always possible to find a host name from an IP address, because not all DNS reverse zones are maintained, and sometimes DNS servers are unreachable. -The next two lines are concerned with &'ident'& callbacks, as defined by RFC -1413 (hence their names): +The next two lines are concerned with &'ident'& callbacks, as defined by +&url(https://www.rfc-editor.org/rfc/rfc1413,RFC 1413) +(hence their names): .code rfc1413_hosts = * rfc1413_query_timeout = 0s @@ -5795,7 +5932,8 @@ not often needed). .endd In an ideal world everybody follows the standards. For non-ASCII -messages RFC 2047 is a standard, allowing a maximum line length of 76 +messages &url(https://www.rfc-editor.org/rfc/rfc2048,RFC 2047) +is a standard, allowing a maximum line length of 76 characters. Exim adheres that standard and won't process messages which violate this standard. (Even ${rfc2047:...} expansions will fail.) In particular, the Exim maintainers have had multiple reports of @@ -5897,7 +6035,9 @@ block local parts that begin with a dot or contain &"@"&, &"%"&, &"!"&, &"/"&, or &"|"&. If you have local accounts that include these characters, you will have to modify this rule. -Empty components (two dots in a row) are not valid in RFC 2822, but Exim +Empty components (two dots in a row) are not valid in +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822), +but Exim allows them because they have been encountered in practice. (Consider the common convention of local parts constructed as &"&'first-initial.second-initial.family-name'&"& when applied to someone like @@ -6602,7 +6742,7 @@ file that is searched could contain lines like this: When the lookup succeeds, the result of the expansion is a list of domains (and possibly other types of item that are allowed in domain lists). .cindex "tainted data" "de-tainting" -.cindex "de-tainting" "using a lookup expansion"" +.cindex "de-tainting" "using a lookup expansion" The result of the expansion is not tainted. .next @@ -6671,8 +6811,14 @@ version of the lookup key. The &'query-style'& type accepts a generalized database query. No particular key value is assumed by Exim for query-style lookups. You can use whichever Exim variables you need to construct the database query. + +For the string-expansion kind of lookups, the query is given in the first +bracketed argument of the &${lookup ...}$& expansion. +For the list-argument kind of lookup the query is given by the remainder of the +list item after the first semicolon. + .cindex "tainted data" "quoting for lookups" -If tainted data is used in the query then it should be quuted by +If tainted data is used in the query then it should be quoted by using the &*${quote_*&<&'lookup-type'&>&*:*&<&'string'&>&*}*& expansion operator appropriate for the lookup. .endlist @@ -6767,7 +6913,8 @@ by default, but has an option to omit them (see section &<>&). .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. @@ -6776,7 +6923,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. -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: @@ -6784,6 +6931,7 @@ 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: @@ -6793,6 +6941,14 @@ ${lookup {passwd} dsearch,filter=file {/etc}} 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 &<>&. @@ -6822,8 +6978,8 @@ key is found. The first key that matches is used; there is no attempt to find a 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 -&<>&). +the implicit key is the host's IP address rather than its name +(see section &<>&). &*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 @@ -6859,7 +7015,7 @@ For elements of type string, the returned value is de-quoted. 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. @@ -7261,6 +7417,11 @@ dot-separated components; a key such as &`*fict.example`& in a database file is useless, because the asterisk in a partial matching subject key is always followed by a dot. +When the lookup is done from a string-expansion, +the variables &$1$& and &$2$& contain the wild and non-wild parts of the key +during the expansion of the replacement text. +They return to their previous values at the end of the lookup item. + @@ -7311,10 +7472,13 @@ of the following form is provided: .code ${quote_:} .endd -For example, the safest way to write the NIS+ query is +For example, the way to write the NIS+ query is .code [name="${quote_nisplus:$local_part}"] .endd +.cindex "tainted data" "in lookups" +&*All*& tainted data used in a query-style lookup must be quoted +using a mechanism appropriate for the lookup type. See chapter &<>& for full coverage of string expansions. The quote operator can be used for all lookup types, but has no effect for single-key lookups, since no quoting is ever needed in their key strings. @@ -7577,7 +7741,8 @@ First we explain how LDAP queries are coded. .subsection "Format of LDAP queries" SECTforldaque .cindex "LDAP" "query format" -An LDAP query takes the form of a URL as defined in RFC 2255. For example, in +An LDAP query takes the form of a URL as defined in +&url(https://www.rfc-editor.org/rfc/rfc2255,RFC 2255). For example, in the configuration of a &(redirect)& router one might have this setting: .code data = ${lookup ldap \ @@ -7620,7 +7785,9 @@ the string: ) => \29 \ => \5C .endd -in accordance with RFC 2254. The resulting string is then quoted according +in accordance with +&url(https://www.rfc-editor.org/rfc/rfc2254,RFC 2254). +The resulting string is then quoted according to the rules for URLs, that is, all non-alphanumeric characters except .code ! $ ' - . _ ( ) * + @@ -7644,8 +7811,10 @@ by inserting a backslash in front of any of the following characters: , + " \ < > ; .endd It also inserts a backslash before any leading spaces or # characters, and -before any trailing spaces. (These rules are in RFC 2253.) The resulting string -is then quoted according to the rules for URLs. For example: +before any trailing spaces. (These rules are in +&url(https://www.rfc-editor.org/rfc/rfc2255,RFC 2253).) +The resulting string is then quoted according to the rules for URLs. +For example: .code ${quote_ldap_dn: a(bc)*, a; } .endd @@ -7681,7 +7850,8 @@ Errors which cause the next server to be tried are connection failures, bind failures, and timeouts. For each server name in the list, a port number can be given. The standard way -of specifying a host and port is to use a colon separator (RFC 1738). Because +of specifying a host and port is to use a colon separator +(&url(https://www.rfc-editor.org/rfc/rfc1738,RFC 1738)). Because &%ldap_default_servers%& is a colon-separated list, such colons have to be doubled. For example .code @@ -7799,7 +7969,8 @@ connection timeout (the system timeout is used), no user or password, no limit on the number of entries returned, and no time limit on queries. When a DN is quoted in the USER= setting for LDAP authentication, Exim -removes any URL quoting that it may contain before passing it LDAP. Apparently +removes any URL quoting that it may contain before passing it to the LDAP library. +Apparently some libraries do this for themselves, but some do not. Removing the URL quoting has two advantages: @@ -8073,13 +8244,18 @@ option, you can still update it by a query of this form: ${lookup pgsql,servers=master/db/name/pw {UPDATE ...} } .endd -An older syntax places the servers specification before the query, +A now-deprecated syntax places the servers specification before the query, semicolon separated: .code ${lookup mysql{servers=master; UPDATE ...} } .endd -The new version avoids potential issues with tainted -arguments in the query, for explicit expansion. +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 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. + &*Note*&: server specifications in list-style lookups are still problematic. @@ -8091,12 +8267,21 @@ An option group name for MySQL option files can be specified in square brackets; the default value is &"exim"&. The full syntax of each item in &%mysql_servers%& is: .display -<&'hostname'&>::<&'port'&>(<&'socket name'&>)[<&'option group'&>]/&&& - <&'database'&>/<&'user'&>/<&'password'&> +<&'hostspec'&><&'portspec'&>(<&'socket name'&>)[<&'option group'&>]/&&& + <&'database'&>/<&'user'&>/<&'password'&> .endd Any of the four sub-parts of the first field can be omitted. For normal use on the local host it can be left blank or set to just &"localhost"&. +.new +A &'hostspec'& can be a hostname, an IPv4 address or an IPv6 address. +For the latter, a &'portspec'& is a dot followed by a port number; +for the other two a &'portspec'& is a colon followed by a port number. +.wen + +Note that the default list-separator for the list of servers is a colon so +(unless that is changed) all colons in list items must be doubled. + No database need be supplied &-- but if it is absent here, it must be given in the queries. @@ -8107,8 +8292,15 @@ 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. +To get an encryted connection, use a Mysql option file with the required +parameters for the connection. + .subsection "Special PostgreSQL features" SECID74 +.new +The &'hostspec'& for PostgreSQL follows the same rules as for MySQL above. +.wen + PostgreSQL lookups can also use Unix domain socket connections to the database. This is usually faster and costs less CPU time than a TCP/IP connection. However it can be used only if the mail server runs on the same machine as the @@ -8135,7 +8327,7 @@ daemon as in the other SQL databases. .oindex &%sqlite_dbfile%& There are two ways of specifying the file. -The first is is by using the &%sqlite_dbfile%& main option. +The first is by using the &%sqlite_dbfile%& main option. The second, which allows separate files for each query, is to use an option appended, comma-separated, to the &"sqlite"& lookup type word. The option is the word &"file"&, then an equals, @@ -8255,7 +8447,18 @@ type of match and is given below as the &*value*& information. .section "Expansion of lists" "SECTlistexpand" .cindex "expansion" "of lists" -Each list is expanded as a single string before it is used. +.new +Each list, after any leading change-of-separator specification +(see &<>&) is expanded as a single string, +.cindex "tainted data" tracking +&*Note*&: As a result, if any component was tainted then the +entire expansion result string becomes tainted. + +Splitting out a leading explicit change-of-separator permits +one being safely used on a list that has tainted components +while still detecting the use of a tainted setting. +The latter is not permitted. +.wen &'Exception: the router headers_remove option, where list-item splitting is done before string-expansion.'& @@ -8438,6 +8641,11 @@ domainlist dom2 = !a.b : *.b where &'x.y'& does not match. It's best to avoid negation altogether in referenced lists if you can. +.new +The list item which references a named list (&"+"&) +may not be tainted. +.wen + .cindex "hiding named list values" .cindex "named lists" "hiding value of" Some named list definitions may contain sensitive data, for example, passwords for @@ -8542,6 +8750,9 @@ possible to use the same configuration file on several different hosts that differ only in their names. The value for a match will be the primary host name. +.new +The pattern may not be tainted. +.wen .next @@ -8557,6 +8768,9 @@ In today's Internet, the use of domain literals is controversial; see the &%allow_domain_literals%& main option. The value for a match will be the string &`@[]`&. +.new +The pattern may not be tainted. +.wen .next @@ -8573,6 +8787,10 @@ local host, and the second only when no primary MX target is the local host, but a secondary MX target is. &"Primary"& means an MX record with the lowest preference value &-- there may of course be more than one of them. +.new +The pattern may not be tainted. +.wen + The MX lookup that takes place when matching a pattern of this type is performed with the resolver options for widening names turned off. Thus, for example, a single-component domain will &'not'& be expanded by adding the @@ -9137,8 +9355,9 @@ is not used. &*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 -&<>&). There is, however, no reason why you could not use +addresses, you must precede the search type with &"net-"& +(see section &<>&). +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. @@ -9382,7 +9601,8 @@ example it is a named domain list. .cindex "case forcing in address lists" Domains in email addresses are always handled caselessly, but for local parts case may be significant on some systems (see &%caseful_local_part%& for how -Exim deals with this when routing addresses). However, RFC 2505 (&'Anti-Spam +Exim deals with this when routing addresses). However, +&url(https://www.rfc-editor.org/rfc/rfc2505,RFC 2505) (&'Anti-Spam Recommendations for SMTP MTAs'&) suggests that matching of addresses to blocking lists should be done in a case-independent manner. Since most address lists in Exim are used for this kind of control, Exim attempts to do this by @@ -9406,6 +9626,12 @@ lower case. However, although independent matches on the domain alone are still performed caselessly, regular expressions that match against an entire address become case-sensitive after &"+caseful"& has been seen. +.new +This string may not be tainted. +To do caseful matching on list elements whic are tainted, +place them in a named list. +.wen + .section "Local part lists" "SECTlocparlis" @@ -9423,6 +9649,12 @@ matching in the local part list, but not elsewhere in the router. If &%caseful_local_part%& is set true in a router, matching in the &%local_parts%& option is case-sensitive from the start. +.new +This string may not be tainted. +To do caseful matching on list elements whic are tainted, +place them in a named list. +.wen + If a local part list is indirected to a file (see section &<>&), comments are handled in the same way as address lists &-- they are recognized only if the # is preceded by white space or the start of the line. @@ -9451,6 +9683,9 @@ start of a portion of the string that is interpreted and replaced as described below in section &<>& onwards. Backslash is used as an escape character, as described in the following section. +.cindex "tainted data" tracking +If any porttion of the result string is tainted, the entire result is. + Whether a string is expanded depends upon the context. Usually this is solely dependent upon the option for which a value is sought; in this documentation, options for which string expansion is performed are marked with † after @@ -9523,7 +9758,6 @@ value. Nevertheless the &%-be%& option can be useful for checking out file and database lookups, and the use of expansion operators such as &%sg%&, &%substr%& and &%nhash%&. -.new When reading lines from the standard input, macros can be defined and ACL variables can be set. For example: @@ -9532,7 +9766,6 @@ MY_MACRO = foo set acl_m_myvar = bar .endd Such macros and variables can then be used in later input lines. -.wen Exim gives up its root privilege when it is called with the &%-be%& option, and instead runs under the uid and gid it was called with, to prevent users from @@ -9648,7 +9881,8 @@ Example use (as an ACL modifier): .code add_header = :at_start:${authresults {$primary_hostname}} .endd -This is safe even if no authentication results are available. +This is safe even if no authentication results are available +and would generally be placed in the DATA ACL. .vitem "&*${certextract{*&<&'field'&>&*}{*&<&'certificate'&>&*}&&& @@ -9903,11 +10137,17 @@ leading and trailing quotes are removed from the returned value. .cindex "list" "selecting by condition" .cindex "expansion" "selecting from list by condition" .vindex "&$item$&" -After expansion, <&'string'&> is interpreted as a list, colon-separated by -default, but the separator can be changed in the usual way (&<>&). -For each item -in this list, its value is place in &$item$&, and then the condition is -evaluated. If the condition is true, &$item$& is added to the output as an +.new +<&'string1'&> first has the part after any change-of-list-separator +(see &<>&) expanded, +then the whole is taken as a list. +.wen +The default separator for the list is a colon. + +For each item in this list, +its value is placed in &$item$&, and then the condition is evaluated. +Any modification of &$value$& by this evaluation is discarded. +If the condition is true, &$item$& is added to the output as an item in a new list; if the condition is false, the item is discarded. The separator used for the output list is the same as the one used for the input, but a separator setting is not included in the output. For example: @@ -9915,7 +10155,8 @@ input, but a separator setting is not included in the output. For example: ${filter{a:b:c}{!eq{$item}{b}}} .endd yields &`a:c`&. At the end of the expansion, the value of &$item$& is restored -to what it was before. See also the &%map%& and &%reduce%& expansion items. +to what it was before. +See also the &%map%& and &%reduce%& expansion items. .vitem &*${hash{*&<&'string1'&>&*}{*&<&'string2'&>&*}{*&<&'string3'&>&*}}*& @@ -10020,7 +10261,9 @@ option in the runtime configuration. The value of this option defaults to the value of HEADERS_CHARSET in &_Local/Makefile_&. The ultimate default is ISO-8859-1. -Header names follow the syntax of RFC 2822, which states that they may contain +Header names follow the syntax of +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822), +which states that they may contain any printing characters except space and colon. Consequently, curly brackets &'do not'& terminate header names, and should not be used to enclose them as if they were variables. Attempting to do so causes a syntax error. @@ -10069,7 +10312,8 @@ the result of expanding any of these variables is tainted. .cindex &%hmac%& This function uses cryptographic hashing (either MD5 or SHA-1) to convert a shared secret and some text into a message authentication code, as specified in -RFC 2104. This differs from &`${md5:secret_text...}`& or +&url(https://www.rfc-editor.org/rfc/rfc2104.RFC 2104). +This differs from &`${md5:secret_text...}`& or &`${sha1:secret_text...}`& in that the hmac step adds a signature to the cryptographic hash, allowing for authentication that is not possible with MD5 or SHA-1 alone. The hash name must expand to either &`md5`& or &`sha1`& at @@ -10165,8 +10409,12 @@ The <&'number'&> argument must consist entirely of decimal digits, apart from an optional leading minus, and leading and trailing white space (which is ignored). -After expansion, <&'string1'&> is interpreted as a list, colon-separated by -default, but the separator can be changed in the usual way (&<>&). +.new +The <&'string1'&> argument, after any leading change-of-separator +(see &<>&), +is expanded and the whole forms the list. +.wen +By default, the list separator is a colon. The first field of the list is numbered one. If the number is negative, the fields are @@ -10266,10 +10514,15 @@ ${lookup nisplus {[name=$local_part],passwd.org_dir:gcos} \ .vitem &*${map{*&<&'string1'&>&*}{*&<&'string2'&>&*}}*& .cindex "expansion" "list creation" .vindex "&$item$&" -After expansion, <&'string1'&> is interpreted as a list, colon-separated by -default, but the separator can be changed in the usual way (&<>&). -For each item -in this list, its value is place in &$item$&, and then <&'string2'&> is +.new +<&'string1'&> first has the part after any change-of-list-separator +(see &<>&) expanded, +then the whole is taken as a list. +.wen +The default separator for the list is a colon. + +For each item in this list, +its value is place in &$item$&, and then <&'string2'&> is expanded and added to the output as an item in a new list. The separator used for the output list is the same as the one used for the input, but a separator setting is not included in the output. For example: @@ -10434,6 +10687,11 @@ Defines whether or not a write-shutdown is done on the connection after sending the request. Values are &"yes"& (the default) or &"no"& (preferred, eg. by some webservers). +.next +&*sni*& +Controls the use of Server Name Identification on the connection. +Any nonempty value will be the SNI sent; TLS will be forced. + .next &*tls*& Controls the use of TLS on the connection. @@ -10484,9 +10742,15 @@ locks out the use of this expansion item in filter files. .cindex "list" "reducing to a scalar" .vindex "&$value$&" .vindex "&$item$&" -This operation reduces a list to a single, scalar string. After expansion, -<&'string1'&> is interpreted as a list, colon-separated by default, but the -separator can be changed in the usual way (&<>&). +This operation reduces a list to a single, scalar string. + +.new +<&'string1'&> first has the part after any change-of-list-separator +(see &<>&) expanded, +then the whole is taken as a list. +.wen +The default separator for the list is a colon. + Then <&'string2'&> is expanded and assigned to the &$value$& variable. After this, each item in the <&'string1'&> list is assigned to &$item$&, in turn, and <&'string3'&> is expanded for each of @@ -10506,20 +10770,32 @@ At the end of a &*reduce*& expansion, the values of &$item$& and &$value$& are restored to what they were before. See also the &%filter%& and &%map%& expansion items. +. A bit of a special-case logic error in writing an expansion; +. probably not worth including in the mainline of documentation. +. If only we had footnotes (the html output variant is the problem). +. +. .new +. &*Note*&: if an &'expansion condition'& is used in <&'string3'&> +. and that condition modifies &$value$&, +. then the string expansions dependent on the condition cannot use +. the &$value$& of the reduce iteration. +. .wen + .vitem &*$rheader_*&<&'header&~name'&>&*:*&&~or&~&*$rh_*&<&'header&~name'&>&*:*& This item inserts &"raw"& header lines. It is described with the &%header%& expansion item in section &<>& above. -.vitem "&*${run <&'options'&> {*&<&'command&~arg&~list'&>&*}{*&<&'string1'&>&*}&&& +.vitem "&*${run<&'options'&> {*&<&'command&~string'&>&*}{*&<&'string1'&>&*}&&& {*&<&'string2'&>&*}}*&" .cindex "expansion" "running a command" .cindex "&%run%& expansion item" This item runs an external command, as a subprocess. -One option is supported after the word &'run'&, comma-separated. +One option is supported after the word &'run'&, comma-separated +and without whitespace. If the option &'preexpand'& is not used, -the command string is split into individual arguments by spaces -and then each argument is expanded. +the command string before expansion is split into individual arguments by spaces +and then each argument is separately expanded. Then the command is run in a separate process, but under the same uid and gid. As in other command executions from Exim, a shell is not used by default. If the command requires @@ -10531,9 +10807,9 @@ potential attacker; a careful assessment for security vulnerabilities should be done. If the option &'preexpand'& is used, -the command and its arguments are first expanded as one string. The result is -split apart into individual arguments by spaces, and then the command is run -as above. +the command string is first expanded as a whole. +The expansion result is split apart into individual arguments by spaces, +and then the command is run as above. Since the arguments are split by spaces, when there is a variable expansion which has an empty result, it will cause the situation that the argument will simply be omitted when the program is actually executed by Exim. If the @@ -10575,6 +10851,7 @@ shell must be invoked directly, such as with: .code ${run{/bin/bash -c "/usr/bin/id >/tmp/id"}{yes}{yes}} .endd +Note that &$value$& will not persist beyond the reception of a single message. .vindex "&$runrc$&" The return code from the command is put in the variable &$runrc$&, and this @@ -10630,8 +10907,13 @@ rather than any Unicode-aware character handling. .cindex sorting "a list" .cindex list sorting .cindex expansion "list sorting" -After expansion, <&'string'&> is interpreted as a list, colon-separated by -default, but the separator can be changed in the usual way (&<>&). +.new +<&'string'&> first has the part after any change-of-list-separator +(see &<>&) expanded, +then the whole is taken as a list. +.wen +The default separator for the list is a colon. + The <&'comparator'&> argument is interpreted as the operator of a two-argument expansion condition. The numeric operators plus ge, gt, le, lt (and ~i variants) are supported. @@ -10658,7 +10940,7 @@ will sort an MX lookup into priority order. .vitem &*${srs_encode&~{*&<&'secret'&>&*}{*&<&'return&~path'&>&*}{*&<&'original&~domain'&>&*}}*& -SRS encoding. See SECT &<>& for details. +SRS encoding. See section &<>& for details. @@ -10753,7 +11035,9 @@ following operations can be performed: .vitem &*${address:*&<&'string'&>&*}*& .cindex "expansion" "RFC 2822 address handling" .cindex "&%address%& expansion item" -The string is interpreted as an RFC 2822 address, as it might appear in a +The string is interpreted as an +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +address, as it might appear in a header line, and the effective address is extracted from it. If the string does not parse successfully, the result is empty. @@ -10763,8 +11047,9 @@ The parsing correctly handles SMTPUTF8 Unicode in the string. .vitem &*${addresses:*&<&'string'&>&*}*& .cindex "expansion" "RFC 2822 address handling" .cindex "&%addresses%& expansion item" -The string (after expansion) is interpreted as a list of addresses in RFC -2822 format, such as can be found in a &'To:'& or &'Cc:'& header line. The +The string (after expansion) is interpreted as a list of addresses in +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +format, such as can be found in a &'To:'& or &'Cc:'& header line. The operative address (&'local-part@domain'&) is extracted from each item, and the result of the expansion is a colon-separated list, with appropriate doubling of colons should any happen to be present in the email addresses. @@ -10867,8 +11152,10 @@ This operator converts a base64-encoded string into the un-coded form. .vitem &*${domain:*&<&'string'&>&*}*& .cindex "domain" "extraction" .cindex "expansion" "domain extraction" -The string is interpreted as an RFC 2822 address and the domain is extracted -from it. If the string does not parse successfully, the result is empty. +The string is interpreted as an +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +address and the domain is extracted from it. +If the string does not parse successfully, the result is empty. .vitem &*${escape:*&<&'string'&>&*}*& @@ -10997,6 +11284,22 @@ abbreviation &%h%& can be used when &%hash%& is used as an operator. +.vitem &*${headerwrap_*&<&'cols'&>&*_*&<&'limit'&>&*:*&<&'string'&>&*}*& +.cindex header "wrapping operator" +.cindex expansion "header wrapping" +This operator line-wraps its argument in a way useful for headers. +The &'cols'& value gives the column number to wrap after, +the &'limit'& gives a limit number of result characters to truncate at. +Either just the &'limit'& and the preceding underbar, or both, can be omitted; +the defaults are 80 and 998. +Wrapping will be inserted at a space if possible before the +column number is reached. +Whitespace at a chosen wrap point is removed. +A line-wrap consists of a newline followed by a tab, +and the tab is counted as 8 columns. + + + .vitem &*${hex2b64:*&<&'hexstring'&>&*}*& .cindex "base64 encoding" "conversion from hex" .cindex "expansion" "hex to base64" @@ -11066,7 +11369,8 @@ All measurement is done in bytes and is not UTF-8 aware. .cindex "list" "item count" .cindex "list" "count of items" .cindex "&%listcount%& expansion item" -The string is interpreted as a list and the number of items is returned. +The part of the string after any leading change-of-separator is expanded, +then the whole is interpreted as a list and the number of items is returned. .vitem &*${listnamed:*&<&'name'&>&*}*&&~and&~&*${listnamed_*&<&'type'&>&*:*&<&'name'&>&*}*& @@ -11085,9 +11389,10 @@ nor expansion of lookup elements, is done by the &%listnamed%& operator. .vitem &*${local_part:*&<&'string'&>&*}*& .cindex "expansion" "local part extraction" .cindex "&%local_part%& expansion item" -The string is interpreted as an RFC 2822 address and the local part is -extracted from it. If the string does not parse successfully, the result is -empty. +The string is interpreted as an +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +address and the local part is extracted from it. +If the string does not parse successfully, the result is empty. The parsing correctly handles SMTPUTF8 Unicode in the string. @@ -11173,8 +11478,10 @@ variable or a message header. .vitem &*${quote_local_part:*&<&'string'&>&*}*& .cindex "&%quote_local_part%& expansion item" This operator is like &%quote%&, except that it quotes the string only if -required to do so by the rules of RFC 2822 for quoting local parts. For -example, a plus sign would not cause quoting (but it would for &%quote%&). +required to do so by the rules of +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +for quoting local parts. For example, +a plus sign would not cause quoting (but it would for &%quote%&). If you are creating a new email address from the contents of &$local_part$& (or any other unknown data), you should always use this operator. @@ -11233,7 +11540,8 @@ f.7.2.0.0.0.0.c.d.c.b.a.1.0.0.0.9.0.0.0.2.4.c.0.8.b.d.0.1.0.0.2 .cindex "expansion" "RFC 2047" .cindex "RFC 2047" "expansion operator" .cindex "&%rfc2047%& expansion item" -This operator encodes text according to the rules of RFC 2047. This is an +This operator encodes text according to the rules of +&url(https://www.rfc-editor.org/rfc/rfc2047,RFC 2047). This is an encoding that is used in header lines to encode non-ASCII characters. It is assumed that the input string is in the encoding specified by the &%headers_charset%& option, which gets its default at build time. If the string @@ -11251,7 +11559,9 @@ characters. .cindex "expansion" "RFC 2047" .cindex "RFC 2047" "decoding" .cindex "&%rfc2047d%& expansion item" -This operator decodes strings that are encoded as per RFC 2047. Binary zero +This operator decodes strings that are encoded as per +&url(https://www.rfc-editor.org/rfc/rfc2047,RFC 2047). +Binary zero bytes are replaced by question marks. Characters are converted into the character set defined by &%headers_charset%&. Overlong RFC 2047 &"words"& are not recognized unless &%check_rfc2047_length%& is set false. @@ -11430,6 +11740,18 @@ 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 &<>&. + + +.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 +&url(https://www.rfc-editor.org/rfc/rfc3461,RFC 3461) section 4). + + + .endlist @@ -11669,9 +11991,14 @@ attempt. It is false during any subsequent delivery attempts. .cindex "expansion" "&*forall*& condition" .cindex "expansion" "&*forany*& condition" .vindex "&$item$&" -These conditions iterate over a list. The first argument is expanded to form -the list. By default, the list separator is a colon, but it can be changed by -the normal method (&<>&). +These conditions iterate over a list. +.new +The first argument, after any leading change-of-separator +(see &<>&), +is expanded and the whole forms the list. +.wen +By default, the list separator is a colon. + The second argument is interpreted as a condition that is to be applied to each item in the list in turn. During the interpretation of the condition, the current list item is placed in a variable called &$item$&. @@ -11686,10 +12013,11 @@ all items in the list, the overall condition is true. .endlist Note that negation of &*forany*& means that the condition must be false for all items for the overall condition to succeed, and negation of &*forall*& means -that the condition must be false for at least one item. In this example, the -list separator is changed to a comma: +that the condition must be false for at least one item. + +Example: .code -${if forany{<, $recipients}{match{$item}{^user3@}}{yes}{no}} +${if forany{$recipients_list}{match{$item}{^user3@}}{yes}{no}} .endd The value of &$item$& is saved and restored while &%forany%& or &%forall%& is being processed, to enable these expansion items to be nested. @@ -11743,13 +12071,18 @@ Case and collation order are defined per the system C locale. SRS decode. See SECT &<>& for details. -.vitem &*inlist&~{*&<&'string1'&>&*}{*&<&'string2'&>&*}*& &&& - &*inlisti&~{*&<&'string1'&>&*}{*&<&'string2'&>&*}*& +.vitem &*inlist&~{*&<&'subject'&>&*}{*&<&'list'&>&*}*& &&& + &*inlisti&~{*&<&'subject'&>&*}{*&<&'list'&>&*}*& .cindex "string" "comparison" .cindex "list" "iterative conditions" -Both strings are expanded; the second string is treated as a list of simple -strings; if the first string is a member of the second, then the condition -is true. +The <&'subject'&> string is expanded. +.new +The <&'list'&> first has any change-of-list-separator ++(see &<>&) retained verbatim, ++then the remainder is expanded. ++.wen +The whole is treated as a list of simple strings; +if the subject string is a member of that list, then the condition is true. For the case-independent &%inlisti%& condition, case is defined per the system C locale. These are simpler to use versions of the more powerful &*forany*& condition. @@ -11918,7 +12251,8 @@ where the first item in the list is the empty string. .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 &<>&), 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 @@ -11941,9 +12275,17 @@ just as easy to use the fact that a lookup is itself a condition, and write: Note that <&'string2'&> is not itself subject to string expansion, unless Exim was built with the EXPAND_LISTMATCH_RHS option. +.new +For the latter case, only the part after any leading +change-of-separator specification is expanded. +.wen Consult section &<>& for further details of these patterns. +The variable &$value$& will be set for a successful match and can be +used in the success clause of an &%if%& expansion item using the condition. +Any previous &$value$& is restored after the if. + .vitem &*match_local_part&~{*&<&'string1'&>&*}{*&<&'string2'&>&*}*& .cindex "domain list" "in expansion condition" .cindex "address list" "in expansion condition" @@ -11965,9 +12307,10 @@ ${if match_domain{$domain}{+local_domains}{... .endd .cindex "&`+caseful`&" For address lists, the matching starts off caselessly, but the &`+caseful`& -item can be used, as in all address lists, to cause subsequent items to -have their local parts matched casefully. Domains are always matched -caselessly. +item can be used, as in all address lists, to cause subsequent items +(including those of referenced named lists) +to have their local parts matched casefully. +Domains are always matched caselessly. The variable &$value$& will be set for a successful match and can be used in the success clause of an &%if%& expansion item using the condition. @@ -11982,6 +12325,10 @@ Any previous &$value$& is restored after the if. Note that <&'string2'&> is not itself subject to string expansion, unless Exim was built with the EXPAND_LISTMATCH_RHS option. +.new +For the latter case, only the part after any leading +change-of-separator specification is expanded. +.wen &*Note*&: Host lists are &'not'& supported in this way. This is because hosts have two identities: a name and an IP address, and it is not clear @@ -12072,7 +12419,9 @@ initiated by queue runner processes, and false otherwise. .cindex "Radius" .cindex "expansion" "Radius authentication" .cindex "&%radius%& expansion condition" -Radius authentication (RFC 2865) is supported in a similar way to PAM. You must +Radius authentication +(&url(https://www.rfc-editor.org/rfc/rfc2865,RFC 2865)) +is supported in a similar way to PAM. You must set RADIUS_CONFIG_FILE in &_Local/Makefile_& to specify the location of the Radius client configuration file in order to build Exim with Radius support. @@ -12289,6 +12638,20 @@ to the relevant file. When, as a result of aliasing or forwarding, a message is directed to a pipe, this variable holds the pipe command when the transport is running. +.new +.vitem &$atrn_host$& +.vindex ATRN "data for routing" +When an ATRN command is accepted, this variable is filled in with the client +IP and port, for use in a manualroute router. + +.vitem &$atrn_mode$& +.vindex ATRN mode +.vindex ODMR mode +When in provider mode this variable will contain &"P"&. +When in customer mode it will contain &"C"&. +Otherwise, it will be empty. +.wen + .vitem "&$auth1$& &-- &$auth4$&" .vindex "&$auth1$&, &$auth2$&, etc" These variables are used in SMTP authenticators (see chapters @@ -12426,6 +12789,11 @@ contain the trailing slash. If &$config_file$& does not contain a slash, .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 &<>&. @@ -12458,7 +12826,9 @@ When a message has been received this variable contains a colon-separated list of signer domains and identities for the message. For details see section &<>&. -.vitem &$dmarc_domain_policy$& &&& +.vitem &$dmarc_alignment_spf$& &&& + &$dmarc_alignment_dkim$& &&& + &$dmarc_domain_policy$& &&& &$dmarc_status$& &&& &$dmarc_status_text$& &&& &$dmarc_used_domains$& @@ -13288,10 +13658,18 @@ The main use of this variable is expected to be to distinguish between rejections of MAIL and rejections of RCPT. .tvar &$recipients$& -This variable contains a list of envelope recipients for a message. A comma and -a space separate the addresses in the replacement text. However, the variable -is not generally available, to prevent exposure of Bcc recipients in -unprivileged users' filter files. You can use &$recipients$& only in these +.tvar &$recipients_list$& +These variables both contain the envelope recipients for a message. + +The first uses a comma and a space separate the addresses in the replacement text. +&*Note*&: an address can legitimately contain a comma; +this variable is not intended for further processing. + +The second is a proper Exim list; colon-separated. + +However, the variables +are not generally available, to prevent exposure of Bcc recipients in +unprivileged users' filter files. You can use either of them only in these cases: .olist @@ -13355,7 +13733,8 @@ This is an obsolete name for &$bounce_return_size_limit$&. .cindex "router" "name" .cindex "name" "of router" .vindex "&$router_name$&" -During the running of a router this variable contains its name. +During the running of a router, or a transport called, +this variable contains the router name. .vitem &$runrc$& .cindex "return code" "from &%run%& expansion" @@ -13646,6 +14025,11 @@ there actually are, because many other connections may come and go while a single connection is being processed. When a child process terminates, the daemon decrements its copy of the variable. +.vitem &$smtp_notquit_reason$& +.vindex "&$smtp_notquit_reason$&" +When the not-QUIT ACL is running, this variable is set to a string +that indicates the reason for the termination of the SMTP connection. + .vitem "&$sn0$& &-- &$sn9$&" These variables are copies of the values of the &$n0$& &-- &$n9$& accumulators that were current at the end of the system filter file. This allows a system @@ -14304,7 +14688,7 @@ The common use of this option is expected to be .code tls_on_connect_ports = 465 .endd -per RFC 8314. +per &url(https://www.rfc-editor.org/rfc/rfc8314,RFC 8314). There is also a command line option &%-tls-on-connect%&, which forces all ports to behave in this way when a daemon is started. @@ -14644,6 +15028,7 @@ listed in more than one group. .row &%acl_not_smtp%& "ACL for non-SMTP messages" .row &%acl_not_smtp_mime%& "ACL for non-SMTP MIME parts" .row &%acl_not_smtp_start%& "ACL for start of non-SMTP message" +.row &%acl_smtp_atrn%& "ACL for ATRN" .row &%acl_smtp_auth%& "ACL for AUTH" .row &%acl_smtp_connect%& "ACL for connection" .row &%acl_smtp_data%& "ACL for DATA" @@ -14661,6 +15046,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_wellknown%& "ACL for WELLKNOWN" .row &%av_scanner%& "specify virus scanner" .row &%check_rfc2047_length%& "check length of RFC 2047 &""encoded &&& words""&" @@ -14821,11 +15207,13 @@ See also the &'Policy controls'& section above. .row &%dsn_advertise_hosts%& "advertise DSN extensions to these hosts" .row &%ignore_fromline_hosts%& "allow &""From ""& from these hosts" .row &%ignore_fromline_local%& "allow &""From ""& from local SMTP" +.row &%limits_advertise_hosts%& "advertise LIMITS to these hosts" .row &%pipelining_advertise_hosts%& "advertise pipelining to these hosts" .row &%pipelining_connect_advertise_hosts%& "advertise pipelining 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 @@ -14949,7 +15337,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 -read and is on the point of being accepted. See chapter &<>& for +read and is on the point of being accepted. See section &<>& for further details. .option acl_not_smtp_mime main string&!! unset @@ -14961,24 +15349,40 @@ 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 -non-SMTP message. See chapter &<>& for further details. +non-SMTP message. See section &<>& for further details. + +.new +.option acl_smtp_atrn main string&!! unset +.cindex ATRN "ACL for" +.cindex ATRN advertisement +.cindex "ESMTP extensions" ATRN +.cindex ODMR provider +This option defines the ACL that is run when an SMTP ATRN command is +received. +If no value is set, or the result after expansion is an empty string, +then the ATRN facility is not advertised. +See chapter &<>& for general information on ACLs, +and section &<>& for description of ATRN. +.wen .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 &<>& for further details. +received. +See chapter &<>& for general information on ACLs, and chapter +&<>& 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 &<>& for further details. +See section &<>& 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 &<>& for further details. +acknowledgment is sent. See section &<>& for further details. .option acl_smtp_data_prdr main string&!! accept .cindex "PRDR" "ACL for" @@ -14989,7 +15393,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 -acknowledgment is sent. See chapter &<>& for further details. +acknowledgment is sent. See section &<>& for further details. .option acl_smtp_dkim main string&!! unset .cindex DKIM "ACL for" @@ -15000,8 +15404,12 @@ See section &<>& for further details. .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 &<>& for further details. +received. +If no value is set then the ETRN facility is not advertised. +See chapter &<>& for general information on ACLs, +and section &<>& for description of ETRN. .option acl_smtp_expn main string&!! unset .cindex "EXPN" "ACL for" @@ -15012,7 +15420,7 @@ received. See chapter &<>& 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 -command is received. See chapter &<>& for further details. +command is received. See section &<>& for further details. .option acl_smtp_mail main string&!! unset @@ -15023,7 +15431,8 @@ received. See chapter &<>& 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 -a MAIL command. See chapter &<>& for details of ACLs, and chapter +a MAIL command. +See chapter &<>& for general information on ACLs, and chapter &<>& for details of authentication. .option acl_smtp_mime main string&!! unset @@ -15036,7 +15445,7 @@ section &<>& 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. -See chapter &<>& for further details. +See section &<>& for further details. .option acl_smtp_predata main string&!! unset This option defines the ACL that is run when an SMTP DATA command is @@ -15051,7 +15460,7 @@ received. See chapter &<>& 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 -received. See chapter &<>& for further details. +received. See section &<>& for further details. .option acl_smtp_starttls main string&!! unset .cindex "STARTTLS, ACL for" @@ -15063,6 +15472,11 @@ received. See chapter &<>& for further details. This option defines the ACL that is run when an SMTP VRFY command is received. See chapter &<>& 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 &<>& for further details. + .option add_environment main "string list" empty .cindex "environment" "set values" This option adds individual environment variables that the @@ -15083,7 +15497,9 @@ To permit this, you have to add individuals to the Exim group. .option allow_domain_literals main boolean false .cindex "domain literal" -If this option is set, the RFC 2822 domain literal format is permitted in +If this option is set, the +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +domain literal format is permitted in email addresses. The option is not set by default, because the domain literal format is not normally required these days, and few people know about it. It has, however, been exploited by mail abusers. @@ -15322,17 +15738,15 @@ $primary_hostname-$tod_epoch-testing See section &<>& for details of how this value is used. -.option check_log_inodes main integer 100 -See &%check_spool_space%& below. - - -.option check_log_space main integer 10M +.options check_log_inodes main integer 100 &&& + check_log_space main integer 10M See &%check_spool_space%& below. .oindex "&%check_rfc2047_length%&" .cindex "RFC 2047" "disabling length check" .option check_rfc2047_length main boolean true -RFC 2047 defines a way of encoding non-ASCII characters in headers using a +&url(https://www.rfc-editor.org/rfc/rfc2047,RFC 2047) +defines a way of encoding non-ASCII characters in headers using a system of &"encoded words"&. The RFC specifies a maximum length for an encoded word; strings to be encoded that exceed this length are supposed to use multiple encoded words. By default, Exim does not recognize encoded words that @@ -15341,11 +15755,8 @@ of the RFC, generates overlong encoded words. If &%check_rfc2047_length%& is set false, Exim recognizes encoded words of any length. -.option check_spool_inodes main integer 100 -See &%check_spool_space%& below. - - -.option check_spool_space main integer 10M +.options check_spool_inodes main integer 100 &&& + check_spool_space main integer 10M .cindex "checking disk space" .cindex "disk space, checking" .cindex "spool directory" "checking space" @@ -15400,8 +15811,9 @@ may wish to deliberately disable them. .cindex CHUNKING advertisement .cindex "RFC 3030" "CHUNKING" .cindex "ESMTP extensions" CHUNKING -The CHUNKING extension (RFC3030) will be advertised in the EHLO message to -these hosts. +The CHUNKING extension +(&url(https://www.rfc-editor.org/rfc/rfc3030.html,RFC 3030)) +will be advertised in the EHLO message to these hosts. Hosts may use the BDAT command as an alternate to DATA. .option commandline_checks_require_admin main boolean &`false`& @@ -15424,17 +15836,15 @@ This option specifies one or more default SMTP ports on which the Exim daemon listens. See chapter &<>& for details of how it is used. For backward compatibility, &%daemon_smtp_port%& (singular) is a synonym. -.option daemon_startup_retries main integer 9 +.options daemon_startup_retries main integer 9 &&& + daemon_startup_sleep main time 30s .cindex "daemon startup, retrying" -This option, along with &%daemon_startup_sleep%&, controls the retrying done by +These options control the retrying done by the daemon at startup when it cannot immediately bind a listening socket (typically because the socket is already in use): &%daemon_startup_retries%& defines the number of retries after the first failure, and &%daemon_startup_sleep%& defines the length of time to wait between retries. -.option daemon_startup_sleep main time 30s -See &%daemon_startup_retries%&. - .option delay_warning main "time list" 24h .cindex "warning of delay" .cindex "delay warning, specifying" @@ -15549,7 +15959,8 @@ sha256 sha512 .endd -Note that the acceptance of sha1 violates RFC 8301. +Note that the acceptance of sha1 violates +&url(https://www.rfc-editor.org/rfc/rfc8301,RFC 8301). .option dkim_verify_keytypes main "string list" "ed25519 : rsa" This option gives a list of key types which are acceptable in signatures, @@ -15562,7 +15973,9 @@ This option gives a list of key sizes which are acceptable in signatures. The list is keyed by the algorithm type for the key; the values are in bits. Signatures with keys smaller than given by this option will fail verification. -The default enforces the RFC 8301 minimum key size for RSA signatures. +The default enforces the +&url(https://www.rfc-editor.org/rfc/rfc8301,RFC 8301) +minimum key size for RSA signatures. .option dkim_verify_minimal main boolean false If set to true, verification of signatures will terminate after the @@ -15576,9 +15989,9 @@ the ACL once for each signature in the message. See section &<>&. -.option dmarc_forensic_sender main string&!! unset -.option dmarc_history_file main string unset -.option 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 &<>& for details. @@ -15597,7 +16010,10 @@ by a setting such as this: .code dns_again_means_nonexist = *.in-addr.arpa .endd -This option applies to all DNS lookups that Exim does. It also applies when the +This option applies to all DNS lookups that Exim does, +except for TLSA lookups (where knowing about such failures +is security-relevant). +It also applies when the &[gethostbyname()]& or &[getipnodebyname()]& functions give temporary errors, since these are most likely to be caused by DNS lookup problems. The &(dnslookup)& router has some options of its own for controlling what happens @@ -15754,7 +16170,8 @@ described in section &<>&. .cindex "DSN" "success" .cindex "Delivery Status Notification" "success" .cindex "ESMTP extensions" DSN -DSN extensions (RFC3461) will be advertised in the EHLO message to, +DSN extensions (&url(https://www.rfc-editor.org/rfc/rfc3461,RFC 3461)) +will be advertised in the EHLO message to, and accepted from, these hosts. Hosts may use the NOTIFY and ORCPT options on RCPT TO commands, and RET and ENVID options on MAIL FROM commands. @@ -15834,7 +16251,8 @@ and warning messages. For example: .code errors_reply_to = postmaster@my.domain.example .endd -The value of the option is not expanded. It must specify a valid RFC 2822 +The value of the option is not expanded. It must specify a valid +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) address. However, if a warning message that is generated by the &%quota_warn_message%& option in an &(appendfile)& transport contain its own &'Reply-To:'& header line, the value of the &%errors_reply_to%& option is @@ -15901,9 +16319,11 @@ routing, but which are not used for listening by the daemon. See section . 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" @@ -15937,6 +16357,7 @@ search the file multiple times for non-existent users, and also cause delay. .option freeze_tell main "string list, comma separated" unset .cindex "freezing messages" "sending a message when freezing" +.cindex "frozen messages" "sending a message when freezing" On encountering certain errors, or when configured to do so in a system filter, ACL, or special router, Exim freezes a message. This means that no further delivery attempts take place until an administrator thaws the message, or the @@ -15952,7 +16373,8 @@ log. If you configure freezing in a filter or ACL, you must arrange for any logging that you require. -.option gecos_name main string&!! unset +.options gecos_name main string&!! unset &&& + gecos_pattern main string unset .cindex "HP-UX" .cindex "&""gecos""& field, parsing" Some operating systems, notably HP-UX, use the &"gecos"& field in the system @@ -15977,9 +16399,6 @@ gecos_pattern = ([^,]*) gecos_name = $1 .endd -.option gecos_pattern main string unset -See &%gecos_name%& above. - .option gnutls_compat_mode main boolean unset This option controls whether GnuTLS is used in compatibility mode in an Exim @@ -16043,11 +16462,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 -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. @@ -16177,6 +16598,9 @@ This option is obsolete, and retained only for backward compatibility, because nowadays the ACL specified by &%acl_smtp_connect%& can also reject incoming connections immediately. +If the connection is on a TLS-on-connect port then the TCP connection is +just dropped. Otherwise, an SMTP error is sent first. + The ability to give an immediate rejection (either by this option or using an ACL) is provided for use in unusual cases. Many hosts will just try again, sometimes without much delay. Normally, it is better to use an ACL to reject @@ -16196,10 +16620,8 @@ local processes, you must create a host list with an empty item. For example: .code hosts_connection_nolog = : .endd -.new The hosts affected by this option also do not log "no MAIL in SMTP connection" lines, as may commonly be produced by a monitoring system. -.wen .option hosts_require_alpn main "host list&!!" unset @@ -16278,7 +16700,8 @@ dealing with other kinds of frozen message, see &%auto_thaw%& and &%timeout_frozen_after%&. -.option ignore_fromline_hosts main "host list&!!" unset +.options ignore_fromline_hosts main "host list&!!" unset &&& + ignore_fromline_local main boolean false .cindex "&""From""& line" .cindex "UUCP" "&""From""& line" Some broken SMTP clients insist on sending a UUCP-like &"From&~"& line before @@ -16290,8 +16713,6 @@ process rather than a remote host, and is using &%-bs%& to inject the messages, &%ignore_fromline_local%& must be set to achieve this effect. -.option ignore_fromline_local main boolean false -See &%ignore_fromline_hosts%& above. .option keep_environment main "string list" unset .cindex "environment" "values from" @@ -16411,6 +16832,17 @@ has been built with LDAP support. +.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 (&url(https://www.ietf.org/rfc/rfc9422.html,RFC 9422)) +to specific hosts. +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. + .option local_from_check main boolean true .cindex "&'Sender:'& header line" "disabling addition of" .cindex "&'From:'& header line" "disabling checking of" @@ -16446,7 +16878,8 @@ has more details about &'Sender:'& processing. -.option local_from_prefix main string unset +.options local_from_prefix main string unset &&& + local_from_suffix main string unset When Exim checks the &'From:'& header line of locally submitted messages for matching the login id (see &%local_from_check%& above), it can be configured to ignore certain prefixes and suffixes in the local part of the address. This is @@ -16466,10 +16899,6 @@ matches the actual sender address that is constructed from the login name and qualify domain. -.option local_from_suffix main string unset -See &%local_from_prefix%& above. - - .option local_interfaces main "string list" "see below" This option controls which network interfaces are used by the daemon for listening; they are also used to identify the local host when routing. Chapter @@ -16511,15 +16940,21 @@ See also the ACL modifier &`control = suppress_local_fixups`&. Section .option localhost_number main string&!! unset .cindex "host" "locally unique number for" .cindex "message ids" "with multiple hosts" +.cindex multiple "systems sharing a spool" +.cindex "multiple hosts" "sharing a spool" +.cindex "shared spool directory" +.cindex "spool directory" sharing .vindex "&$localhost_number$&" Exim's message ids are normally unique only within the local host. If -uniqueness among a set of hosts is required, each host must set a different +uniqueness among a set of hosts is required +(eg. because they share a spool directory), +each host must set a different value for the &%localhost_number%& option. The string is expanded immediately after reading the configuration file (so that a number can be computed from the host name, for example) and the result of the expansion must be a number in the range 0&--16 (or 0&--10 on operating systems with case-insensitive file systems). This is available in subsequent string expansions via the variable -&$localhost_number$&. When &%localhost_number is set%&, the final two +&$localhost_number$&. When &%localhost_number%& is set, the final four characters of the message id, instead of just being a fractional part of the time, are computed from the time and the local host number as described in section &<>&. @@ -16633,8 +17068,9 @@ empty string, the option is ignored. .option message_id_header_text main string&!! unset If this variable is set, the string is expanded and used to augment the text of the &'Message-id:'& header that Exim creates if a locally-originated incoming -message does not have one. The text of this header is required by RFC 2822 to -take the form of an address. By default, Exim uses its internal message id as +message does not have one. The text of this header is required by +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +to take the form of an address. By default, Exim uses its internal message id as the local part, and the primary host name as the domain. If this option is set, it is expanded, and provided the expansion is not forced to fail, and does not yield an empty string, the result is inserted into the header immediately @@ -16875,7 +17311,6 @@ to be used in conjunction with &(oracle)& lookups (see section &<>&). The option is available only if Exim has been built with Oracle support. -.new .option panic_coredump main boolean false This option is rarely needed but can help for some debugging investigations. If set, when an internal error is detected by Exim which is sufficient @@ -16886,7 +17321,6 @@ then a coredump is requested. Note that most systems require additional administrative configuration to permit write a core file for a setuid program, which is Exim's common installed configuration. -.wen .option percent_hack_domains main "domain list&!!" unset .cindex "&""percent hack""&" @@ -16895,7 +17329,9 @@ common installed configuration. The &"percent hack"& is the convention whereby a local part containing a percent sign is re-interpreted as a new email address, with the percent replaced by @. This is sometimes called &"source routing"&, though that term is -also applied to RFC 2822 addresses that begin with an @ character. If this +also applied to +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +addresses that begin with an @ character. If this option is set, Exim implements the percent facility for those domains listed, but no others. This happens before an incoming SMTP address is tested against an ACL. @@ -16909,16 +17345,11 @@ a good idea to reject recipient addresses with percent characters in their local parts. Exim's default configuration does this. -.option perl_at_start main boolean false -.cindex "Perl" -This option is available only when Exim is built with an embedded Perl -interpreter. See chapter &<>& for details of its use. - - -.option perl_startup main string unset +.options perl_at_start main boolean false &&& + perl_startup main string unset .cindex "Perl" -This option is available only when Exim is built with an embedded Perl -interpreter. See chapter &<>& for details of its use. +These options are available only when Exim is built with an embedded Perl +interpreter. See chapter &<>& for details of their use. .option perl_taintmode main boolean false .cindex "Perl" @@ -16974,7 +17405,7 @@ See also the &%hosts_pipe_connect%& smtp transport option. 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. @@ -17028,7 +17459,8 @@ is set, code values of 128 and above are also considered to be printing characters. This option also affects the header syntax checks performed by the -&(autoreply)& transport, and whether Exim uses RFC 2047 encoding of +&(autoreply)& transport, and whether Exim uses +&url(https://www.rfc-editor.org/rfc/rfc2047,RFC 2047) encoding of the user's full name when constructing From: and Sender: addresses (as described in section &<>&). Setting this option can cause Exim to generate eight bit message headers that do not conform to the @@ -17130,7 +17562,7 @@ and &%-odi%& command line options override &%queue_only%& unless &%queue_only_load%&, and &%smtp_accept_queue%&. -.option queue_only_file main string unset +.option queue_only_file main "string list" unset .cindex "queueing incoming messages" .cindex "message" "queueing by file existence" This option can be set to a colon-separated list of absolute path names, each @@ -17254,8 +17686,9 @@ added to each message, except for the timestamp, which is automatically added on at the end (preceded by a semicolon). The string is expanded each time it is used. If the expansion yields an empty string, no &'Received:'& header line is added to the message. Otherwise, the string should start with the text -&"Received:"& and conform to the RFC 2822 specification for &'Received:'& -header lines. +&"Received:"& and conform to the +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +specification for &'Received:'& header lines. The default setting is: .code @@ -17318,16 +17751,24 @@ or if the message was submitted locally (not using TCP/IP), and the &%-bnq%& option was not set. -.option recipients_max main integer 50000 +.option recipients_max main integer&!! 50000 .cindex "limit" "number of recipients" .cindex "recipient" "maximum number" -If this option is set greater than zero, it specifies the maximum number of +If the value resulting from expanding this option +is set greater than zero, it specifies the maximum number of original recipients for any message. Additional recipients that are generated by aliasing or forwarding do not count. SMTP messages get a 452 response for 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. +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. + .cindex "RCPT" "maximum number of incoming" &*Note*&: The RFCs specify that an SMTP server should accept at least 100 RCPT commands in a single message. @@ -17416,7 +17857,8 @@ the default value. .option return_path_remove main boolean true .cindex "&'Return-path:'& header line" "removing" -RFC 2821, section 4.4, states that an SMTP server must insert a +&url(https://www.rfc-editor.org/rfc/rfc2821,RFC 2821), section 4.4, +states that an SMTP server must insert a &'Return-path:'& header line into a message when it makes a &"final delivery"&. The &'Return-path:'& header preserves the sender address as received in the MAIL command. This description implies that this header should not be present @@ -17433,7 +17875,8 @@ This option is an obsolete synonym for &%bounce_return_size_limit%&. .option rfc1413_hosts main "host list&!!" @[] .cindex "RFC 1413" .cindex "host" "for RFC 1413 calls" -RFC 1413 identification calls are made to any client host which matches +&url(https://www.rfc-editor.org/rfc/rfc1413,RFC 1413) +identification calls are made to any client host which matches an item in the list. The default value specifies just this host, being any local interface for the system. @@ -17441,7 +17884,9 @@ for the system. .option rfc1413_query_timeout main time 0s .cindex "RFC 1413" "query timeout" .cindex "timeout" "for RFC 1413 call" -This sets the timeout on RFC 1413 identification calls. If it is set to zero, +This sets the timeout on +&url(https://www.rfc-editor.org/rfc/rfc1413,RFC 1413) +identification calls. If it is set to zero, no RFC 1413 calls are ever made. @@ -17534,8 +17979,7 @@ live with. . 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 @@ -17589,8 +18033,7 @@ various &%-od%&&'x'& command line options. . 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 @@ -17667,13 +18110,16 @@ This facility is only available on Linux. .cindex "banner for SMTP" .cindex "welcome banner for SMTP" .cindex "customizing" "SMTP banner" -This string, which is expanded every time it is used, is output as the initial +If a connect ACL does not supply a message, +this string (which is expanded every time it is used) is output as the initial positive response to an SMTP connection. The default setting is: .code smtp_banner = $smtp_active_hostname ESMTP Exim \ $version_number $tod_full .endd -Failure to expand the string causes a panic error. If you want to create a +Failure to expand the string causes a panic error; +a forced fail just closes the connection. +If you want to create a multiline response to the initial SMTP connection, use &"\n"& in the string at appropriate points, but not at the end. Note that the 220 code is not included in this string. Exim adds it automatically (several times in the case of a @@ -17729,7 +18175,7 @@ hosts), you can do so by an appropriate use of a &%control%& modifier in an ACL .option smtp_etrn_command main string&!! unset -.cindex "ETRN" "command to be run" +.cindex ETRN "command to be run" .cindex "ESMTP extensions" ETRN .vindex "&$domain$&" If this option is set, the given command is run whenever an SMTP ETRN @@ -17756,7 +18202,7 @@ the command. .option smtp_etrn_serialize main boolean true -.cindex "ETRN" "serializing" +.cindex ETRN serializing When this option is set, it prevents the simultaneous execution of more than one identical command as a result of ETRN in an SMTP connection. See section &<>& for details. @@ -17808,7 +18254,9 @@ non-SMTP command lines are sent first. -.option smtp_ratelimit_hosts main "host list&!!" unset +.options smtp_ratelimit_hosts main "host list&!!" unset &&& + smtp_ratelimit_mail main string unset &&& + smtp_ratelimit_rcpt main string unset .cindex "SMTP" "rate limiting" .cindex "limit" "rate of message arrival" .cindex "RCPT" "rate limiting" @@ -17851,13 +18299,6 @@ seconds, increasing by a factor of 1.05 each time. The second setting applies delays to RCPT commands when more than four occur in a single message. -.option smtp_ratelimit_mail main string unset -See &%smtp_ratelimit_hosts%& above. - - -.option smtp_ratelimit_rcpt main string unset -See &%smtp_ratelimit_hosts%& above. - .option smtp_receive_timeout main time&!! 5m .cindex "timeout" "for SMTP input" @@ -18258,7 +18699,7 @@ is not required the &%tls_advertise_hosts%& option should be set empty. .cindex ALPN "set acceptable names for server" If this option is set, the TLS library supports ALPN, -and the client offers either more than +and the client offers either more than one ALPN name or a name which does not match the list, the TLS connection is declined. @@ -18364,11 +18805,16 @@ If Exim is using OpenSSL and this option is empty or unset, then Exim will load a default DH prime; the default is Exim-specific but lacks verifiable provenance. In older versions of Exim the default was the 2048 bit prime described in section -2.2 of RFC 5114, "2048-bit MODP Group with 224-bit Prime Order Subgroup", which +2.2 of &url(https://www.rfc-editor.org/rfc/rfc5114,RFC 5114), +"2048-bit MODP Group with 224-bit Prime Order Subgroup", which in IKE is assigned number 23. Otherwise, the option must expand to the name used by Exim for any of a number -of DH primes specified in RFC 2409, RFC 3526, RFC 5114, RFC 7919, or from other +of DH primes specified in +&url(https://www.rfc-editor.org/rfc/rfc2409,RFC 2409), +&url(https://www.rfc-editor.org/rfc/rfc3526,RFC 3526), +&url(https://www.rfc-editor.org/rfc/rfc5114,RFC 5114), +&url(https://www.rfc-editor.org/rfc/rfc7919,RFC 7919), or from other sources. As names, Exim uses a standard specified name, else "ike" followed by the number used by IKE, or "default" which corresponds to &`exim.dev.20160529.3`&. @@ -18385,13 +18831,15 @@ The available additional primes are: Some of these will be too small to be accepted by clients. Some may be too large to be accepted by clients. The open cryptographic community has suspicions about the integrity of some -of the later IKE values, which led into RFC7919 providing new fixed constants -(the "ffdhe" identifiers). +of the later IKE values, which led into +&url(https://www.rfc-editor.org/rfc/rfc7919,RFC 7919) +providing new fixed constants (the "ffdhe" identifiers). At this point, all of the "ike" values should be considered obsolete; they are still in Exim to avoid breaking unusual configurations, but are candidates for removal the next time we have backwards-incompatible changes. -Two of them in particular (&`ike1`& and &`ike22`&) are called out by RFC 8247 +Two of them in particular (&`ike1`& and &`ike22`&) are called out by +&url(https://www.rfc-editor.org/rfc/rfc8247,RFC 8247) as MUST NOT use for IPSEC, and two more (&`ike23`& and &`ike24`&) as SHOULD NOT. Because of this, Exim regards them as deprecated; if either of the first pair @@ -18415,20 +18863,23 @@ prior to the 4.80 release, as Debian used to patch Exim to raise the minimum acceptable bound from 1024 to 2048. -.option tls_eccurve main string&!! &`auto`& +.option tls_eccurve main string list&!! &`auto`& .cindex TLS "EC cryptography" -This option selects a EC curve for use by Exim when used with OpenSSL. -It has no effect when Exim is used with GnuTLS. +This option selects EC curves for use by Exim when used with OpenSSL. +It has no effect when Exim is used with GnuTLS +(the equivalent can be done using a priority string for the +&%tls_require_ciphers%& option). -After expansion it must contain a valid EC curve parameter, such as -&`prime256v1`&, &`secp384r1`&, or &`P-512`&. Consult your OpenSSL manual -for valid selections. +After expansion it must contain +one or (only for OpenSSL versiona 1.1.1 onwards) more +EC curve names, such as &`prime256v1`&, &`secp384r1`&, or &`P-521`&. +Consult your OpenSSL manual for valid curve names. For OpenSSL versions before (and not including) 1.0.2, the string &`auto`& selects &`prime256v1`&. For more recent OpenSSL versions &`auto`& tells the library to choose. -If the option expands to an empty string, no EC curves will be enabled. +If the option expands to an empty string, the effect is undefined. .option tls_ocsp_file main string&!! unset @@ -18719,6 +19170,12 @@ absolute and untainted. 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 (&<>&). + .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. @@ -19022,12 +19479,25 @@ This applies to all of the SRV, MX, AAAA, A lookup sequence. .cindex "router" "restricting to specific domains" .vindex "&$domain_data$&" 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 +the list. +The data returned by the list check +is placed in &$domain_data$& for use in string expansions of the driver's private options and in the transport. See section &<>& for a list of the order in which preconditions are evaluated. +A complex example, using a file like: +.code +alice@dom1 +bill@dom1 +maggie@dom1 +.endd +and checking both domain and local_part +.code +domains = ${domain:${lookup {$local_part@$domain} lseach,ret=key {/path/to/accountsfile}}} +local_parts = ${local_part:${lookup {$local_part@$domain} lseach,ret=key {/path/to/accountsfile}}} +.endd + .option driver routers string unset @@ -19038,7 +19508,8 @@ to be used. .option dsn_lasthop routers boolean false .cindex "DSN" "success" .cindex "Delivery Status Notification" "success" -If this option is set true, and extended DSN (RFC3461) processing is in effect, +If this option is set true, and extended DSN +(&url(https://www.rfc-editor.org/rfc/rfc3461,RFC 3461)) processing is in effect, Exim will not pass on DSN requests to downstream DSN-aware hosts but will instead send a success DSN as if the next hop does not support DSN. Not effective on redirect routers. @@ -19346,8 +19817,8 @@ real_localuser: For security, it would probably be a good idea to restrict the use of this router to locally-generated messages, using a condition such as this: .code - condition = ${if match {$sender_host_address}\ - {\N^(|127\.0\.0\.1)$\N}} + condition = ${if match_ip {$sender_host_address} \ + {<; ; 127.0.0.1 ; ::1}} .endd If both &%local_part_prefix%& and &%local_part_suffix%& are set for a router, @@ -19391,7 +19862,7 @@ example: 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 +the data returned by the list check for the local part is placed in the variable &$local_part_data$& for use in expansions of the router's private options or in the transport. You might use this option, for @@ -20081,8 +20552,9 @@ the local host is described in section &<>&. .option check_srv dnslookup string&!! unset .cindex "SRV record" "enabling use of" -The &(dnslookup)& router supports the use of SRV records (see RFC 2782) in -addition to MX and address records. The support is disabled by default. To +The &(dnslookup)& router supports the use of SRV records +(see &url(https://www.rfc-editor.org/rfc/rfc2782,RFC 2782)) +in addition to MX and address records. The support is disabled by default. To enable SRV support, set the &%check_srv%& option to the name of the service required. For example, .code @@ -20310,7 +20782,9 @@ entered. No widening ever takes place for these lookups. This router has no private options. Unless it is being used purely for verification (see &%verify_only%&) a transport is required to be defined by the generic &%transport%& option. The router accepts the address if its domain part -takes the form of an RFC 2822 domain literal. For example, the &(ipliteral)& +takes the form of an +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +domain literal. For example, the &(ipliteral)& router handles the address .code root@[192.168.1.1] @@ -21159,8 +21633,9 @@ userforward: If the file does not exist, or causes no action to be taken (for example, it is empty or consists only of comments), the router declines. &*Warning*&: This is not the case when the file contains syntactically valid items that happen to -yield empty addresses, for example, items containing only RFC 2822 address -comments. +yield empty addresses, for example, items containing only +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +address comments. .cindex "tainted data" "in filenames" .cindex redirect "tainted data" @@ -21284,8 +21759,9 @@ preceded by &"\"&, but this is not a requirement for loop prevention. However, it does make a difference if more than one domain is being handled synonymously. -If an item begins with &"\"& and the rest of the item parses as a valid RFC -2822 address that does not include a domain, the item is qualified using the +If an item begins with &"\"& and the rest of the item parses as a valid +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +address that does not include a domain, the item is qualified using the domain of the incoming address. In the absence of a leading &"\"&, unqualified addresses are qualified using the value in &%qualify_recipient%&, but you can force the incoming domain to be used by setting &%qualify_preserve_domain%&. @@ -21324,7 +21800,9 @@ lists (that is, in non-filter redirection data): .cindex "pipe" "in redirection list" .cindex "address redirection" "to pipe" An item is treated as a pipe command if it begins with &"|"& and does not parse -as a valid RFC 2822 address that includes a domain. A transport for running the +as a valid +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +address that includes a domain. A transport for running the command must be specified by the &%pipe_transport%& option. Normally, either the router or the transport specifies a user and a group under which to run the delivery. The default is to use the Exim user and group. @@ -21357,7 +21835,9 @@ an &%accept%& router. .cindex "file" "in redirection list" .cindex "address redirection" "to file" An item is interpreted as a path name if it begins with &"/"& and does not -parse as a valid RFC 2822 address that includes a domain. For example, +parse as a valid +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +address that includes a domain. For example, .code /home/world/minbari .endd @@ -21980,6 +22460,12 @@ subject to address rewriting. Otherwise, they are treated like new addresses 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. @@ -22028,7 +22514,9 @@ so it is passed to the following routers. .cindex "Sieve filter" "syntax errors in" Syntax errors in a Sieve filter file cause the &"keep"& action to occur. This -action is specified by RFC 3028. The values of &%skip_syntax_errors%&, +action is specified by +&url(https://www.rfc-editor.org/rfc/rfc3028.html,RFC 3028). +The values of &%skip_syntax_errors%&, &%syntax_errors_to%&, and &%syntax_errors_text%& are not used. &%skip_syntax_errors%& can be used to specify that errors in users' forward @@ -22072,8 +22560,8 @@ real_localuser: For security, it would probably be a good idea to restrict the use of this router to locally-generated messages, using a condition such as this: .code - condition = ${if match {$sender_host_address}\ - {\N^(|127\.0\.0\.1)$\N}} + condition = ${if match_ip {$sender_host_address} \ + {<; ; 127.0.0.1 ; ::1}} .endd @@ -22363,7 +22851,7 @@ its removal from incoming messages, so that delivered messages can safely be resent to other recipients. &*Note:*& If used on a transport handling multiple recipients -(the smtp transport unless &%rcpt_max%& is 1, the appendfile, pipe or lmtp +(the smtp transport unless &%max_rcpt%& is 1, the appendfile, pipe or lmtp transport if &%batch_max%& is greater than 1) then information about Bcc recipients will be leaked. Doing so is generally not advised. @@ -22604,7 +23092,8 @@ 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 have easy access to it. -RFC 2821 states that the &'Return-path:'& header is added to a message &"when +&url(https://www.rfc-editor.org/rfc/rfc2821,RFC 2821) +states that the &'Return-path:'& header is added to a message &"when the delivery SMTP server makes the final delivery"&. This implies that this header should not be present in incoming messages. Exim has a configuration option, &%return_path_remove%&, which requests removal of this header from @@ -22656,8 +23145,11 @@ If unset, or expanding to an empty string, no filtering is done. When the message is about to be written out, the command specified by &%transport_filter%& is started up in a separate, parallel process, and the entire message, including the header lines, is passed to it on its standard -input (this in fact is done from a third process, to avoid deadlock). The -command must be specified as an absolute path. +input (this in fact is done from a third process, to avoid deadlock). +The command must be specified as an absolute path. + +The process run by the command must use its standard input as the message +data to be transformed, and write the results on its standard output. The lines of the message that are written to the transport filter are terminated by newline (&"\n"&). The message is passed to the filter before any @@ -22673,7 +23165,9 @@ filter itself, and the original process that reads the result and delivers it are all run in parallel, like a shell pipeline. The filter can perform any transformations it likes, but of course should take -care not to break RFC 2822 syntax. Exim does not check the result, except to +care not to break +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +syntax. Exim does not check the result, except to test for a final newline when SMTP is in use. All messages transmitted over SMTP must end with a newline, so Exim supplies one if it is missing. @@ -22727,7 +23221,17 @@ example: transport_filter = '/bin/cmd${if eq{$host}{a.b.c}{1}{2}}' .endd This runs the command &(/bin/cmd1)& if the host name is &'a.b.c'&, and -&(/bin/cmd2)& otherwise. If double quotes had been used, they would have been +&(/bin/cmd2)& otherwise. + +Option strings in general have any fully-surrounding double quote wrapping +removed early in parsing (see &<>&). +Then, for this option, quotes protect against whitespace being +regarded as a separator while splitting into the command argument vector. +Either double or single quotes can be used here; +the former interprets backlash-quoted charachters +and the latter does not. + +If double quotes had been used in this example, they would have been stripped by Exim when it read the option's value. When the value is used, if the single quotes were missing, the line would be split into two items, &`/bin/cmd${if`& and &`eq{$host}{a.b.c}{1}{2}`&, and an error would occur when @@ -23003,7 +23507,11 @@ fileinto "folder23"; .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 @@ -23019,6 +23527,12 @@ With this setting of &%file%&, &'inbox'& refers to the standard mailbox 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 @@ -23029,6 +23543,10 @@ path to the transport. &*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 @@ -24127,7 +24645,9 @@ The &(autoreply)& transport is not a true transport in that it does not cause the message to be transmitted. Instead, it generates a new mail message as an automatic reply to the incoming message. &'References:'& and &'Auto-Submitted:'& header lines are included. These are constructed according -to the rules in RFCs 2822 and 3834, respectively. +to the rules in RFCs +&url(https://www.rfc-editor.org/rfc/rfc2822,2822) and +&url(https://datatracker.ietf.org/doc/html/rfc3834,3834), respectively. If the router that passes the message to this transport does not have the &%unseen%& option set, the original message (for the current recipient) is not @@ -24223,7 +24743,9 @@ specified by the transport. .option headers autoreply string&!! unset -This specifies additional RFC 2822 headers that are to be added to the message +This specifies additional +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +headers that are to be added to the message when the message is specified by the transport. Several can be given by using &"\n"& to separate them. There is no check on the format. @@ -24331,8 +24853,9 @@ when the message is specified by the transport. .cindex "transports" "&(lmtp)&" .cindex "&(lmtp)& transport" .cindex "LMTP" "over a pipe" -.cindex "LMTP" "over a socket" -The &(lmtp)& transport runs the LMTP protocol (RFC 2033) over a pipe to a +.cindex "LMTP" "over a unix-domain socket" +The &(lmtp)& transport runs the LMTP protocol +(&url(https://www.rfc-editor.org/rfc/rfc2033,RFC 2033)) over a pipe to a specified command or by interacting with a Unix domain socket. This transport is something of a cross between the &(pipe)& and &(smtp)& @@ -24682,7 +25205,7 @@ Exim, and each argument is separately expanded, as described in section No part of the resulting command may be tainted. -.option environment pipe string&!! unset +.option environment pipe "string list&!!" unset .cindex "&(pipe)& transport" "environment for command" .cindex "environment" "&(pipe)& transport" This option is used to add additional variables to the environment in which the @@ -25176,7 +25699,8 @@ 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 less than the system timeout. However, it has been observed that on some systems there is no system timeout, which is why the default value for this -option is 5 minutes, a value recommended by RFC 1123. +option is 5 minutes, a value recommended by +&url(https://www.rfc-editor.org/rfc/rfc1123,RFC 1123). .option connection_max_messages smtp integer 500 @@ -25188,6 +25712,11 @@ 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. +.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. + .option dane_require_tls_ciphers smtp string&!! unset .cindex "TLS" "requiring specific ciphers for DANE" @@ -25400,15 +25929,22 @@ load-balancer, matching the session stored in the client's cache. Exim can pull out a server name, if there is one, from the response to the client's SMTP EHLO command. -The default value of this option: +For normal STARTTLS use, the default value of this option: .code ${if and { {match {$host} {.outlook.com\$}} \ {match {$item} {\N^250-([\w.]+)\s\N}} \ } {$1}} .endd suffices for one known case. + During the expansion of this option the &$item$& variable will have the server's EHLO response. + +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. + The result of the option expansion is included in the key used to store and retrieve the TLS session, for session resumption. @@ -25591,12 +26127,16 @@ hard failure if required. See also &%hosts_try_auth%&, and chapter &<>& for details of authentication. -.option hosts_request_ocsp smtp "host list&!!" * +.option hosts_request_ocsp smtp "host list&!!" "see below" .cindex "TLS" "requiring for certain servers" Exim will request a Certificate Status on a TLS session for any host that matches this list. &%tls_verify_certificates%& should also be set for the transport. +The default is &"**"& if DANE is not in use for the connection, +or if DANE-TA us used. +It is empty if DANE-EE is used. + .option hosts_require_alpn smtp "host list&!!" unset .cindex ALPN "require negotiation in client" .cindex TLS ALPN @@ -25667,7 +26207,7 @@ See section &<>&. .cindex "RFC 7413" "TCP Fast Open" This option provides a list of servers to which, provided the facility is supported by this system, Exim will attempt to -perform a TCP Fast Open. +perform a TCP Fast Open (&url(https://www.rfc-editor.org/rfc/rfc7413,RFC 7413). No data is sent on the SYN segment but, if the remote server also supports the facility, it can send its SMTP banner immediately after the SYN,ACK segment. This can save up to one round-trip time. @@ -25738,18 +26278,31 @@ If this option is set true when the &%protocol%& option is set to &"lmtp"&, the string &`IGNOREQUOTA`& is added to RCPT commands, provided that the LMTP server has advertised support for IGNOREQUOTA in its response to the LHLO command. -.option max_rcpt smtp integer 100 +.option max_rcpt smtp integer&!! 100 .cindex "RCPT" "maximum number of outgoing" -This option limits the number of RCPT commands that are sent in a single -SMTP message transaction. Each set of addresses is treated independently, and +This option, +after expansion, +limits the number of RCPT commands that are sent in a single +SMTP message transaction. +A value setting of zero disables the limit. + +If a constant is given, +each set of addresses is treated independently, and so can cause parallel connections to the same host if &%remote_max_parallel%& -permits this. A value setting of zero disables the limit. +permits this. + +.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. .option message_linelength_limit smtp integer 998 .cindex "line length" limit This option sets the maximum line length, in bytes, that the transport will send. Any messages with lines exceeding the given value +(before a transport filter, if any) will fail and a failure-DSN ("bounce") message will if possible be returned to the sender. The default value is that defined by the SMTP standards. @@ -25775,6 +26328,12 @@ 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. +.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. + + .option port smtp string&!! "see below" .cindex "port" "sending TCP/IP" .cindex "TCP/IP" "setting outgoing port" @@ -25804,15 +26363,21 @@ to put &"smtps"& in its &"/etc/services"& file, resulting is such deferrals. .vindex "&$port$&" If this option is set to &"lmtp"& instead of &"smtp"&, the default value for the &%port%& option changes to &"lmtp"&, and the transport operates the LMTP -protocol (RFC 2033) instead of SMTP. This protocol is sometimes used for local +protocol +(&url(https://www.rfc-editor.org/rfc/rfc2033,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 &<>&. +&*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. The Internet standards bodies used to strongly discourage use of this mode, -but as of RFC 8314 it is preferred over STARTTLS for message submission +but as of &url(https://www.rfc-editor.org/rfc/rfc8314,RFC 8314) it is preferred +over STARTTLS for message submission (as distinct from MTA-MTA communication). @@ -26016,7 +26581,8 @@ This option give a list of hosts for which, while verifying the server certificate, checks will be included on the host name (note that this will generally be the result of a DNS MX lookup) -versus Subject and Subject-Alternate-Name fields. Wildcard names are permitted +versus the Subject-Alternate-Name (or, if none, Subject-Name) fields. +Wildcard names are permitted, limited to being the initial component of a 3-or-more component FQDN. There is no equivalent checking on client certificates. @@ -26066,7 +26632,7 @@ If both this option and &%tls_try_verify_hosts%& are unset operation is as if this option selected all hosts. &*Warning*&: Including a host in &%tls_verify_hosts%& does not require that connections use TLS. -Fallback to in-clear communication will be done unless restricted by +Fallback to in-clear communication will be done unless restricted by the &%hosts_require_tls%& option. .option utf8_downconvert smtp integer&!! -1 @@ -26295,8 +26861,9 @@ transport time. .cindex "testing" "rewriting" Exim's input rewriting configuration appears in a part of the runtime configuration file headed by &"begin rewrite"&. It can be tested by the -&%-brw%& command line option. This takes an address (which can be a full RFC -2822 address) as its argument. The output is a list of how the address would be +&%-brw%& command line option. This takes an address (which can be a full +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +address) as its argument. The output is a list of how the address would be transformed by the rewriting rules for each of the different places it might appear in an incoming message, that is, for each different header and for the envelope sender and recipient fields. For example, @@ -26507,7 +27074,10 @@ data for the command, including any surrounding angle brackets. .vindex "&$domain$&" .vindex "&$local_part$&" This form of rewrite rule allows for the handling of addresses that are not -compliant with RFCs 2821 and 2822 (for example, &"bang paths"& in batched SMTP +compliant with RFCs +&url(https://www.rfc-editor.org/rfc/rfc2821,2821) and +&url(https://www.rfc-editor.org/rfc/rfc2822,2822) +(for example, &"bang paths"& in batched SMTP input). Because the input is not required to be a syntactically valid address, the variables &$local_part$& and &$domain$& are not available during the expansion of the replacement string. The result of rewriting replaces the @@ -26535,8 +27105,9 @@ rewriting once it fails to match (after at least one successful rewrite). .next .cindex "rewriting" "whole addresses" When an address in a header is rewritten, the rewriting normally applies only -to the working part of the address, with any comments and RFC 2822 &"phrase"& -left unchanged. For example, rewriting might change +to the working part of the address, with any comments and +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +&"phrase"& left unchanged. For example, rewriting might change .code From: Ford Prefect .endd @@ -26548,10 +27119,12 @@ From: Ford Prefect Sometimes there is a need to replace the whole address item, and this can be done by adding the flag letter &"w"& to a rule. If this is set on a rule that causes an address in a header line to be rewritten, the entire address is -replaced, not just the working part. The replacement must be a complete RFC -2822 address, including the angle brackets if necessary. If text outside angle +replaced, not just the working part. The replacement must be a complete +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +address, including the angle brackets if necessary. If text outside angle brackets contains a character whose value is greater than 126 or less than 32 -(except for tab), the text is encoded according to RFC 2047. The character set +(except for tab), the text is encoded according to +&url(https://www.rfc-editor.org/rfc/rfc2047,RFC 2047). The character set is taken from &%headers_charset%&, which gets its default at build time. When the &"w"& flag is set on a rule that causes an envelope address to be @@ -27180,7 +27753,9 @@ considered immediately. .scindex IIDauthconf2 "authentication" The &"authenticators"& section of Exim's runtime configuration is concerned with SMTP authentication. This facility is an extension to the SMTP protocol, -described in RFC 2554, which allows a client SMTP host to authenticate itself +described in +&url(https://www.rfc-editor.org/rfc/rfc2554,RFC 2554), +which allows a client SMTP host to authenticate itself to a server. This is a common way for a server to recognize clients that are permitted to use it as a relay. SMTP authentication is not of relevance to the transfer of mail between servers that have no managerial connection with each @@ -27254,18 +27829,21 @@ AUTH_SPA=yes AUTH_TLS=yes .endd in &_Local/Makefile_&, respectively. The first of these supports the CRAM-MD5 -authentication mechanism (RFC 2195), and the second provides an interface to -the Cyrus SASL authentication library. +authentication mechanism +(&url(https://www.rfc-editor.org/rfc/rfc2195,RFC 2195)), +and the second provides an interface to the Cyrus SASL authentication library. The third is an interface to Dovecot's authentication system, delegating the work via a socket interface. The fourth provides for negotiation of authentication done via non-SMTP means, -as defined by RFC 4422 Appendix A. +as defined by &url(https://www.rfc-editor.org/rfc/rfc4422,RFC 4422) Appendix A. The fifth provides an interface to the GNU SASL authentication library, which provides mechanisms but typically not data sources. The sixth provides direct access to Heimdal GSSAPI, geared for Kerberos, but supporting setting a server keytab. The seventh can be configured to support -the PLAIN authentication mechanism (RFC 2595) or the LOGIN mechanism, which is +the PLAIN authentication mechanism +(&url(https://www.rfc-editor.org/rfc/rfc2595,RFC 2595)) +or the LOGIN mechanism, which is not formally documented, but used by several MUAs. The eighth authenticator supports Microsoft's &'Secure Password Authentication'& mechanism. @@ -27354,7 +27932,8 @@ authenticators is to be used. .option public_name authenticators string unset This option specifies the name of the authentication mechanism that the driver implements, and by which it is known to the outside world. These names should -contain only upper case letters, digits, underscores, and hyphens (RFC 2222), +contain only upper case letters, digits, underscores, and hyphens +(&url(https://www.rfc-editor.org/rfc/rfc2222,RFC 2222)), but Exim in fact matches them caselessly. If &%public_name%& is not set, it defaults to the driver's instance name. @@ -27550,21 +28129,19 @@ no successful authentication. Successful authentication sets up information used by the &%authresults%& expansion item. -.new .cindex authentication "failure event, server" If an authenticator is run and does not succeed, -an event (see &<>&) of type "auth:fail" is raised. +an event of type "auth:fail" is raised. While the event is being processed the variables &$sender_host_authenticated$& (with the authenticator name) and &$authenticated_fail_id$& (as set by the authenticator &%server_set_id%& option) will be valid. If the event is serviced and a string is returned then the string will be logged instead of the default log line. -See <> for details on events. -.wen +See &<>& for details on events. -.section "Testing server authentication" "SECID169" +.subsection "Testing server authentication" "SECID169" .cindex "authentication" "testing a server" .cindex "AUTH" "testing a server" .cindex "base64 encoding" "creating authentication test data" @@ -27640,17 +28217,15 @@ Exim abandons trying to send the message to the host for the moment. It will try again later. If there are any backup hosts available, they are tried in the usual way. -.new .next .cindex authentication "failure event, client" If the response to authentication is a permanent error (5&'xx'& code), -an event (see &<>&) of type "auth:fail" is raised. +an event of type "auth:fail" is raised. While the event is being processed the variable &$sender_host_authenticated$& (with the authenticator name) will be valid. If the event is serviced and a string is returned then the string will be logged. -See <> for details on events. -.wen +See &<>& for details on events. .next If the response to authentication is a permanent error (5&'xx'& code), Exim @@ -27775,11 +28350,13 @@ There are good and bad examples at the end of the next section. -.section "The PLAIN authentication mechanism" "SECID172" +.subsection "The PLAIN authentication mechanism" "SECID172" .cindex "PLAIN authentication mechanism" .cindex authentication PLAIN .cindex "binary zero" "in &(plaintext)& authenticator" -The PLAIN authentication mechanism (RFC 2595) specifies that three strings be +The PLAIN authentication mechanism +(&url(https://www.rfc-editor.org/rfc/rfc2595,RFC 2595)) +specifies that three strings be sent as one item of data (that is, one combined string containing two NUL separators). The data is sent either as part of the AUTH command, or subsequently in response to an empty prompt from the server. @@ -27857,7 +28434,7 @@ always fails if its second argument is empty. However, the second way of writing the test makes the logic clearer. -.section "The LOGIN authentication mechanism" "SECID173" +.subsection "The LOGIN authentication mechanism" "SECID173" .cindex "LOGIN authentication mechanism" .cindex authentication LOGIN The LOGIN authentication mechanism is not documented in any RFC, but is in use @@ -27905,7 +28482,7 @@ the password conform to the Exim syntax. At the LDAP level, the password is an uninterpreted string. -.section "Support for different kinds of authentication" "SECID174" +.subsection "Support for different kinds of authentication" "SECID174" A number of string expansion features are provided for the purpose of interfacing to different ways of user authentication. These include checking traditionally encrypted passwords from &_/etc/passwd_& (or equivalent), PAM, @@ -27986,7 +28563,8 @@ prompts. .scindex IIDcramauth2 "authenticators" "&(cram_md5)&" .cindex "CRAM-MD5 authentication mechanism" .cindex authentication CRAM-MD5 -The CRAM-MD5 authentication mechanism is described in RFC 2195. The server +The CRAM-MD5 authentication mechanism is described in +&url(https://www.rfc-editor.org/rfc/rfc2195,RFC 2195). The server sends a challenge string to the client, and the response consists of a user name and the CRAM-MD5 digest of the challenge string combined with a secret string (password) which is known to both server and client. Thus, the secret @@ -28104,7 +28682,9 @@ The code for this authenticator was provided by Matthew Byng-Maddick while at A L Digital Ltd. The &(cyrus_sasl)& authenticator provides server support for the Cyrus SASL -library implementation of the RFC 2222 (&"Simple Authentication and Security +library implementation of the +&url(https://www.rfc-editor.org/rfc/rfc2222,RFC 2222) +(&"Simple Authentication and Security Layer"&). This library supports a number of authentication mechanisms, including PLAIN and LOGIN, but also several others that Exim does not support directly. In particular, there is support for Kerberos authentication. @@ -28207,7 +28787,7 @@ Dovecot 2 POP/IMAP server, which can support a number of authentication methods. Note that Dovecot must be configured to use auth-client not auth-userdb. If you are using Dovecot to authenticate POP/IMAP clients, it might be helpful to use the same mechanisms for SMTP authentication. This is a server -authenticator only. There is only one option: +authenticator only. There is only one non-generic option: .option server_socket dovecot string unset @@ -28219,6 +28799,7 @@ authenticators for different mechanisms. For example: dovecot_plain: driver = dovecot public_name = PLAIN + server_advertise_condition = ${if def:tls_in_cipher} server_socket = /var/run/dovecot/auth-client server_set_id = $auth1 @@ -28228,6 +28809,11 @@ dovecot_ntlm: server_socket = /var/run/dovecot/auth-client server_set_id = $auth1 .endd + +&*Note*&: plaintext authentication methods such as PLAIN and LOGIN +should not be advertised on cleartext SMTP connections. +See the discussion in section &<>&. + If the SMTP connection is encrypted, or if &$sender_host_address$& is equal to &$received_ip_address$& (that is, the connection is local), the &"secured"& option is passed in the Dovecot authentication command. If, for a TLS @@ -28588,7 +29174,7 @@ The &(spa)& authenticator provides client support for Microsoft's &'Secure 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: @@ -28676,8 +29262,8 @@ msn: .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,RFC 4422) Appendix A. It is only a transport and negotiation mechanism; the process of authentication is entirely controlled by the server configuration. @@ -28688,7 +29274,7 @@ and for clients to only attempt, 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 @@ -28826,9 +29412,10 @@ for which it must have been requested via the (see &<>&). If an authenticator of this type is configured it is -run before any SMTP-level communication is done, +run immediately after a TLS connection being negotiated +(due to either STARTTLS or TLS-on-connect) and can authenticate the connection. -If it does, SMTP authentication is not offered. +If it does, SMTP authentication is not subsequently offered. A maximum of one authenticator of this type may be present. @@ -28917,7 +29504,8 @@ You also need to understand the basic concepts of encryption at a managerial level, and in particular, the way that public keys, private keys, and certificates are used. -RFC 3207 defines how SMTP connections can make use of encryption. Once a +&url(https://www.rfc-editor.org/rfc/rfc3207,RFC 3207) +defines how SMTP connections can make use of encryption. Once a connection is established, the client issues a STARTTLS command. If the server accepts this, the client and the server negotiate an encryption mechanism. If the negotiation succeeds, the data that subsequently passes @@ -28944,7 +29532,9 @@ in order to get TLS to work. .cindex "SMTP" "ssmtp protocol" .cindex "SMTP" "smtps protocol" The history of port numbers for TLS in SMTP is a little messy and has been -contentious. As of RFC 8314, the common practice of using the historically +contentious. As of +&url(https://www.rfc-editor.org/rfc/rfc8314,RFC 8314), +the common practice of using the historically allocated port 465 for "email submission but with TLS immediately upon connect instead of using STARTTLS" is officially blessed by the IETF, and recommended by them in preference to STARTTLS. @@ -29014,7 +29604,8 @@ The default value for &%tls_dhparam%& differs for historical reasons. .vindex "&$tls_in_peerdn$&" .vindex "&$tls_out_peerdn$&" Distinguished Name (DN) strings reported by the OpenSSL library use a slash for -separating fields; GnuTLS uses commas, in accordance with RFC 2253. This +separating fields; GnuTLS uses commas, in accordance with +&url(https://www.rfc-editor.org/rfc/rfc2253,RFC 2253). This affects the value of the &$tls_in_peerdn$& and &$tls_out_peerdn$& variables. .next OpenSSL identifies cipher suites using hyphens as separators, for example: @@ -29034,8 +29625,8 @@ When using OpenSSL, this option is ignored. (If an API is found to let OpenSSL be configured in this way, let the Exim Maintainers know and we'll likely use it). .next -With GnuTLS, if an explicit list is used for the &%tls_privatekey%& main option -main option, it must be ordered to match the &%tls_certificate%& list. +With GnuTLS, if an explicit list is used for the &%tls_privatekey%& main option, +it must be ordered to match the &%tls_certificate%& list. .next 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 @@ -29485,10 +30076,10 @@ 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. +is acceptable in configurations for the Exim executable. Caching of the system Certificate Authorities bundle can -save siginificant time and processing on every TLS connection +save significant time and processing on every TLS connection accepted by Exim. @@ -29658,10 +30249,10 @@ 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. +is acceptable in configurations for the Exim executable. Caching of the system Certificate Authorities bundle can -save siginificant time and processing on every TLS connection +save significant time and processing on every TLS connection initiated by Exim. @@ -29675,7 +30266,9 @@ initiated by Exim. .oindex "&%tls_in_sni%&" With TLS1.0 or above, there is an extension mechanism by which extra information can be included at various points in the protocol. One of these -extensions, documented in RFC 6066 (and before that RFC 4366) is +extensions, documented in +&url(https://www.rfc-editor.org/rfc/rfc6066,RFC 6066) +(and before that &url(https://www.rfc-editor.org/rfc/rfc4366,RFC 4366)) is &"Server Name Indication"&, commonly &"SNI"&. This extension is sent by the client in the initial handshake, so that the server can examine the servername within and possibly choose to use different certificates and keys (and more) @@ -29756,7 +30349,7 @@ connection. The client for the connection proposes a set of protocol names, and the server responds with a selected one. It is not, as of 2021, commonly used for SMTP connections. -However, to guard against misirected or malicious use of web clients +However, to guard against misdirected or malicious use of web clients (which often do use ALPN) against MTA ports, Exim by default check that there is no incompatible ALPN specified by a client for a TLS connection. If there is, the connection is rejected. @@ -29766,7 +30359,7 @@ The behaviour of both client and server can be configured using the options &%tls_alpn%& and &%hosts_require_alpn%&. There are no variables providing observability. Some feature-specific logging may appear on denied connections, but this -depends on the behavious of the peer +depends on the behaviour of the peer (not all peers can send a feature-specific TLS Alert). This feature is available when Exim is built with @@ -30010,8 +30603,8 @@ There is no current way to staple a proof for a client certificate. .section "TLS Resumption" "SECTresumption" .cindex TLS resumption TLS Session Resumption for TLS 1.2 and TLS 1.3 connections can be used (defined -in RFC 5077 for 1.2). The support for this requires GnuTLS 3.6.3 or OpenSSL 1.1.1 -(or later). +in &url(https://www.rfc-editor.org/rfc/rfc5077,RFC 5077) for 1.2). +The support for this requires GnuTLS 3.6.3 or OpenSSL 1.1.1 (or later). Session resumption (this is the "stateless" variant) involves the server sending a "session ticket" to the client on one connection, which can be stored by the @@ -30129,7 +30722,7 @@ DNSSEC. .next Add TLSA DNS records. These say what the server certificate for a TLS connection should be. .next -Offer a server certificate, or certificate chain, in TLS connections which is is anchored by one of the TLSA records. +Offer a server certificate, or certificate chain, in TLS connections which is anchored by one of the TLSA records. .endlist There are no changes to Exim specific to server-side operation of DANE. @@ -30297,12 +30890,19 @@ Section 4.3 of that document. .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 &url(https://www.rfc-editor.org/rfc/rfc6698,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 +(&url(https://www.rfc-editor.org/rfc/rfc8461,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 @@ -30361,27 +30961,30 @@ configuration locally by running a fake SMTP session with which you interact. .cindex "&ACL;" "options for specifying" In order to cause an ACL to be used, you have to name it in one of the relevant options in the main part of the configuration. These options are: +.cindex "ATRN" "ACL for" .cindex "AUTH" "ACL for" .cindex "DATA" "ACLs for" +.cindex "DKIM" "ACL for" .cindex "ETRN" "ACL for" .cindex "EXPN" "ACL for" .cindex "HELO" "ACL for" .cindex "EHLO" "ACL for" -.cindex "DKIM" "ACL for" .cindex "MAIL" "ACL for" -.cindex "QUIT, ACL for" +.cindex "QUIT" "ACL for" +.cindex "PRDR" "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 "PRDR" "ACL for" .table2 140pt .irow &%acl_not_smtp%& "ACL for non-SMTP messages" .irow &%acl_not_smtp_mime%& "ACL for non-SMTP MIME parts" .irow &%acl_not_smtp_start%& "ACL at start of non-SMTP message" +.irow &%acl_smtp_atrn%& "ACL for ATRN" .irow &%acl_smtp_auth%& "ACL for AUTH" .irow &%acl_smtp_connect%& "ACL for start of SMTP connection" .irow &%acl_smtp_data%& "ACL after DATA is complete" @@ -30399,6 +31002,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_wellknown%& "ACL for WELLKNOWN" .endtable For example, if you set @@ -30414,7 +31018,7 @@ trying to deliver the message. It is therefore recommended that you do as much 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 @@ -30448,7 +31052,7 @@ kind of rejection is treated as permanent, because there is no way of sending a 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 @@ -30458,11 +31062,12 @@ accepted by an &%accept%& verb that has a &%message%& modifier, the contents of the message override the banner message that is otherwise specified by the &%smtp_banner%& option. -For tls-on-connect connections, the ACL is run after the TLS connection -is accepted (however, &%host_reject_connection%& is tested before). +For tls-on-connect connections, the ACL is run before the TLS connection +is accepted; if the ACL does not accept then the TCP connection is dropped without +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 @@ -30483,7 +31088,7 @@ affect the EHLO options that are listed on the second and subsequent lines of 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. @@ -30526,6 +31131,10 @@ and the &%acl_smtp_mime%& ACLs. The &%acl_smtp_dkim%& ACL is available only when Exim is compiled with DKIM support enabled (which is the default). +If, for a specific message, an ACL control +&*dkim_disable_verify*& +has been set, this &%acl_smtp_dkim%& ACL is not called. + The ACL test specified by &%acl_smtp_dkim%& happens after a message has been received, and is executed for each DKIM signature found in a message. If not otherwise specified, the default action is to accept. @@ -30576,6 +31185,64 @@ 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. +.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:} +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 +&url(https://www.rfc-editor.org/rfc/rfc8615,RFC 8615) +and can be used for a security.txt file +and could be used for ACME handshaking +(&url(https://www.rfc-editor.org/rfc/rfc8555,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 &url(https://www.rfc-editor.org/rfc/rfc3461,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 @@ -30649,8 +31316,11 @@ acl_smtp_rcpt = ${if ={25}{$interface_port} \ {acl_check_rcpt} {acl_check_rcpt_submit} } .endd In the default configuration file there are some example settings for -providing an RFC 4409 message &"submission"& service on port 587 and -an RFC 8314 &"submissions"& service on port 465. You can use a string +providing an +&url(https://www.rfc-editor.org/rfc/rfc4409,RFC 4409) +message &"submission"& service on port 587 and an +&url(https://www.rfc-editor.org/rfc/rfc8314,RFC 8314) +&"submissions"& service on port 465. You can use a string expansion like this to choose an ACL for MUAs on these ports which is more appropriate for this purpose than the default ACL on port 25. @@ -30746,12 +31416,15 @@ 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"&. -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. - +.new +For the others (&%acl_smtp_atrn%&, +.wen +&%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. @@ -30798,7 +31471,7 @@ of previously accepted recipients. At DATA time (for both the DATA ACLs), .cindex "&ACL;" "data for non-message ACL" .vindex &$smtp_command_argument$& .vindex &$smtp_command$& -When an ACL is being run for AUTH, EHLO, ETRN, EXPN, HELO, STARTTLS, or VRFY, +When an ACL is being run for ATRN, AUTH, EHLO, ETRN, EXPN, HELO, STARTTLS, or VRFY, the remainder of the SMTP command line is placed in &$smtp_command_argument$&, and the entire SMTP command is available in &$smtp_command$&. These variables can be tested using a &%condition%& condition. For example, @@ -30823,7 +31496,8 @@ option to do this.) .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. @@ -30842,6 +31516,9 @@ happens then depends on the verb (and in one case, on a special modifier). Not 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: @@ -31385,8 +32062,11 @@ the message modifier cannot override the 221 response code. The text in a &%message%& modifier is literal; any quotes are taken as literals, but because the string is expanded, backslash escapes are processed -anyway. If the message contains newlines, this gives rise to a multi-line SMTP +anyway. +If the message contains newlines, this gives rise to a multi-line SMTP response. +A long message line will also be split into multi-line SMTP responses, +on word boundaries if possible. .vindex "&$acl_verify_message$&" While the text is being expanded, the &$acl_verify_message$& variable @@ -31610,7 +32290,7 @@ pretrigger=<&'size'&> This option specifies a memory buffuer to be used immediate writes to file are done as normal. trigger=<&'reason'&> This option selects cause for the pretrigger buffer - see above) to be copied to file. A reason of $*now* + see above) to be copied to file. A reason of &*now*& take effect immediately; one of &*paniclog*& triggers on a write to the panic log. .endd @@ -31635,12 +32315,17 @@ This control turns off DKIM verification processing entirely. For details on the operation and configuration of DKIM, see section &<>&. -.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 &<>&. +The &"disable"& turns off DMARC verification processing entirely. + .vitem &*control&~=&~dscp/*&<&'value'&> .cindex "&ACL;" "setting DSCP value" @@ -31680,6 +32365,7 @@ work with. .vitem &*control&~=&~fakedefer/*&<&'message'&> .cindex "fake defer" .cindex "defer, fake" +.cindex fakedefer This control works in exactly the same way as &%fakereject%& (described below) except that it causes an SMTP 450 response after the message data instead of a 550 response. You must take care when using &%fakedefer%& because it causes the @@ -31689,6 +32375,7 @@ use &%fakedefer%& if the message is to be delivered normally. .vitem &*control&~=&~fakereject/*&<&'message'&> .cindex "fake rejection" .cindex "rejection, fake" +.cindex fakereject This control is permitted only for the MAIL, RCPT, and DATA ACLs, in other words, only when an SMTP message is being received. If Exim accepts the message, instead the final 250 response, a 550 rejection message is sent. @@ -31747,11 +32434,15 @@ to be useful in production. .cindex "multiline responses, suppressing" This control is permitted for any ACL except the one for non-SMTP messages. It seems that there are broken clients in use that cannot handle multiline -SMTP responses, despite the fact that RFC 821 defined them over 20 years ago. +SMTP responses, despite the fact that +&url(https://www.rfc-editor.org/rfc/rfc821,RFC 821) +defined them over 20 years ago. If this control is set, multiline SMTP responses from ACL rejections are suppressed. One way of doing this would have been to put out these responses as -one long line. However, RFC 2821 specifies a maximum of 512 bytes per response +one long line. However, +&url(https://www.rfc-editor.org/rfc/rfc2821,RFC 2821) +specifies a maximum of 512 bytes per response (&"use multiline responses for more"& it says &-- ha!), and some of the responses might get close to that. So this facility, which is after all only a sop to broken clients, is implemented by doing two very easy things: @@ -31847,6 +32538,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 &<>&. + +.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 &<>&. .endlist vlist @@ -31990,8 +32686,22 @@ Headers will not be removed from the message if the modifier is used in DATA, MIME or DKIM ACLs for a message delivered by cutthrough routing. More than one header can be removed at the same time by using a colon separated -list of header names. The header matching is case insensitive. Wildcards are -not permitted, nor is list expansion performed, so you cannot use hostlists to +list of header specifiers. +If a specifier does not start with a circumflex (^) +then it is treated as a header name. +The header name matching is case insensitive. +If it does, then it is treated as a (front-anchored) +regular expression applied to the whole header. + +&*Note*&: The colon terminating a header name will need to be doubled +if used in an RE, and there can legitimately be whitepace before it. + +Example: +.code +remove_header = \N^(?i)Authentication-Results\s*::\s*example.org;\N +.endd + +List expansion is not performed, so you cannot use hostlists to create a list of headers, however both connection and message variable expansion are performed (&%$acl_c_*%& and &%$acl_m_*%&), illustrated in this example: .code @@ -32000,14 +32710,14 @@ warn hosts = +internal_hosts warn message = Remove internal headers remove_header = $acl_c_ihdrs .endd -Header names for removal are accumulated during the MAIL, RCPT, and predata ACLs. +Header specifiers for removal are accumulated during the MAIL, RCPT, and predata ACLs. Matching header lines are removed from the message before processing the DATA and MIME ACLs. If multiple header lines match, all are removed. There is no harm in attempting to remove the same header twice nor in removing -a non-existent header. Further header lines to be removed may be accumulated -during the DATA and MIME ACLs, after which they are removed from the message, -if present. In the case of non-SMTP messages, headers to be removed are -accumulated during the non-SMTP ACLs, and are removed from the message after +a non-existent header. Further header specifiers for removal may be accumulated +during the DATA and MIME ACLs, after which matching headers are removed +if present. In the case of non-SMTP messages, remove specifiers are +accumulated during the non-SMTP ACLs, and are acted on after all the ACLs have run. If a message is rejected after DATA or by the non-SMTP ACL, there really is no effect because there is no logging of what headers would have been removed. @@ -32092,6 +32802,18 @@ loops. This condition allows you to use different ACLs in different circumstances. For example, different ACLs can be used to handle RCPT commands for different local users or different local domains. +.new +.vitem &*atrn_domains&~=&~*&<&'domain&~list'&> +.cindex ATRN "checking for queued messages" +This condition is only usable in the ATRN ACL. +It returns true if there are any messages queued for any of the domains given +in the list. +The list supplied must not be tainted +.cindex "tainted data" "de-tainting" +and should contain only domains relevant for the authenticated user +(to avoid leaking information about other users). +.wen + .vitem &*authenticated&~=&~*&<&'string&~list'&> .cindex "&%authenticated%& ACL condition" .cindex "authentication" "ACL checking" @@ -33556,8 +34278,9 @@ updated in this circumstance. .cindex "callout" "full postmaster check" This operates like the &%postmaster%& option (see below), but if the check for &'postmaster@domain'& fails, it tries just &'postmaster'&, without a domain, in -accordance with the specification in RFC 2821. The RFC states that the -unqualified address &'postmaster'& should be accepted. +accordance with the specification in +&url(https://www.rfc-editor.org/rfc/rfc2821,RFC 2821). +The RFC states that the unqualified address &'postmaster'& should be accepted. .vitem &*mailfrom&~=&~*&<&'email&~address'&> @@ -34822,13 +35545,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 -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 @@ -34931,8 +35652,8 @@ containing the decoded data. This is perhaps the most important of the MIME variables. It contains a proposed filename for an attachment, if one was found in either the &'Content-Type:'& or &'Content-Disposition:'& headers. The filename will be -RFC2047 -or RFC2231 +&url(https://www.rfc-editor.org/rfc/rfc2047,RFC 2047) or +&url(https://www.rfc-editor.org/rfc/rfc2231,RFC 2231) decoded, but no additional sanity checks are done. If no filename was found, this variable contains the empty string. @@ -35143,9 +35864,10 @@ The arguments are as follows: (the -D file). The file is open for reading and writing, but updating it is not recommended. &*Warning*&: You must &'not'& close this file descriptor. -The descriptor is positioned at character 19 of the file, which is the first -character of the body itself, because the first 19 characters are the message -id followed by &`-D`& and a newline. If you rewind the file, you should use the +The descriptor is positioned at character 26 of the file, which is the first +character of the body itself, because the first 26 characters (19 characters +before Exim 4.97) are the message id followed by &`-D`& and a newline. +If you rewind the file, you should use the macro SPOOL_DATA_START_OFFSET to reset to the start of the data, just in case this changes in some future version. .next @@ -35537,7 +36259,7 @@ The third argument may be NULL, in which case the &%-oMas%& option is omitted. .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: @@ -35692,7 +36414,8 @@ address. .vlist .vitem "&*uschar&~rfc2047_decode(uschar&~*string,&~BOOL&~lencheck,&&& &~uschar&~*target,&~int&~zeroval,&~int&~*lenptr, &~&~uschar&~**error)*&" -This function decodes strings that are encoded according to RFC 2047. Typically +This function decodes strings that are encoded according to +&url(https://www.rfc-editor.org/rfc/rfc2047,RFC 2047). Typically these are the contents of header lines. First, each &"encoded word"& is decoded from the Q or B encoding into a byte-string. Then, if provided with the name of a charset encoding, and if the &[iconv()]& function is available, an attempt is @@ -36024,7 +36747,8 @@ headers remove .endd The argument for the &%headers add%& is a string that is expanded and then added to the end of the message's headers. It is the responsibility of the -filter maintainer to make sure it conforms to RFC 2822 syntax. Leading white +filter maintainer to make sure it conforms to +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) syntax. Leading white space is ignored, and if the string is otherwise empty, or if the expansion is forced to fail, the command has no effect. @@ -36244,7 +36968,8 @@ spoof another's address. .cindex "line endings" .cindex "carriage return" .cindex "linefeed" -RFC 2821 specifies that CRLF (two characters: carriage-return, followed by +&url(https://www.rfc-editor.org/rfc/rfc2821,RFC 2821) +specifies that CRLF (two characters: carriage-return, followed by linefeed) is the line ending for messages transmitted over the Internet using SMTP over TCP/IP. However, within individual operating systems, different conventions are used. For example, Unix-like systems use just LF, but others @@ -36261,8 +36986,6 @@ other MTAs, the way Exim handles line endings for all messages is now as follows: .ilist -LF not preceded by CR is treated as a line ending. -.next CR is treated as a line ending; if it is immediately followed by LF, the LF is ignored. .next @@ -36277,7 +37000,10 @@ people trying to play silly games. .next If the first header line received in a message ends with CRLF, a subsequent bare LF in a header line is treated in the same way as a bare CR in a header -line. +line and a bare LF in a body line is replaced with a space. +.next +If the first header line received in a message does not end with CRLF, a subsequent +LF not preceded by CR is treated as a line ending. .endlist @@ -36327,7 +37053,9 @@ with a line containing the envelope sender and a timestamp, following the word From a.oakley@berlin.mus Fri Jan 5 12:35 GMT 1996 From f.butler@berlin.mus Fri, 7 Jan 97 14:00:00 GMT .endd -This line precedes the RFC 2822 header lines. For compatibility with Sendmail, +This line precedes the +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +header lines. For compatibility with Sendmail, Exim recognizes such lines at the start of messages that are submitted to it via the command line (that is, on the standard input). It does not recognize such lines in incoming SMTP messages, unless the sending host matches @@ -36341,7 +37069,9 @@ that follows &"From"& into &$1$&. When the caller of Exim for a non-SMTP message that contains a &"From"& line is a trusted user, the message's sender address is constructed by expanding the contents of &%uucp_sender_address%&, whose default value is &"$1"&. This is -then parsed as an RFC 2822 address. If there is no domain, the local part is +then parsed as an +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +address. If there is no domain, the local part is qualified with &%qualify_domain%& unless it is the empty string. However, if the command line &%-f%& option is used, it overrides the &"From"& line. @@ -36359,7 +37089,8 @@ incoming SMTP message from a source that is not permitted to send them. .section "Header lines" .subsection "Resent- header lines" SECID220 .chindex Resent- -RFC 2822 makes provision for sets of header lines starting with the string +&url(https://www.rfc-editor.org/rfc/rfc2822,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:'&, &'Resent-From:'&, &'Resent-Sender:'&, &'Resent-To:'&, &'Resent-Cc:'&, @@ -36422,8 +37153,10 @@ Exim adds one, using the current date and time, unless the .subsection Delivery-date: SECID224 .cindex "&'Delivery-date:'& header line" .oindex "&%delivery_date_remove%&" -&'Delivery-date:'& 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 +&'Delivery-date:'& header lines are not part of the standard +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +header set. +Exim can be configured to add them to the final delivery of messages. (See the generic &%delivery_date_add%& transport option.) They should not be present in messages in transit. If the &%delivery_date_remove%& configuration option is set (the default), Exim removes &'Delivery-date:'& header lines from incoming @@ -36433,7 +37166,8 @@ messages. .subsection Envelope-to: SECID225 .chindex Envelope-to: .oindex "&%envelope_to_remove%&" -&'Envelope-to:'& header lines are not part of the standard RFC 2822 header set. +&'Envelope-to:'& header lines are not part of the standard +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) header set. Exim can be configured to add them to the final delivery of messages. (See the generic &%envelope_to_add%& transport option.) They should not be present in messages in transit. If the &%envelope_to_remove%& configuration option is set @@ -36519,8 +37253,11 @@ changed to the time of acceptance, which is (apart from a small delay while the .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 -header line), and section 3.14 of RFC 3834 (which states that automatic +section 3.64 of +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +(which states that replies should contain such a header line), +and section 3.14 of &url(https://datatracker.ietf.org/doc/html/rfc3834,RFC 3834) +(which states that automatic responses are not different in this respect). However, because some mail processing software does not cope well with very long header lines, no more than 12 message IDs are copied from the &'References:'& header line in the @@ -36622,8 +37359,9 @@ the transport cannot refer to the modified header lines, because such expansions all occur before the message is actually transported. For both routers and transports, the argument of a &%headers_add%& -option must be in the form of one or more RFC 2822 header lines, separated by -newlines (coded as &"\n"&). For example: +option must be in the form of one or more +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +header lines, separated by newlines (coded as &"\n"&). For example: .code headers_add = X-added-header: added by $primary_hostname\n\ X-added-second: another added header line @@ -36734,9 +37472,12 @@ The &%unknown_username%& option can be used to specify user names in cases when there is no password file entry. .cindex "RFC 2047" -In all cases, the user name is made to conform to RFC 2822 by quoting all or +In all cases, the user name is made to conform to +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +by quoting all or parts of it if necessary. In addition, if it contains any non-printing -characters, it is encoded as described in RFC 2047, which defines a way of +characters, it is encoded as described in +&url(https://www.rfc-editor.org/rfc/rfc2047,RFC 2047), which defines a way of including non-ASCII characters in header lines. The value of the &%headers_charset%& option specifies the name of the encoding that is used (the characters are assumed to be in this encoding). The setting of @@ -36748,7 +37489,8 @@ is, with codes greater than 127) count as printing characters or not. .section "Case of local parts" "SECID230" .cindex "case of local parts" .cindex "local part" "case of" -RFC 2822 states that the case of letters in the local parts of addresses cannot +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +states that the case of letters in the local parts of addresses cannot be assumed to be non-significant. Exim preserves the case of local parts of addresses, but by default it uses a lower-cased form when it is routing, because on most Unix systems, usernames are in lower case and case-insensitive @@ -36780,7 +37522,8 @@ local parts with the correct case in a case-sensitive manner. .section "Dots in local parts" "SECID231" .cindex "dot" "in local part" .cindex "local part" "dots in" -RFC 2822 forbids empty components in local parts. That is, an unquoted local +&url(https://www.rfc-editor.org/rfc/rfc2822,RFC 2822) +forbids empty components in local parts. That is, an unquoted local part may not begin or end with a dot, nor have two consecutive dots in the middle. However, it seems that many MTAs do not enforce this, so Exim permits empty components for compatibility. @@ -36883,8 +37626,9 @@ transport filter. If &%size_addition%& is set negative, the use of SIZE is suppressed. If the remote server advertises support for PIPELINING, Exim uses the -pipelining extension to SMTP (RFC 2197) to reduce the number of TCP/IP packets -required for the transaction. +pipelining extension to SMTP +(&url(https://datatracker.ietf.org/doc/html/rfc2197,RFC 2197)) +to reduce the number of TCP/IP packets required for the transaction. If the remote server advertises support for the STARTTLS command, and Exim was built to support TLS encryption, it tries to start a TLS session unless the @@ -36927,12 +37671,8 @@ See the next section for more detail about error handling. .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. @@ -37270,7 +38010,16 @@ RCPT failures. .subsection "The ETRN command" SECTETRN .cindex "ETRN" "processing" .cindex "ESMTP extensions" ETRN -RFC 1985 describes an ESMTP command called ETRN that is designed to +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. + +&url(https://www.rfc-editor.org/rfc/rfc1985,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 the ACL specified by &%acl_smtp_etrn%& in order to decide whether the command @@ -37323,6 +38072,161 @@ under its own uid and gid when receiving incoming SMTP, so it is not possible for it to change them before running the command. +.new +.subsection "The ATRN command, and ODMR" SECTODMR +.cindex ATRN processing +.cindex "ESMTP extensions" ATRN +.cindex ODMR provider +A second method for handling +On-Demand Message Reception (ODMR) +for intermittently-connecting destinations is specified by +&url(https://www.rfc-editor.org/rfc/rfc2645.html,RFC 2645). + +This describes an ESMTP command called ATRN which requests +a swap in server/client roles of the communicating SMTP endpoints, +and delivery of queued messages. +Note that this supports customers having IP addresses that +change frequently. + +Exim supports both the &"provider"& and &"customer"& sides of ODMR, +to use the terms of that specification. + +. need a sub-subsection here +.subsection "ODMR provider connection" SECTODMRPRDVR + +In the &"provider"& use case Exim is +initially an SMTP server, then transferring to an SMTP client +role if an ATRN command is accepted. + +.oindex "&%acl_smtp_atrn%&" +The command is only available if permitted by an ACL +specfied by the main-section &%acl_smtp_atrn%& option. +Per the standard, this should only be for a specific +provider port number (386, named "odmr"); +Exim should be configured to listen on that port +(in addition to other duties) via &%daemon_smtp_ports%& +or equivalent commandline options, and restrict the +advertising of the facility to the port: +.code +acl_smtp_atrn = ${if = {$received_port}{386} {check_atrn}{}} +.endd + +A recieved ATRN command will be rejected unless +authentication has previously been done on the connection. + +Any arguments supplied with an ATRN command are (per standard) +a comma-separated list of requested domains, +and will be available in the &$smtp_command_argument$& +variable. + +The ACL configured may return &"deny"& for any policy reaons +(for example, the authenticated user is not permitted the facility). +Otherwise it should use the ACL &"atrn_domains"& condition, +which returns true if there are queued messages for any of +the given list of domains. +If that condition fails the ACL should return &"defer"& +with a "453 You have no mail" response; +else it should return &"accept"&. + +For example (with default domain handling, and one possible de-taint method) : +.code +check_atrn: + warn set acl_m0 = clientdom.net + deny condition = ${if def:smtp_command_argument} + set acl_m0 = ${map \ + {<, $smtp_command_argument} \ + {${if inlist{$item}{clientdom.net:cl2dom.net} {$value}}} \ + } + condition = ${if !def:acl_m0} + defer !atrn_domains = <, $acl_m0 + message = 453 You have no mail + accept +.endd + +Acceptance by the ACL will result in a queue-run for messages +having addresses with the given domains. +A suitable router and transport must be configured for the deliveries. + +To access a named queue +.cindex queue named +the ACL should use a "queue =" modifier before the "atrn_domains" +condition. +If the ACL does not accept, re-set the queue to an empty value +so as to not disrupt any later SMTP operations on the connection. + +Use of the &"atrn_domains"& condition additionally sets up +the &$atrn_host$& variable, which can be used by a manualroute +router. Being otherwise empty, this router will decline in +other situations so can be safely placed in a general router chain. + +For example: +.code +begin routers +to_odmr_customer: + driver = manualroute + route_data = <;$atrn_host + transport = call_customer + +begin transports +call_customer: + driver = smtp +.endd + +Although not discssed in the specification document, +Exim supports use of ATRN within a STARTTLS- +or TLS-on-connect- encrypted connection +(which is wise if a plaintext authentication mechanism is used). +In such cases the TLS connection will remain open across the +role-swap, and be used for the sending of queued messages. + +Note that the RFC requires that the CRAM-MD5 authentication +method be supported. +Exim does not enforce this, but leaves it up to the configuration; +see chapter &<>&. + + +.subsection "ODMR customer connection" SECTODMRCUST +.cindex ODMR customer +Exim supports the &"customer"& side of ODMR, +with a command-line option &"-atrn"&& that requests a connection +to a given host, issuance of an ATRN command then operation +in SMTP server mode. +The option must be followed by two arguments. + +The first is the name or IP of the provider to be contacted. + +The second, which may be empty, should be a comma-separated list +of domains for which mail is to be requested. +Interpretation of the list is up to the provider; +an empty list is expected to result in some default being returned. + +The provider host is placed in &$domain$" for routing; +router and transport must be configured suitably to make the connection. +For example: +.code +begin routers +to_odmr_provider: + driver = manualroute + condition = ${if eq {$atrn_mode}{C}} + route_data = <;$domain + transport = call_provider + +begin transports +call_provider: + driver = smtp + port = odmr + hosts_try_auth = * + command_timeout = 10m +.endd + +Note that the specification requires a long timeout for the ATRN +command, to allow for scanning of queued messages. + +Configuration should also include client-side authentication +and processing for receiving messages. +.wen + + .section "Incoming local SMTP" "SECID238" .cindex "SMTP" "local incoming" @@ -37342,7 +38246,8 @@ This accepts SMTP messages from local processes without doing any other tests. -.section "Outgoing batched SMTP" "SECTbatchSMTP" +.section "Batched SMTP" "SECTgenbatchSMTP" +.subsection "Outgoing batched SMTP" "SECTbatchSMTP" .cindex "SMTP" "batched outgoing" .cindex "batched SMTP output" Both the &(appendfile)& and &(pipe)& transports can be used for handling @@ -37389,7 +38294,7 @@ message (unless there are more than 1000 recipients). -.section "Incoming batched SMTP" "SECTincomingbatchedSMTP" +.subsection "Incoming batched SMTP" "SECTincomingbatchedSMTP" .cindex "SMTP" "batched incoming" .cindex "batched SMTP input" The &%-bS%& command line option causes Exim to accept one or more messages by @@ -38459,7 +39364,7 @@ calls at each internal newline, and also after a maximum of 870 data characters. (This allows for a total syslog line length of 1024, when additions such as timestamps are added.) If you are running a syslog replacement that can handle lines longer than the 1024 characters allowed by -RFC 3164, you should set +&url(https://www.rfc-editor.org/rfc/rfc3164,RFC 3164), you should set .code SYSLOG_LONG_LINES=yes .endd @@ -38751,6 +39656,7 @@ the following table: .display &`A `& authenticator name (and optional id and sender) &`C `& SMTP confirmation on delivery +&`Ci `& connection identifier &` `& command list for &"no mail in SMTP session"& &`CV `& certificate verification status &`D `& duration of &"no mail in SMTP session"& @@ -38839,7 +39745,7 @@ logging and the message has a DKIM signature header. .section "Reducing or increasing what is logged" "SECTlogselector" .cindex "log" "selectors" By setting the &%log_selector%& global option, you can disable some of Exim's -default logging, or you can request additional logging. The value of +default logging to the main log, or you can request additional logging. The value of &%log_selector%& is made up of names preceded by plus or minus characters. For example: .code @@ -38853,18 +39759,19 @@ selection marked by asterisks: .irow &`address_rewrite`&   "address rewriting" .irow &`all_parents`&   "all parents in => lines" .irow &`arguments`&   "command line arguments" +.irow &`connection_id`&   "connection identifier" .irow &`connection_reject`& * "connection rejections" .irow &`delay_delivery`& * "immediate delivery delayed" .irow &`deliver_time`&   "time taken to attempt delivery" .irow &`delivery_size`&   "add &`S=`&&'nnn'& to => lines" .irow &`dkim`& * "DKIM verified domain on <= lines" -.irow &`dkim_verbose`&   "separate full DKIM verification result line, per signature" +.irow &`dkim_verbose`&   "separate full DKIM verification result line, per signature; DKIM signing" .irow &`dnslist_defer`& * "defers of DNS list (aka RBL) lookups" .irow &`dnssec`&   "DNSSEC secured lookups" .irow &`etrn`& * "ETRN commands" .irow &`host_lookup_failed`& * "as it says" .irow &`ident_timeout`&   "timeout for ident connection" -.irow &`incoming_interface`&   "local interface on <= and => lines" +.irow &`incoming_interface`&   "local interface & port on <= and => lines" .irow &`incoming_port`&   "remote port on <= lines" .irow &`lost_incoming_connection`& * "as it says (includes timeouts)" .irow &`millisec`&   "millisecond timestamps and RT,QT,DT,D times" @@ -38902,7 +39809,7 @@ selection marked by asterisks: .irow &`tls_peerdn`&   "TLS peer DN on <= and => lines" .irow &`tls_resumption`&   "append * to cipher field" .irow &`tls_sni`&   "TLS SNI on <= lines" -.irow &`unknown_in_list`&   "DNS lookup failed in list match" +.irow &`unknown_in_list`&   "lookup failed in list match" .irow &`all`&   "&*all of the above*&" .endtable See also the &%slow_lookup_log%& main configuration option, @@ -38948,11 +39855,19 @@ because the arguments are checked before the configuration file is read. The 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 rejections" +.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 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 @@ -38978,6 +39893,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. +Also, on message delivery lines signing information (domain and selector) +is added, tagged with DKIM=. .next .cindex "log" "dnslist defer" .cindex "DNS list" "logging defer" @@ -39044,7 +39961,8 @@ added to log entries and &'Received:'& header lines, following the IP address in square brackets, and separated from it by a colon. This is implemented by changing the value that is put in the &$sender_fullhost$& and &$sender_rcvhost$& variables. Recording the remote port number has become more -important with the widening use of NAT (see RFC 2505). +important with the widening use of NAT +(see &url(https://www.rfc-editor.org/rfc/rfc2505,RFC 2505)). .next .cindex "log" "dropped connection" &%lost_incoming_connection%&: A log line is written when an incoming SMTP @@ -39315,7 +40233,8 @@ added to the log line, preceded by SNI=. .next .cindex "log" "DNS failure in list" &%unknown_in_list%&: This setting causes a log entry to be written when the -result of a list match is failure because a DNS lookup failed. +result of a list match is failure because a DNS lookup failed, or because +a bad IP address was in the list. .endlist @@ -39369,6 +40288,7 @@ the next chapter. The utilities described here are: .irow &<>& &'exim_tidydb'& "clean up a hints database" .irow &<>& &'exim_fixdb'& "patch a hints database" .irow &<>& &'exim_lock'& "lock a mailbox file" +.irow &<>& &'exim_msgdate'& "Message Ids for humans (exim_msgdate)" .endtable Another utility that might be of use to sites with many MTAs is Tom Kistner's @@ -39870,18 +40790,20 @@ for remote hosts 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 Limiting the concurrency of specific transports (when &%max_parallel%& is set 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, @@ -39923,7 +40845,7 @@ cross-references. -.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 @@ -39972,7 +40894,7 @@ databases is likely to keep on increasing. -.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 @@ -40092,9 +41014,16 @@ exim_lock -q /var/spool/mail/spqr \ .endd Note that if a command is supplied, it must be entirely contained within the second argument &-- hence the quotes. -.ecindex IIDutils +.section "Message Ids for humans (exim_msgdate)" "SECTexim_msgdate" +.cindex "exim_msgdate" +The &'exim_msgdate'& utility is written by Andrew Aitchison and included in the Exim distribution. +This Perl script converts an Exim Mesage ID back into a human readable form. +For details of &'exim_msgdate'&'s options, run &'exim_msgdate'& with the &%--help%& option. + +Section &<>& (Message identification) describes Exim Mesage IDs. +.ecindex IIDutils . //////////////////////////////////////////////////////////////////////////// . //////////////////////////////////////////////////////////////////////////// @@ -40594,20 +41523,31 @@ will be used during message reception. .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. @@ -41300,7 +42240,7 @@ There is no dot-stuffing (and no dot-termination). DKIM is a mechanism by which messages sent by some entity can be provably linked to a domain which that entity controls. It permits reputation to be tracked on a per-domain basis, rather than merely upon source IP address. -DKIM is documented in RFC 6376. +DKIM is documented in &url(https://www.rfc-editor.org/rfc/rfc6376,RFC 6376). As DKIM relies on the message being unchanged in transit, messages handled by a mailing-list (which traditionally adds to the message) will not match @@ -41313,8 +42253,9 @@ Exim's DKIM implementation allows for .olist 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. +(including transport filters) except cutthrough delivery. +However, signing options may not depend on headers modified by +routers, the transport or a transport filter. .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 @@ -41350,7 +42291,8 @@ senders). .cindex DKIM signing For signing to be usable you must have published a DKIM record in DNS. -Note that RFC 8301 (which does not cover EC keys) says: +Note that &url(https://www.rfc-editor.org/rfc/rfc8301,RFC 8301) +(which does not cover EC keys) says: .code rsa-sha1 MUST NOT be used for signing or verifying. @@ -41419,11 +42361,13 @@ To generate keys under OpenSSL: 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. +See section 3.6 of &url(https://www.rfc-editor.org/rfc/rfc6376,RFC 6376) +for the record specification. Under GnuTLS: .code @@ -41431,13 +42375,14 @@ certtool --generate-privkey --rsa --bits=2048 --password='' -8 --outfile=dkim_rs certtool --load-privkey=dkim_rsa.private --pubkey-info .endd -Note that RFC 8301 says: +Note that &url(https://www.rfc-editor.org/rfc/rfc8301,RFC 8301) says: .code Signers MUST use RSA keys of at least 1024 bits for all keys. Signers SHOULD use RSA keys of at least 2048 bits. .endd -EC keys for DKIM are defined by RFC 8463. +EC keys for DKIM are defined by +&url(https://www.rfc-editor.org/rfc/rfc8463,RFC 8463). They are considerably smaller than RSA keys for equivalent protection. As they are a recent development, users should consider dual-signing (by setting a list of selectors, and an expansion for this option) @@ -41472,7 +42417,7 @@ Can be set to any one of the supported hash methods, which are: &`sha512`& &-- possibly more secure but less well supported .endlist -Note that RFC 8301 says: +Note that &url(https://www.rfc-editor.org/rfc/rfc8301,RFC 8301) says: .code rsa-sha1 MUST NOT be used for signing or verifying. .endd @@ -41500,9 +42445,10 @@ variables here. .option dkim_sign_headers smtp string&!! "see below" If set, this option must expand to a colon-separated list of header names. -Headers with these names, or the absence or such a header, will be included +Headers with these names, or the absence of such a header, will be included in the message signature. -When unspecified, the header names listed in RFC4871 will be used, +When unspecified, the header names listed in +&url(https://www.rfc-editor.org/rfc/rfc4871,RFC 4871) will be used, whether or not each header is present in the message. The default list is available for the expansion in the macro &"_DKIM_SIGN_HEADERS"& @@ -41522,12 +42468,12 @@ 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. -Otherwise, must be an unsigned number giving an offset in seconds from the current time -for the expiry tag -(eg. 1209600 for two weeks); -both creation (t=) and expiry (x=) tags will be included. +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). -RFC 6376 lists these tags as RECOMMENDED. +&url(https://www.rfc-editor.org/rfc/rfc6376,RFC 6376) +lists these tags as RECOMMENDED. .subsection "Verifying DKIM signatures in incoming mail" SECDKIMVFY @@ -41535,8 +42481,9 @@ RFC 6376 lists these tags as RECOMMENDED. Verification of DKIM signatures in SMTP incoming email is done for all messages for which an ACL control &%dkim_disable_verify%& has not been set. + .cindex DKIM "selecting signature algorithms" -Individual classes of signature algorithm can be ignored by changing +Individual classes of DKIM signature algorithm can be ignored by changing the main options &%dkim_verify_hashes%& or &%dkim_verify_keytypes%&. The &%dkim_verify_minimal%& option can be set to cease verification processing for a message once the first passing signature is found. @@ -41549,7 +42496,7 @@ For most purposes the default option settings suffice and the remainder of this section can be ignored. The results of verification are made available to the -&%acl_smtp_dkim%& ACL, which can examine and modify them. +&%acl_smtp_dkim%& ACL, which (for complex needs) can examine and modify them. A missing ACL definition defaults to accept. By default, the ACL is called once for each syntactically(!) correct signature in the incoming message. @@ -41614,6 +42561,12 @@ an identity. This is one of the list items from the expanded main option &%dkim_verify_signers%& (see above). .vitem &%$dkim_verify_status%& +So long as a DKIM ACL is defined +(it need do no more than accept, which is the default), +after all the DKIM ACL runs have completed, the value becomes a +colon-separated list of the values after each run. +The value is maintained for the MIME, PRDR and DATA ACLs. + Within the DKIM ACL, a string describing the general status of the signature. One of .ilist @@ -41642,11 +42595,6 @@ hash-method or key-size: set dkim_verify_reason = hash too weak or key too short .endd -So long as a DKIM ACL is defined (it need do no more than accept), -after all the DKIM ACL runs have completed, the value becomes a -colon-separated list of the values after each run. -This is maintained for the mime, prdr and data ACLs. - .vitem &%$dkim_verify_reason%& A string giving a little bit more detail when &%$dkim_verify_status%& is either "fail" or "invalid". One of @@ -41689,7 +42637,7 @@ may also be 'ed25519-sha256'. The "_CRYPTO_SIGN_ED25519" macro will be defined if support is present for EC keys. -Note that RFC 8301 says: +Note that &url(https://www.rfc-editor.org/rfc/rfc8301,RFC 8301) says: .code rsa-sha1 MUST NOT be used for signing or verifying. @@ -41711,7 +42659,8 @@ The header canonicalization method. One of 'relaxed' or 'simple'. .vitem &%$dkim_copiedheaders%& A transcript of headers and their values which are included in the signature (copied from the 'z=' tag of the signature). -Note that RFC6376 requires that verification fail if the From: header is +Note that &url(https://www.rfc-editor.org/rfc/rfc6376,RFC 6376) +requires that verification fail if the From: header is not included in the signature. Exim does not enforce this; sites wishing strict enforcement should code the check explicitly. @@ -41760,7 +42709,7 @@ Number of bits in the key. Valid only once the key is loaded, which is at the time the header signature is verified, which is after the body hash is. -Note that RFC 8301 says: +Note that &url(https://www.rfc-editor.org/rfc/rfc8301,RFC 8301) says: .code Verifiers MUST NOT consider signatures using RSA keys of less than 1024 bits as valid signatures. @@ -41777,7 +42726,9 @@ In addition, two ACL conditions are provided: .vitem &%dkim_signers%& ACL condition that checks a colon-separated list of domains or identities for a match against the domain or identity that the ACL is currently verifying -(reflected by &%$dkim_cur_signer%&). This is typically used to restrict an ACL +(reflected by &%$dkim_cur_signer%&). +This condition is only usable in a DKIM ACL. +This is typically used to restrict an ACL verb to a group of domains or identities. For example: .code @@ -41793,7 +42744,16 @@ for that check for empty &$h_DKIM-Signature:$& in the data ACL. .vitem &%dkim_status%& ACL condition that checks a colon-separated list of possible DKIM verification -results against the actual result of verification. This is typically used +results against the actual result of verification, +given by &$dkim_verify_status$& if that is non-empty or "none" if empty. +This condition may be used in DKIM, MIME, PRDR and DATA ACLs. + +A basic verification might be: +.code +deny !dkim_status = pass:none:invalid +.endd + +A more complex use could be to restrict an ACL verb to a list of verification outcomes, for example: .code @@ -41806,6 +42766,10 @@ deny sender_domains = paypal.com:paypal.de The possible status keywords are: 'none','invalid','fail' and 'pass'. Please 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 +(or any of the list of status values) +is any one of the supplied list. .endlist @@ -41815,7 +42779,8 @@ for more information of what they mean. .cindex SPF verification SPF is a mechanism whereby a domain may assert which IP addresses may transmit -messages with its domain in the envelope from, documented by RFC 7208. +messages with its domain in the envelope from, documented by +&url(https://www.rfc-editor.org/rfc/rfc7208,RFC 7208). For more information on SPF see &url(http://www.open-spf.org), a static copy of the &url(http://openspf.org). . --- 2019-10-28: still not https, open-spf.org is told to be a @@ -41829,6 +42794,12 @@ This includes retransmissions done by traditional forwarders. 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. @@ -42002,10 +42973,16 @@ The lookup will return the same result strings as can appear in .subsection "SRS (Sender Rewriting Scheme)" SECTSRS .cindex SRS "sender rewriting scheme" +.cindex VERP "variable envelope return path" SRS can be used to modify sender addresses when forwarding so that SPF verification does not object to them. -It operates by encoding the original envelope sender in a new +It can also be used to identify a received bounce message as +likely (or not) having been trigged by a message from the +local system, and for identifying dead addresses in mailing lists. +It is one implementation of a VERP (Variable Envelope Return Path) method. + +SRS operates by encoding the original envelope sender in a new sender local part and using a domain run by the forwarding site as the new domain for the sender. Any DSN message should be returned to this new sender at the forwarding site, which can extract the @@ -42039,18 +43016,28 @@ encoding operation. If this value is empty the the expansion result will be empty. The third argument should be the recipient domain of the message when it arrived at this system. +All arguments are expanded before use. + +The result of the expansion is the replacement envelope-from (return path) +to be used. .endlist .cindex SRS decoding To decode an address use this expansion condition: .vlist .vitem &*inbound_srs&~{*&<&'local&~part'&>&*}{*&<&'secret'&>&*}*& -The first argument should be the recipient local prt as is was received. +The first argument should be the recipient local part as it was received. The second argument is the site secret. +Both arguments are expanded before use. If the messages is not for an SRS-encoded recipient the condition will -return false. If it is, the condition will return true and the variable +return false. +If it is, the condition will return true and the variable &$srs_recipient$& will be set to the decoded (original) value. + +If the second argument is empty then the condition returns true if +the first argument is in valid SRS formet, else false. +The variable &$srs_recipient$& is not set for this case. .endlist Example usage: @@ -42085,15 +43072,17 @@ Example usage: 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 # one, plus the max_rcpt and return_path options remote_forwarded_smtp: driver = smtp - # modify the envelope from, for mails that we forward + # single-recipient so that $original_domain is valid max_rcpt = 1 + # modify the envelope from, for mails that we forward return_path = ${srs_encode {SRS_SECRET} {$return_path} {$original_domain}} .endd @@ -42107,14 +43096,14 @@ Example usage: 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. @@ -42200,7 +43189,7 @@ the DATA acl. .subsection ACL SSECDMARCACL .cindex DMARC "ACL condition" -DMARC checks cam be run on incoming SMTP messages by using the +DMARC checks can be run on incoming SMTP messages by using the &"dmarc_status"& ACL condition in the DATA ACL. You are required to call the &"spf"& condition first in the ACLs, then the &"dmarc_status"& condition. Putting this condition in the ACLs is required in order @@ -42264,6 +43253,18 @@ The domain which DMARC used to look up the DMARC policy record. The policy declared in the DMARC record. Valid values are "none", "reject" and "quarantine". It is blank when there is any error, including no DMARC record. + +.new +.vitem &$dmarc_alignment_spf$& +.vindex &$dmarc_alignment_spf$& +The result of the SPF alignment portion of the test status; +"yes" or "no". + +.vitem &$dmarc_alignment_dkim$& +.vindex &$dmarc_alignment_dkim$& +The result of the DKIM alignment portion of the test status; +"yes" or "no". +.wen .endlist .subsection Logging SSECDMARCLOGGING @@ -42428,19 +43429,23 @@ A possible solution is: .cindex proxy SOCKS .cindex SOCKS proxy Exim has support for sending outbound SMTP via a proxy -using a protocol called SOCKS5 (defined by RFC1928). +using a protocol called SOCKS5 (defined by +&url(https://www.rfc-editor.org/rfc/rfc1928,RFC 1928)). The support can be optionally included by defining SUPPORT_SOCKS=yes in Local/Makefile. Use of a proxy is enabled by setting the &%socks_proxy%& option on an smtp transport. -The option value is expanded and should then be a list +.new +If unset (or empty after expansion) then proxying is not done. +.wen +Otherwise, expansion should result in a list (colon-separated by default) of proxy specifiers. Each proxy specifier is a list (space-separated by default) where the initial element is an IP address and any subsequent elements are options. -Options are a string =. +Each option is a string of form =. The list of options is in the following table: .itable none 0 0 2 10* left 90* left .irow &'auth'& "authentication method" @@ -42458,7 +43463,8 @@ More details on each of these options follows: .cindex authentication "to proxy" .cindex proxy authentication &%auth%&: Either &"none"& (default) or &"name"&. -Using &"name"& selects username/password authentication per RFC 1929 +Using &"name"& selects username/password authentication per +&url(https://www.rfc-editor.org/rfc/rfc1929,RFC 1929) for access to the proxy. Default is &"none"&. .next @@ -42505,7 +43511,11 @@ This will add a component tagged with &"PRX="& to the line. Exim has support for Internationalised mail names. To include this it must be built with SUPPORT_I18N and the libidn library. -Standards supported are RFCs 2060, 5890, 6530 and 6533. +Standards supported are RFCs +&url(https://www.rfc-editor.org/rfc/rfc2060.html,2060), +&url(https://www.rfc-editor.org/rfc/rfc5890.html,5890), +&url(https://www.rfc-editor.org/rfc/rfc6530.html,6530) and +&url(https://www.rfc-editor.org/rfc/rfc6533.html,6533). If Exim is built with SUPPORT_I18N_2008 (in addition to SUPPORT_I18N, not instead of it) then IDNA2008 is supported; this adds an extra library @@ -42607,7 +43617,8 @@ The string is converted from the charset specified by the "headers charset" command (in a filter file) or &%headers_charset%& main configuration option (otherwise), to the -modified UTF-7 encoding specified by RFC 2060, +modified UTF-7 encoding specified by +&url(https://www.rfc-editor.org/rfc/rfc2060.html,RFC 2060), with the following exception: All occurrences of (which has to be a single character) are replaced with periods ("."), and all periods and slashes that are not @@ -42670,10 +43681,12 @@ Events have names which correspond to the point in process at which they fire. 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" @@ -42688,7 +43701,10 @@ The current list of events is: .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 @@ -42704,9 +43720,11 @@ should define the event action. 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" @@ -42718,7 +43736,10 @@ with the event type: .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$&. @@ -42748,14 +43769,17 @@ All other message types ignore the result string, and no other use is made of it. For a tcp:connect event, if the connection is being made to a proxy -then the address and port variables will be that of the proxy and not -the target system. +then the &$host_address$& and &$host_port$& variables +will be that of the proxy and not the target system. For tls:cert events, if GnuTLS is in use this will trigger only per chain element received on the connection. 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. + . //////////////////////////////////////////////////////////////////////////// . ////////////////////////////////////////////////////////////////////////////