Version 4.14 ------------ 1. Support has been added for PostgreSQL lookups to 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 only be used if the mail server runs on the same machine as the database server. A configuration line for PostgreSQL via Unix domain sockets looks like this: hide pgsql_servers = (/tmp/.s.PGSQL.5432)/db/user/password [:] In other words, instead of supplying a host name, a path to the socket is given. The path name is enclosed in parentheses so that its slashes aren't visually confused with the delimiters for the other server parameters. 2. The number of unknown SMTP commands that Exim will accept before dropping a connection can now be changed by smtp_max_unknown_commands. The default value is 3. Previously, a fixed value of 5 was used. 3. The configuration file now supports conditional skipping, using the "directives" .ifdef, .ifndef, .elifdef, .elifndef, .else, and .endif. The implementation is very simple. The first four of them should be followed by text which includes the names of one or macros. The condition that is tested is whether or not any macro substitution takes place in the line. Thus: .ifdef AAA message_size_limit = 50M .else message_size_limit = 100M .endif sets a message size limit of 50M if the macro AAA is defined, and 100 otherwise. If there is more than one macro named on the line, the condition is true if any of them are defined. That is, it is an "or" condition. To obtain an "and" condition, you need to use nested .ifdefs. Although you can use a macro expansion to generate one of these directives, it isn't very useful, because the condition "there was a macro substitution in this line" will always be true. Text following .else and .endif is ignored, and can be used as comment to clarify complicated nestings. 4. The crypt() function that can be used with the crypteq expansion condition uses only the first 8 characters of the cleartext password. Subsequent characters are ignored. At least one operating system has a crypt16() function (also known as "bigcrypt"), which uses up to 16 characters. Exim now has its own version of crypt16() (which is just a double call to crypt()) that can be used by putting "{crypt16}" in front of an encrypted password. For example: ${if crypteq{test}{\{crypt16\}azrazPWCQJhygdJWzb77lQMA}{yes}{no}} For operating systems that have their own version of crypt16(), setting HAVE_CRYPT16 in Local/Makefile when building lets Exim use the OS' version instead of its own. So far, I know of only one OS (OSF1, or whatever it is called this week) that has crypt16(), and I have set HAVE_CRYPT16 in its Makefile. If you don't put any curly bracket encryption type in a crypteq comparison, the default is either crypt() or crypt16(), as determined by the setting of DEFAULT_CRYPT in Local/Makefile. The default default is crypt(). Whatever the default, you can always use either function by specifying it explicitly in curly brackets. Note that if a password is no longer than 8 characters, the results of encrypting it with crypt() and crypt16() are identical. That means that crypt16() is backwards compatible, as long as nobody feeds it a password longer than 8 characters. 5. Previously, if a MySQL query was issued that did not request any data (an insert, update, or delete command), Exim gave a lookup error and deferred. This case is now recognized, and the result of the lookup is now the number of rows affected. 6. A new router condition called "address_test" (default true) can be used to skip routers when testing addresses using -bt (compare no_verify). This can be a convenience when your first router sends stuff to an external scanner. 7. There is a new generic authenticator server option called server_advertise_condition. When a server is about to advertise an authentication mechanism, the condition is expanded. If it yields the empty string, "0", "no", or "false", the mechanism is not advertised. This can be used, for example, to restrict the advertisement of PLAIN and LOGIN mechanisms to encrypted connections, by a setting such as server_advertise_condition = ${if eq{$tls_cipher}{}{no}{yes}} When an AUTH command is received, Exim recognizes only those mechanisms that it has actually advertised. 8. The ldap_version option can be used to force Exim to set a specific protocol version for LDAP. If this option is unset, it is shown by "exim -bP" as -1. When this is the case, the default is 3 if LDAP_VERSION3 is defined in the LDAP headers; otherwise it is 2. 9. The smtp transport now has an option called authenticated_sender. This to set a value for the AUTH= item on a MAIL command, overriding any existing authenticated sender value. The string is expanded; if expansion is forced to fail, the option is ignored. Other expansion failures cause delivery to be deferred. If the result of expansion is an empty string, that is also ignored. This option means that you can use the smtp transport in LMTP mode to deliver mail to Cyrus IMAP and provide the proper local part as the "authenticated_sender", via a setting such as authenticated_sender = $local_part This removes the need for IMAP subfolders to be assigned special ACLs to allow direct delivery to those subfolders. Because of expected uses such as that just described for Cyrus (when no domain is involved), there is no checking on the syntax of the provided value. 10. The exim_lock utility has a new option called -restore-times. When set, it causes exim_lock to restore the modified and read times to the the locked file before exiting. This allows you to access a locked mailbox (for example, to take a backup copy) without disturbing the times that the user subsequently sees. 11. When a header address is rewritten by a rule that includes the "w" flag, the parts of the new address outside <> are now encoded according to RFC 2047 if necessary (assuming ISO-8859-1 encoding). 12. There is a new expansion operator for doing RFC 2047 encoding explicitly: ${rfc2047:string} It is assumed that the input string is in ISO-8859-1 encoding. If the string contains only printing characters, and no instances of the characters ? = ( ) < > @ , ; : \ " . [ ] or _ it is not modified. Otherwise, the result is the RFC2047 encoding, as a single "coded word". 13. The world is slowly moving towards Unicode, although there are no standards for email yet. However, other applications (including some databases) are starting to store data in Unicode, using UTF-8 encoding. The Unicode code points with values less than 256 are compatible with ASCII and ISO-8859-1 (aka Latin-1), which of course are single-byte encodings. Exim now has an operator that can convert from a UTF-8 string to ISO-8859-1: ${from_utf8:string} UTF-8 code values greater than 255 are converted to underscores. The input must be a valid UTF-8 string. If it is not, the result is an undefined sequence of bytes. 14. The file names used for maildir messages now include the microsecond time fraction as well as the time in seconds, to cope with systems where the process id can be re-used within the same second. The format is now