The first part of the run time configuration file contains three types of item:
Macro definitions: These lines start with an upper case letter. See section 6.4 for details of macro processing.
Named list definitions: These lines start with one of the words “domainlist”, “hostlist”, “addresslist”, or “localpartlist”. Their use is described in section 10.5.
Main configuration settings: Each setting occupies one line of the file (with possible continuations). If any setting is preceded by the word “hide”, the -bP command line option displays its value to admin users only. See section 6.10 for a description of the syntax of these option settings.
This chapter specifies all the main configuration options, along with their types and default values. For ease of finding a particular option, they appear in alphabetical order in section 14.23 below. However, because there are now so many options, they are first listed briefly in functional groups, as an aid to finding the name of the option you are looking for. Some options are listed in more than one group.
| bi_command | to run for -bi command line option |
| disable_ipv6 | do no IPv6 processing |
| keep_malformed | for broken files – should not happen |
| localhost_number | for unique message ids in clusters |
| message_body_newlines | retain newlines in $message_body |
| message_body_visible | how much to show in $message_body |
| mua_wrapper | run in “MUA wrapper” mode |
| print_topbitchars | top-bit characters are printing |
| timezone | force time zone |
| exim_group | override compiled-in value |
| exim_path | override compiled-in value |
| exim_user | override compiled-in value |
| primary_hostname | default from uname() |
| split_spool_directory | use multiple directories |
| spool_directory | override compiled-in value |
| admin_groups | groups that are Exim admin users |
| deliver_drop_privilege | drop root for delivery processes |
| local_from_check | insert Sender: if necessary |
| local_from_prefix | for testing From: for local sender |
| local_from_suffix | for testing From: for local sender |
| local_sender_retain | keep Sender: from untrusted user |
| never_users | do not run deliveries as these |
| prod_requires_admin | forced delivery requires admin user |
| queue_list_requires_admin | queue listing requires admin user |
| trusted_groups | groups that are trusted |
| trusted_users | users that are trusted |
| hosts_connection_nolog | exemption from connect logging |
| log_file_path | override compiled-in value |
| log_selector | set/unset optional logging |
| log_timezone | add timezone to log lines |
| message_logs | create per-message logs |
| preserve_message_logs | after message completion |
| process_log_path | for SIGUSR1 and exiwhat |
| syslog_duplication | controls duplicate log lines on syslog |
| syslog_facility | set syslog “facility” field |
| syslog_processname | set syslog “ident” field |
| syslog_timestamp | timestamp syslog lines |
| write_rejectlog | control use of message log |
| auto_thaw | sets time for retrying frozen messages |
| freeze_tell | send message when freezing |
| move_frozen_messages | to another directory |
| timeout_frozen_after | keep frozen messages only so long |
| ibase_servers | InterBase servers |
| ldap_default_servers | used if no server in query |
| ldap_version | set protocol version |
| lookup_open_max | lookup files held open |
| mysql_servers | default MySQL servers |
| oracle_servers | Oracle servers |
| pgsql_servers | default PostgreSQL servers |
| sqlite_lock_timeout | as it says |
| message_id_header_domain | used to build Message-ID: header |
| message_id_header_text | ditto |
| perl_at_start | always start the interpreter |
| perl_startup | code to obey when starting Perl |
| daemon_smtp_ports | default ports |
| daemon_startup_retries | number of times to retry |
| daemon_startup_sleep | time to sleep between tries |
| extra_local_interfaces | not necessarily listened on |
| local_interfaces | on which to listen, with optional ports |
| pid_file_path | override compiled-in value |
| queue_run_max | maximum simultaneous queue runners |
| check_log_inodes | before accepting a message |
| check_log_space | before accepting a message |
| check_spool_inodes | before accepting a message |
| check_spool_space | before accepting a message |
| deliver_queue_load_max | no queue deliveries if load high |
| queue_only_load | queue incoming if load high |
| queue_only_load_latch | don’t re-evaluate load for each message |
| queue_run_max | maximum simultaneous queue runners |
| remote_max_parallel | parallel SMTP delivery per message |
| smtp_accept_max | simultaneous incoming connections |
| smtp_accept_max_nonmail | non-mail commands |
| smtp_accept_max_nonmail_hosts | hosts to which the limit applies |
| smtp_accept_max_per_connection | messages per connection |
| smtp_accept_max_per_host | connections from one host |
| smtp_accept_queue | queue mail if more connections |
| smtp_accept_queue_per_connection | queue if more messages per connection |
| smtp_accept_reserve | only reserve hosts if more connections |
| smtp_check_spool_space | from SIZE on MAIL command |
| smtp_connect_backlog | passed to TCP/IP stack |
| smtp_load_reserve | SMTP from reserved hosts if load high |
| smtp_reserve_hosts | these are the reserve hosts |
| acl_not_smtp | ACL for non-SMTP messages |
| acl_not_smtp_mime | ACL for non-SMTP MIME parts |
| acl_not_smtp_start | ACL for start of non-SMTP message |
| acl_smtp_auth | ACL for AUTH |
| acl_smtp_connect | ACL for connection |
| acl_smtp_data | ACL for DATA |
| acl_smtp_etrn | ACL for ETRN |
| acl_smtp_expn | ACL for EXPN |
| acl_smtp_helo | ACL for EHLO or HELO |
| acl_smtp_mail | ACL for MAIL |
| acl_smtp_mailauth | ACL for AUTH on MAIL command |
| acl_smtp_mime | ACL for MIME parts |
| acl_smtp_predata | ACL for start of data |
| acl_smtp_quit | ACL for QUIT |
| acl_smtp_rcpt | ACL for RCPT |
| acl_smtp_starttls | ACL for STARTTLS |
| acl_smtp_vrfy | ACL for VRFY |
| av_scanner | specify virus scanner |
| check_rfc2047_length | check length of RFC 2047 “encoded words” |
| dns_csa_search_limit | control CSA parent search depth |
| dns_csa_use_reverse | en/disable CSA IP reverse search |
| header_maxsize | total size of message header |
| header_line_maxsize | individual header line limit |
| helo_accept_junk_hosts | allow syntactic junk from these hosts |
| helo_allow_chars | allow illegal chars in HELO names |
| helo_lookup_domains | lookup hostname for these HELO names |
| helo_try_verify_hosts | HELO soft-checked for these hosts |
| helo_verify_hosts | HELO hard-checked for these hosts |
| host_lookup | host name looked up for these hosts |
| host_lookup_order | order of DNS and local name lookups |
| host_reject_connection | reject connection from these hosts |
| hosts_treat_as_local | useful in some cluster configurations |
| local_scan_timeout | timeout for local_scan() |
| message_size_limit | for all messages |
| percent_hack_domains | recognize %-hack for these domains |
| spamd_address | set interface to SpamAssassin |
| strict_acl_vars | object to unset ACL variables |
| callout_domain_negative_expire | timeout for negative domain cache item |
| callout_domain_positive_expire | timeout for positive domain cache item |
| callout_negative_expire | timeout for negative address cache item |
| callout_positive_expire | timeout for positive address cache item |
| callout_random_local_part | string to use for “random” testing |
| gnutls_require_kx | control GnuTLS key exchanges |
| gnutls_require_mac | control GnuTLS MAC algorithms |
| gnutls_require_protocols | control GnuTLS protocols |
| tls_advertise_hosts | advertise TLS to these hosts |
| tls_certificate | location of server certificate |
| tls_crl | certificate revocation list |
| tls_dhparam | DH parameters for server |
| tls_on_connect_ports | specify SSMTP (SMTPS) ports |
| tls_privatekey | location of server private key |
| tls_remember_esmtp | don’t reset after starting TLS |
| tls_require_ciphers | specify acceptable ciphers |
| tls_try_verify_hosts | try to verify client certificate |
| tls_verify_certificates | expected client certificates |
| tls_verify_hosts | insist on client certificate verify |
| finduser_retries | useful in NIS environments |
| gecos_name | used when creating Sender: |
| gecos_pattern | ditto |
| max_username_length | for systems that truncate |
| unknown_login | used when no login name found |
| unknown_username | ditto |
| uucp_from_pattern | for recognizing “From ” lines |
| uucp_from_sender | ditto |
| header_maxsize | total size of message header |
| header_line_maxsize | individual header line limit |
| message_size_limit | applies to all messages |
| percent_hack_domains | recognize %-hack for these domains |
| received_header_text | expanded to make Received: |
| received_headers_max | for mail loop detection |
| recipients_max | limit per message |
| recipients_max_reject | permanently reject excess recipients |
| receive_timeout | for non-SMTP messages |
See also the Policy controls section above.
| host_lookup | host name looked up for these hosts |
| host_lookup_order | order of DNS and local name lookups |
| recipient_unqualified_hosts | may send unqualified recipients |
| rfc1413_hosts | make ident calls to these hosts |
| rfc1413_query_timeout | zero disables ident calls |
| sender_unqualified_hosts | may send unqualified senders |
| smtp_accept_keepalive | some TCP/IP magic |
| smtp_accept_max | simultaneous incoming connections |
| smtp_accept_max_nonmail | non-mail commands |
| smtp_accept_max_nonmail_hosts | hosts to which the limit applies |
| smtp_accept_max_per_connection | messages per connection |
| smtp_accept_max_per_host | connections from one host |
| smtp_accept_queue | queue mail if more connections |
| smtp_accept_queue_per_connection | queue if more messages per connection |
| smtp_accept_reserve | only reserve hosts if more connections |
| smtp_active_hostname | host name to use in messages |
| smtp_banner | text for welcome banner |
| smtp_check_spool_space | from SIZE on MAIL command |
| smtp_connect_backlog | passed to TCP/IP stack |
| smtp_enforce_sync | of SMTP command/responses |
| smtp_etrn_command | what to run for ETRN |
| smtp_etrn_serialize | only one at once |
| smtp_load_reserve | only reserve hosts if this load |
| smtp_max_unknown_commands | before dropping connection |
| smtp_ratelimit_hosts | apply ratelimiting to these hosts |
| smtp_ratelimit_mail | ratelimit for MAIL commands |
| smtp_ratelimit_rcpt | ratelimit for RCPT commands |
| smtp_receive_timeout | per command or data line |
| smtp_reserve_hosts | these are the reserve hosts |
| smtp_return_error_details | give detail on rejections |
| accept_8bitmime | advertise 8BITMIME |
| auth_advertise_hosts | advertise AUTH to these hosts |
| ignore_fromline_hosts | allow “From ” from these hosts |
| ignore_fromline_local | allow “From ” from local SMTP |
| pipelining_advertise_hosts | advertise pipelining to these hosts |
| tls_advertise_hosts | advertise TLS to these hosts |
| allow_domain_literals | recognize domain literal syntax |
| allow_mx_to_ip | allow MX to point to IP address |
| allow_utf8_domains | in addresses |
| check_rfc2047_length | check length of RFC 2047 “encoded words” |
| delivery_date_remove | from incoming messages |
| envelope_to_remove | from incoming messages |
| extract_addresses_remove_arguments | affects -t processing |
| headers_charset | default for translations |
| qualify_domain | default for senders |
| qualify_recipient | default for recipients |
| return_path_remove | from incoming messages |
| strip_excess_angle_brackets | in addresses |
| strip_trailing_dot | at end of addresses |
| untrusted_set_sender | untrusted can set envelope sender |
| system_filter | locate system filter |
| system_filter_directory_transport | transport for delivery to a directory |
| system_filter_file_transport | transport for delivery to a file |
| system_filter_group | group for filter running |
| system_filter_pipe_transport | transport for delivery to a pipe |
| system_filter_reply_transport | transport for autoreply delivery |
| system_filter_user | user for filter running |
| disable_ipv6 | do no IPv6 processing |
| dns_again_means_nonexist | for broken domains |
| dns_check_names_pattern | pre-DNS syntax check |
| dns_ipv4_lookup | only v4 lookup for these domains |
| dns_retrans | parameter for resolver |
| dns_retry | parameter for resolver |
| hold_domains | hold delivery for these domains |
| local_interfaces | for routing checks |
| queue_domains | no immediate delivery for these |
| queue_only | no immediate delivery at all |
| queue_only_file | no immediate delivery if file exists |
| queue_only_load | no immediate delivery if load is high |
| queue_only_load_latch | don’t re-evaluate load for each message |
| queue_only_override | allow command line to override |
| queue_run_in_order | order of arrival |
| queue_run_max | of simultaneous queue runners |
| queue_smtp_domains | no immediate SMTP delivery for these |
| remote_max_parallel | parallel SMTP delivery per message |
| remote_sort_domains | order of remote deliveries |
| retry_data_expire | timeout for retry data |
| retry_interval_max | safety net for retry rules |
| bounce_message_file | content of bounce |
| bounce_message_text | content of bounce |
| bounce_return_body | include body if returning message |
| bounce_return_message | include original message in bounce |
| bounce_return_size_limit | limit on returned message |
| bounce_sender_authentication | send authenticated sender with bounce |
| dsn_from | set From: contents in bounces |
| errors_copy | copy bounce messages |
| errors_reply_to | Reply-to: in bounces |
| delay_warning | time schedule |
| delay_warning_condition | condition for warning messages |
| ignore_bounce_errors_after | discard undeliverable bounces |
| smtp_return_error_details | give detail on rejections |
| warn_message_file | content of warning message |
Those options that undergo string expansion before use are marked with †.
| accept_8bitmime | Use: main | Type: boolean | Default: false |
This option causes Exim to send 8BITMIME in its response to an SMTP EHLO command, and to accept the BODY= parameter on MAIL commands. However, though Exim is 8-bit clean, it is not a protocol converter, and it takes no steps to do anything special with messages received by this route. Consequently, this option is turned off by default.
| acl_not_smtp | Use: main | Type: string† | Default: unset |
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 40 for further details.
| acl_not_smtp_mime | Use: main | Type: string† | Default: unset |
This option defines the ACL that is run for individual MIME parts of non-SMTP messages. It operates in exactly the same way as acl_smtp_mime operates for SMTP messages.
| acl_not_smtp_start | Use: main | Type: string† | Default: unset |
This option defines the ACL that is run before Exim starts reading a non-SMTP message. See chapter 40 for further details.
| acl_smtp_auth | Use: main | Type: string† | Default: unset |
This option defines the ACL that is run when an SMTP AUTH command is received. See chapter 40 for further details.
| acl_smtp_connect | Use: main | Type: string† | Default: unset |
This option defines the ACL that is run when an SMTP connection is received. See chapter 40 for further details.
| acl_smtp_data | Use: main | Type: string† | Default: unset |
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 40 for further details.
| acl_smtp_etrn | Use: main | Type: string† | Default: unset |
This option defines the ACL that is run when an SMTP ETRN command is received. See chapter 40 for further details.
| acl_smtp_expn | Use: main | Type: string† | Default: unset |
This option defines the ACL that is run when an SMTP EXPN command is received. See chapter 40 for further details.
| acl_smtp_helo | Use: main | Type: string† | Default: unset |
This option defines the ACL that is run when an SMTP EHLO or HELO command is received. See chapter 40 for further details.
| acl_smtp_mail | Use: main | Type: string† | Default: unset |
This option defines the ACL that is run when an SMTP MAIL command is received. See chapter 40 for further details.
| acl_smtp_mailauth | Use: main | Type: string† | Default: unset |
This option defines the ACL that is run when there is an AUTH parameter on a MAIL command. See chapter 40 for details of ACLs, and chapter 33 for details of authentication.
| acl_smtp_mime | Use: main | Type: string† | Default: unset |
This option is available when Exim is built with the content-scanning extension. It defines the ACL that is run for each MIME part in a message. See section 41.4 for details.
| acl_smtp_predata | Use: main | Type: string† | Default: unset |
This option defines the ACL that is run when an SMTP DATA command is received, before the message itself is received. See chapter 40 for further details.
| acl_smtp_quit | Use: main | Type: string† | Default: unset |
This option defines the ACL that is run when an SMTP QUIT command is received. See chapter 40 for further details.
| acl_smtp_rcpt | Use: main | Type: string† | Default: unset |
This option defines the ACL that is run when an SMTP RCPT command is received. See chapter 40 for further details.
| acl_smtp_starttls | Use: main | Type: string† | Default: unset |
This option defines the ACL that is run when an SMTP STARTTLS command is received. See chapter 40 for further details.
| acl_smtp_vrfy | Use: main | Type: string† | Default: unset |
This option defines the ACL that is run when an SMTP VRFY command is received. See chapter 40 for further details.
| admin_groups | Use: main | Type: string list† | Default: unset |
This option is expanded just once, at the start of Exim’s processing. If the current group or any of the supplementary groups of an Exim caller is in this colon-separated list, the caller has admin privileges. If all your system programmers are in a specific group, for example, you can give them all Exim admin privileges by putting that group in admin_groups. However, this does not permit them to read Exim’s spool files (whose group owner is the Exim gid). To permit this, you have to add individuals to the Exim group.
| allow_domain_literals | Use: main | Type: boolean | Default: false |
If this option is set, the 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.
Unfortunately, it seems that some DNS black list maintainers are using this
format to report black listing to postmasters. If you want to accept messages
addressed to your hosts by IP address, you need to set
allow_domain_literals true, and also to add @[] to the list of local
domains (defined in the named domain list local_domains in the default
configuration). This “magic string” matches the domain literal form of all
the local host’s IP addresses.
| allow_mx_to_ip | Use: main | Type: boolean | Default: false |
It appears that more and more DNS zone administrators are breaking the rules and putting domain names that look like IP addresses on the right hand side of MX records. Exim follows the rules and rejects this, giving an error message that explains the mis-configuration. However, some other MTAs support this practice, so to avoid “Why can’t Exim do this?” complaints, allow_mx_to_ip exists, in order to enable this heinous activity. It is not recommended, except when you have no other choice.
| allow_utf8_domains | Use: main | Type: boolean | Default: false |
Lots of discussion is going on about internationalized domain names. One camp is strongly in favour of just using UTF-8 characters, and it seems that at least two other MTAs permit this. This option allows Exim users to experiment if they wish.
If it is set true, Exim’s domain parsing function allows valid UTF-8 multicharacters to appear in domain name components, in addition to letters, digits, and hyphens. However, just setting this option is not enough; if you want to look up these domain names in the DNS, you must also adjust the value of dns_check_names_pattern to match the extended form. A suitable setting is:
dns_check_names_pattern = (?i)^(?>(?(1)\.|())[a-z0-9\xc0-\xff]\ (?>[-a-z0-9\x80-\xff]*[a-z0-9\x80-\xbf])?)+$
Alternatively, you can just disable this feature by setting
dns_check_names_pattern =
That is, set the option to an empty string so that no check is done.
| auth_advertise_hosts | Use: main | Type: host list† | Default: * |
If any server authentication mechanisms are configured, Exim advertises them in response to an EHLO command only if the calling host matches this list. Otherwise, Exim does not advertise AUTH. Exim does not accept AUTH commands from clients to which it has not advertised the availability of AUTH. The advertising of individual authentication mechanisms can be controlled by the use of the server_advertise_condition generic authenticator option on the individual authenticators. See chapter 33 for further details.
Certain mail clients (for example, Netscape) require the user to provide a name and password for authentication if AUTH is advertised, even though it may not be needed (the host may accept messages from hosts on its local LAN without authentication, for example). The auth_advertise_hosts option can be used to make these clients more friendly by excluding them from the set of hosts to which Exim advertises AUTH.
If you want to advertise the availability of AUTH only when the connection is encrypted using TLS, you can make use of the fact that the value of this option is expanded, with a setting like this:
auth_advertise_hosts = ${if eq{$tls_cipher}{}{}{*}}
If $tls_cipher is empty, the session is not encrypted, and the result of the expansion is empty, thus matching no hosts. Otherwise, the result of the expansion is *, which matches all hosts.
| auto_thaw | Use: main | Type: time | Default: 0s |
If this option is set to a time greater than zero, a queue runner will try a new delivery attempt on any frozen message, other than a bounce message, if this much time has passed since it was frozen. This may result in the message being re-frozen if nothing has changed since the last attempt. It is a way of saying “keep on trying, even though there are big problems”.
Note: This is an old option, which predates timeout_frozen_after and ignore_bounce_errors_after. It is retained for compatibility, but it is not thought to be very useful any more, and its use should probably be avoided.
| av_scanner | Use: main | Type: string | Default: see below |
This option is available if Exim is built with the content-scanning extension. It specifies which anti-virus scanner to use. The default value is:
sophie:/var/run/sophie
If the value of av_scanner starts with dollar character, it is expanded before use. See section 41.1 for further details.
| bi_command | Use: main | Type: string | Default: unset |
This option supplies the name of a command that is run when Exim is called with the -bi option (see chapter 5). The string value is just the command name, it is not a complete command line. If an argument is required, it must come from the -oA command line option.
| bounce_message_file | Use: main | Type: string | Default: unset |
This option defines a template file containing paragraphs of text to be used for constructing bounce messages. Details of the file’s contents are given in chapter 46. See also warn_message_file.
| bounce_message_text | Use: main | Type: string | Default: unset |
When this option is set, its contents are included in the default bounce message immediately after “This message was created automatically by mail delivery software.” It is not used if bounce_message_file is set.
| bounce_return_body | Use: main | Type: boolean | Default: true |
This option controls whether the body of an incoming message is included in a bounce message when bounce_return_message is true. The default setting causes the entire message, both header and body, to be returned (subject to the value of bounce_return_size_limit). If this option is false, only the message header is included. In the case of a non-SMTP message containing an error that is detected during reception, only those header lines preceding the point at which the error was detected are returned.
| bounce_return_message | Use: main | Type: boolean | Default: true |
If this option is set false, none of the original message is included in bounce messages generated by Exim. See also bounce_return_size_limit and bounce_return_body.
| bounce_return_size_limit | Use: main | Type: integer | Default: 100K |
This option sets a limit in bytes on the size of messages that are returned to senders as part of bounce messages when bounce_return_message is true. The limit should be less than the value of the global message_size_limit and of any message_size_limit settings on transports, to allow for the bounce text that Exim generates. If this option is set to zero there is no limit.
When the body of any message that is to be included in a bounce message is greater than the limit, it is truncated, and a comment pointing this out is added at the top. The actual cutoff may be greater than the value given, owing to the use of buffering for transferring the message in chunks (typically 8K in size). The idea is to save bandwidth on those undeliverable 15-megabyte messages.
| bounce_sender_authentication | Use: main | Type: string | Default: unset |
This option provides an authenticated sender address that is sent with any bounce messages generated by Exim that are sent over an authenticated SMTP connection. A typical setting might be:
bounce_sender_authentication = mailer-daemon@my.domain.example
which would cause bounce messages to be sent using the SMTP command:
MAIL FROM:<> AUTH=mailer-daemon@my.domain.example
The value of bounce_sender_authentication must always be a complete email address.
| callout_domain_negative_expire | Use: main | Type: time | Default: 3h |
This option specifies the expiry time for negative callout cache data for a domain. See section 40.41 for details of callout verification, and section 40.43 for details of the caching.
| callout_domain_positive_expire | Use: main | Type: time | Default: 7d |
This option specifies the expiry time for positive callout cache data for a domain. See section 40.41 for details of callout verification, and section 40.43 for details of the caching.
| callout_negative_expire | Use: main | Type: time | Default: 2h |
This option specifies the expiry time for negative callout cache data for an address. See section 40.41 for details of callout verification, and section 40.43 for details of the caching.
| callout_positive_expire | Use: main | Type: time | Default: 24h |
This option specifies the expiry time for positive callout cache data for an address. See section 40.41 for details of callout verification, and section 40.43 for details of the caching.
| callout_random_local_part | Use: main | Type: string† | Default: see below |
This option defines the “random” local part that can be used as part of callout verification. The default value is
$primary_host_name-$tod_epoch-testing
See section 40.42 for details of how this value is used.
| check_log_inodes | Use: main | Type: integer | Default: 0 |
See check_spool_space below.
| check_log_space | Use: main | Type: integer | Default: 0 |
See check_spool_space below.
| check_rfc2047_length | Use: main | Type: boolean | Default: true |
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 exceed the maximum length. However, it seems that some software, in violation of the RFC, generates overlong encoded words. If check_rfc2047_length is set false, Exim recognizes encoded words of any length.
| check_spool_inodes | Use: main | Type: integer | Default: 0 |
See check_spool_space below.
| check_spool_space | Use: main | Type: integer | Default: 0 |
The four check_... options allow for checking of disk resources before a message is accepted.
When any of these options are set, they apply to all incoming messages. If you want to apply different checks to different kinds of message, you can do so by testing the variables $log_inodes, $log_space, $spool_inodes, and $spool_space in an ACL with appropriate additional conditions.
check_spool_space and check_spool_inodes check the spool partition if either value is greater than zero, for example:
check_spool_space = 10M check_spool_inodes = 100
The spool partition is the one that contains the directory defined by SPOOL_DIRECTORY in Local/Makefile. It is used for holding messages in transit.
check_log_space and check_log_inodes check the partition in which log files are written if either is greater than zero. These should be set only if log_file_path and spool_directory refer to different partitions.
If there is less space or fewer inodes than requested, Exim refuses to accept incoming mail. In the case of SMTP input this is done by giving a 452 temporary error response to the MAIL command. If ESMTP is in use and there was a SIZE parameter on the MAIL command, its value is added to the check_spool_space value, and the check is performed even if check_spool_space is zero, unless no_smtp_check_spool_space is set.
The values for check_spool_space and check_log_space are held as a number of kilobytes. If a non-multiple of 1024 is specified, it is rounded up.
For non-SMTP input and for batched SMTP input, the test is done at start-up; on failure a message is written to stderr and Exim exits with a non-zero code, as it obviously cannot send an error message of any kind.
| daemon_smtp_ports | Use: main | Type: string | Default: smtp |
This option specifies one or more default SMTP ports on which the Exim daemon listens. See chapter 13 for details of how it is used. For backward compatibility, daemon_smtp_port (singular) is a synonym.
| daemon_startup_retries | Use: main | Type: integer | Default: 9 |
This option, along with daemon_startup_sleep, controls 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.
| daemon_startup_sleep | Use: main | Type: time | Default: 30s |
See daemon_startup_retries.
| delay_warning | Use: main | Type: time list | Default: 24h |
When a message is delayed, Exim sends a warning message to the sender at intervals specified by this option. The data is a colon-separated list of times after which to send warning messages. If the value of the option is an empty string or a zero time, no warnings are sent. Up to 10 times may be given. If a message has been on the queue for longer than the last time, the last interval between the times is used to compute subsequent warning times. For example, with
delay_warning = 4h:8h:24h
the first message is sent after 4 hours, the second after 8 hours, and the third one after 24 hours. After that, messages are sent every 16 hours, because that is the interval between the last two times on the list. If you set just one time, it specifies the repeat interval. For example, with:
delay_warning = 6h
messages are repeated every six hours. To stop warnings after a given time, set a very large time at the end of the list. For example:
delay_warning = 2h:12h:99d
| delay_warning_condition | Use: main | Type: string† | Default: see below |
The string is expanded at the time a warning message might be sent. If all the deferred addresses have the same domain, it is set in $domain during the expansion. Otherwise $domain is empty. If the result of the expansion is a forced failure, an empty string, or a string matching any of “0”, “no” or “false” (the comparison being done caselessly) then the warning message is not sent. The default is:
delay_warning_condition = ${if or {\
{ !eq{$h_list-id:$h_list-post:$h_list-subscribe:}{} }\
{ match{$h_precedence:}{(?i)bulk|list|junk} }\
{ match{$h_auto-submitted:}{(?i)auto-generated|auto-replied} }\
} {no}{yes}}
This suppresses the sending of warnings for messages that contain List-ID:, List-Post:, or List-Subscribe: headers, or have “bulk”, “list” or “junk” in a Precedence: header, or have “auto-generated” or “auto-replied” in an Auto-Submitted: header.
| deliver_drop_privilege | Use: main | Type: boolean | Default: false |
If this option is set true, Exim drops its root privilege at the start of a delivery process, and runs as the Exim user throughout. This severely restricts the kinds of local delivery that are possible, but is viable in certain types of configuration. There is a discussion about the use of root privilege in chapter 52.
| deliver_queue_load_max | Use: main | Type: fixed-point | Default: unset |
When this option is set, a queue run is abandoned if the system load average becomes greater than the value of the option. The option has no effect on ancient operating systems on which Exim cannot determine the load average. See also queue_only_load and smtp_load_reserve.
| delivery_date_remove | Use: main | Type: boolean | Default: true |
Exim’s transports have an option for adding a Delivery-date: header to a message when it is delivered, in exactly the same way as Return-path: is handled. Delivery-date: records the actual time of delivery. Such headers should not be present in incoming messages, and this option causes them to be removed at the time the message is received, to avoid any problems that might occur when a delivered message is subsequently sent on to some other recipient.
| disable_fsync | Use: main | Type: boolean | Default: false |
This option is available only if Exim was built with the compile-time option ENABLE_DISABLE_FSYNC. When this is not set, a reference to disable_fsync in a runtime configuration generates an “unknown option” error. You should not build Exim with ENABLE_DISABLE_FSYNC or set disable_fsync unless you really, really, really understand what you are doing. No pre-compiled distributions of Exim should ever make this option available.
When disable_fsync is set true, Exim no longer calls fsync() to force updated files’ data to be written to disc before continuing. Unexpected events such as crashes and power outages may cause data to be lost or scrambled. Here be Dragons. Beware.
| disable_ipv6 | Use: main | Type: boolean | Default: false |
If this option is set true, even if the Exim binary has IPv6 support, no IPv6 activities take place. AAAA records are never looked up, and any IPv6 addresses that are listed in local_interfaces, data for the manualroute router, etc. are ignored. If IP literals are enabled, the ipliteral router declines to handle IPv6 literal addresses.
| dns_again_means_nonexist | Use: main | Type: domain list† | Default: unset |
DNS lookups give a “try again” response for the DNS errors “non-authoritative host not found” and “SERVERFAIL”. This can cause Exim to keep trying to deliver a message, or to give repeated temporary errors to incoming mail. Sometimes the effect is caused by a badly set up name server and may persist for a long time. If a domain which exhibits this problem matches anything in dns_again_means_nonexist, it is treated as if it did not exist. This option should be used with care. You can make it apply to reverse lookups by a setting such as this:
dns_again_means_nonexist = *.in-addr.arpa
This option applies to all DNS lookups that Exim does. 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 when lookups for MX or SRV records give temporary errors. These more specific options are applied after this global option.
| dns_check_names_pattern | Use: main | Type: string | Default: see below |
When this option is set to a non-empty string, it causes Exim to check domain names for characters that are not allowed in host names before handing them to the DNS resolver, because some resolvers give temporary errors for names that contain unusual characters. If a domain name contains any unwanted characters, a “not found” result is forced, and the resolver is not called. The check is done by matching the domain name against a regular expression, which is the value of this option. The default pattern is
dns_check_names_pattern = \ (?i)^(?>(?(1)\.|())[^\W_](?>[a-z0-9/-]*[^\W_])?)+$
which permits only letters, digits, slashes, and hyphens in components, but they must start and end with a letter or digit. Slashes are not, in fact, permitted in host names, but they are found in certain NS records (which can be accessed in Exim by using a dnsdb lookup). If you set allow_utf8_domains, you must modify this pattern, or set the option to an empty string.
| dns_csa_search_limit | Use: main | Type: integer | Default: 5 |
This option controls the depth of parental searching for CSA SRV records in the DNS, as described in more detail in section 40.46.
| dns_csa_use_reverse | Use: main | Type: boolean | Default: true |
This option controls whether or not an IP address, given as a CSA domain, is reversed and looked up in the reverse DNS, as described in more detail in section 40.46.
| dns_ipv4_lookup | Use: main | Type: domain list† | Default: unset |
When Exim is compiled with IPv6 support and disable_ipv6 is not set, it looks for IPv6 address records (AAAA records) as well as IPv4 address records (A records) when trying to find IP addresses for hosts, unless the host’s domain matches this list.
This is a fudge to help with name servers that give big delays or otherwise do not work for the AAAA record type. In due course, when the world’s name servers have all been upgraded, there should be no need for this option.
| dns_retrans | Use: main | Type: time | Default: 0s |
The options dns_retrans and dns_retry can be used to set the retransmission and retry parameters for DNS lookups. Values of zero (the defaults) leave the system default settings unchanged. The first value is the time between retries, and the second is the number of retries. It isn’t totally clear exactly how these settings affect the total time a DNS lookup may take. I haven’t found any documentation about timeouts on DNS lookups; these parameter values are available in the external resolver interface structure, but nowhere does it seem to describe how they are used or what you might want to set in them.
| dns_retry | Use: main | Type: integer | Default: 0 |
See dns_retrans above.
| drop_cr | Use: main | Type: boolean | Default: false |
This is an obsolete option that is now a no-op. It used to affect the way Exim handled CR and LF characters in incoming messages. What happens now is described in section 44.2.
| dsn_from | Use: main | Type: string† | Default: see below |
This option can be used to vary the contents of From: header lines in bounces and other automatically generated messages (“Delivery Status Notifications” – hence the name of the option). The default setting is:
dsn_from = Mail Delivery System <Mailer-Daemon@$qualify_domain>
The value is expanded every time it is needed. If the expansion fails, a panic is logged, and the default value is used.
| envelope_to_remove | Use: main | Type: boolean | Default: true |
Exim’s transports have an option for adding an Envelope-to: header to a message when it is delivered, in exactly the same way as Return-path: is handled. Envelope-to: records the original recipient address from the messages’s envelope that caused the delivery to happen. Such headers should not be present in incoming messages, and this option causes them to be removed at the time the message is received, to avoid any problems that might occur when a delivered message is subsequently sent on to some other recipient.
| errors_copy | Use: main | Type: string list† | Default: unset |
Setting this option causes Exim to send bcc copies of bounce messages that it generates to other addresses. Note: This does not apply to bounce messages coming from elsewhere. The value of the option is a colon-separated list of items. Each item consists of a pattern, terminated by white space, followed by a comma-separated list of email addresses. If a pattern contains spaces, it must be enclosed in double quotes.
Each pattern is processed in the same way as a single item in an address list (see section 10.19). When a pattern matches the recipient of the bounce message, the message is copied to the addresses on the list. The items are scanned in order, and once a matching one is found, no further items are examined. For example:
errors_copy = spqr@mydomain postmaster@mydomain.example :\
rqps@mydomain hostmaster@mydomain.example,\
postmaster@mydomain.example
The address list is expanded before use. The expansion variables $local_part and $domain are set from the original recipient of the error message, and if there was any wildcard matching in the pattern, the expansion variables $0, $1, etc. are set in the normal way.
| errors_reply_to | Use: main | Type: string | Default: unset |
By default, Exim’s bounce and delivery warning messages contain the header line
From: Mail Delivery System <Mailer-Daemon@qualify-domain>where qualify-domain is the value of the qualify_domain option. A warning message that is generated by the quota_warn_message option in an appendfile transport may contain its own From: header line that overrides the default.
Experience shows that people reply to bounce messages. If the errors_reply_to option is set, a Reply-To: header is added to bounce and warning messages. For example:
errors_reply_to = postmaster@my.domain.example
The value of the option is not expanded. It must specify a valid 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 not used.
| exim_group | Use: main | Type: string | Default: compile-time configured |
This option changes the gid under which Exim runs when it gives up root privilege. The default value is compiled into the binary. The value of this option is used only when exim_user is also set. Unless it consists entirely of digits, the string is looked up using getgrnam(), and failure causes a configuration error. See chapter 52 for a discussion of security issues.
| exim_path | Use: main | Type: string | Default: see below |
This option specifies the path name of the Exim binary, which is used when Exim needs to re-exec itself. The default is set up to point to the file exim in the directory configured at compile time by the BIN_DIRECTORY setting. It is necessary to change exim_path if, exceptionally, Exim is run from some other place. Warning: Do not use a macro to define the value of this option, because you will break those Exim utilities that scan the configuration file to find where the binary is. (They then use the -bP option to extract option settings such as the value of spool_directory.)
| exim_user | Use: main | Type: string | Default: compile-time configured |
This option changes the uid under which Exim runs when it gives up root privilege. The default value is compiled into the binary. Ownership of the run time configuration file and the use of the -C and -D command line options is checked against the values in the binary, not what is set here.
Unless it consists entirely of digits, the string is looked up using getpwnam(), and failure causes a configuration error. If exim_group is not also supplied, the gid is taken from the result of getpwnam() if it is used. See chapter 52 for a discussion of security issues.
| extra_local_interfaces | Use: main | Type: string list | Default: unset |
This option defines network interfaces that are to be considered local when routing, but which are not used for listening by the daemon. See section 13.8 for details.
| extract_addresses_remove_ arguments | Use: main | Type: boolean | Default: true |
According to some Sendmail documentation (Sun, IRIX, HP-UX), if any addresses are present on the command line when the -t option is used to build an envelope from a message’s To:, Cc: and Bcc: headers, the command line addresses are removed from the recipients list. This is also how Smail behaves. However, other Sendmail documentation (the O’Reilly book) states that command line addresses are added to those obtained from the header lines. When extract_addresses_remove_arguments is true (the default), Exim subtracts argument headers. If it is set false, Exim adds rather than removes argument addresses.
| finduser_retries | Use: main | Type: integer | Default: 0 |
On systems running NIS or other schemes in which user and group information is distributed from a remote system, there can be times when getpwnam() and related functions fail, even when given valid data, because things time out. Unfortunately these failures cannot be distinguished from genuine “not found” errors. If finduser_retries is set greater than zero, Exim will try that many extra times to find a user or a group, waiting for one second between retries.
You should not set this option greater than zero if your user information is in a traditional /etc/passwd file, because it will cause Exim needlessly to search the file multiple times for non-existent users, and also cause delay.
| freeze_tell | Use: main | Type: string list, comma separated | Default: unset |
On encountering certain errors, or when configured to do so in a system filter, ACL, or special router, Exim freezes a m