[init]
authorHeiko Schlittermann (JUMPER) <hs@schlittermann.de>
Wed, 19 Nov 2014 02:00:33 +0100
changeset 0 79625f55bc22
child 1 a7e0086fc464
[init]
blueprint
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/blueprint	Wed Nov 19 02:00:33 2014 +0100
@@ -0,0 +1,1232 @@
+Konfig im Detail
+----------------
+
+# Welche Konfiguration wird eingelesen?
+
+    > exim -bV | tail -n 1
+    TODO: exim -be '$config_file'
+
+# Wann wird die Konfiguration eingelesen?
+
+    - Klar - beim Start
+    - Aber - wann wird gestartet?
+        - Start Daemon
+        - Signal HUP
+        - re-exec for verschiedene Zwecke
+    - Achtung: 
+        - exim4.conf + .include ist "statisch"
+        - lists, lookups, … "dynamisch"
+    - Config-Parser: nur simple Syntax-Checks
+    - trim, "de-comment"
+
+# Syntax der Konfiguration
+
+## Macros und …
+    - Macros - Text-Ersatz während des Einlesens,
+      ggf. bedingt über .ifdef
+    - .include, .include_ifexists
+
+    > exim -DFOO=bar -C <(echo primary_hostname = FOO) -bP primary_hostname
+
+## Options
+    - statische Namen
+    - benamst Listen
+    - Instanzen von Routern, Transports, ..
+
+## Values
+
+### bool
+    Format: true|yes|false|no
+        <option>          eg: split_spool_directory
+        no_<option>       eg: no_split_spool_directory
+        not_<option>      eg: not_split_spool_directory
+
+
+    +---------------------+---------+-------------+--------------+
+    |split_spool_directory|Use: main|Type: boolean|Default: false|
+    +---------------------+---------+-------------+--------------+
+    > exim -C <(echo split_spool_directory = no) -bP split_spool_directory
+
+
+### integer:
+    Format: <n>[<suffix>]     eg: 27M
+           0<n>[<suffix>]     eg: 01000M
+          0x<n>[<suffix>]     eg: 0xFFFFK
+        suffix: k|m
+
+    +-----------------+---------+-------------+----------+
+    |check_spool_space|Use: main|Type: integer|Default: 0|
+    +-----------------+---------+-------------+----------+
+    > exim -C <(echo check_spool_space = 01000M) -bP check_spool_space
+
+### fixed-point
+    Format: <i>[.d[d[d]]]     eg: 0.234
+
+    +----------------------+---------+-----------------+--------------+
+    |deliver_queue_load_max|Use: main|Type: fixed-point|Default: unset|
+    +----------------------+---------+-----------------+--------------+
+    > exim -C <(echo deliver_queue_load_max = 3.3) -bP deliver_queue_load_max
+
+### time intervals
+    Format: n<suffix>...      eg: 2w3d
+            suffix: s|m|h|d|w
+
+    +---------+---------+----------+-----------+
+    |auto_thaw|Use: main|Type: time|Default: 0s|
+    +---------+---------+----------+-----------+
+    > exim -C <(echo auto_thaw = 0s) -bP auto_thaw
+
+### strings
+    Fromat: <string>           eg: localhost
+            <"string">         eg: " A\x42C"
+
+    Quoting für \\, \n, \r, \t, \ddd, \xdd und führende oder baumelnde Spaces
+
+    - Vorsicht: Expansion
+    - Vorsicht: User/Groups
+
+    +----------------+---------+------------+------------------+
+    |primary_hostname|Use: main|Type: string|Default: see below|
+    +----------------+---------+------------+------------------+
+    > exim -C <(echo 'primary_hostname = a\x41b')   -bP primary_hostname
+    > exim -C <(echo 'primary_hostname = "a\x41b"') -bP primary_hostname
+
+    Steuerzeichen werden für die Ausgabe escaped:
+    > exim -C <(echo 'primary_hostname = "a\x091b"') -bP primary_hostname
+
+
+### Lists
+    Format: <item>:…            eg:   a:b:c:d vs. a:b::c:d
+                                eg:   :   -> ein leeres Element
+        [<<sep> <item><sep>…]   eg:   <, a,b,c
+
+      - leere Felder am Ende werden „gestrippt“
+      - Whitespace der Felder wird gestrippt
+      - leeres Feld in der Mitte: a: :b
+      - leeres Felder am Anfang bleibt
+
+    > exim -be '-be '${map{<, ,a,b,,, ,c,}{<$item>}}'
+
+### Regexp
+    Format ^…
+
+    Beginnt mit ^, damit es sich von einem normalen String unterscheidet!
+    Achtung, Backslash ggf. vom String-Expander gefressen,
+    hauptsächlich in Listen, die RE enthalten dürfen
+
+    Ggf. mit \N..\N 
+
+## Lookups
+
+    - 2 Syntaxen
+    - 2 Types
+    => 4 Varianten
+
+### Syntax 1: explizit - der Key oder die Frage wird ausdrücklich formuliert
+              es ist ein String-Expansion. s.u.
+
+    ${lookup{<key>}<type>{file}}    eg: ${lookup{$domain}dsearch{/etc/exim4/domains}}
+    ${lookup <type> {<query>}}      eg: ${lookup ldap {ldap:///o=roka?mail?sub?uid=${quote_ldap:$local_part}}}
+
+    Liefert eine Liste zurück, ggf. Listentrenner unorthodox und muss massiert werden
+
+### Syntax 2: implizit - der Key ergibt sich aus dem Kontext
+              keine Stringexpansion, sondern ein Element für sich
+
+
+    <type>;<file>                   eg: domains = dsearch;/etc/exim4/domains
+    <type>;<query>                  eg: sqlite;/etc/db.sqlite SELECT … WHERE ${quote_sqlite:$local_part} …
+                                        ldap;ldap:///o=roka?mail?sub?…
+
+    - Auffindes des "impliziten" Keys
+    - Query: Success der Query ist entscheidend, nicht der Resultat-Wert
+    - Achtung: In einer Liste ggf. an den Listentrenner denken!
+               domains = ldap;ldap::///o=…
+
+### Style 1: Single Key
+
+    ${lookup{<key>}<type>{<file>}   eg: ${lookup{$sender_host_address}iplsearch{/etc/exim4/blacklist}}
+    <type>;<file>                   eg: hosts = iplsearch;/etc/exim4/blacklist
+
+    <type> ist dann lsearch, dsearch, iplsearch, …
+    
+### Style 2: Query Style
+
+    ${lookup <type> {<query>}}      eg: ${lookup dnsdb{mxh=roka.net}}
+    <type>;<query>                  eg: dnsdb;mxh=roka.net
+
+
+    Matrix
+
+        style|  single key                    | query style
+    syntax  \|                                |
+    ---------+--------------------------------+---------------------------
+    explicit |  ${lookup{<key>}<type>{<file>} | ${lookup <type> {<query>}}
+    implizit |  <type>;<file>                 | [ <type>;<query> ]
+
+
+    eg. config:
+
+    domains = ${lookup{$domain}lsearch{/etc/exim4/local_domains}}   # WRONG
+            = <\n ${lookup mysql { SELECT domain FROM domains }}    # BETTER
+            = ${lookup mysql { SELECT DISTINCT(domain) FROM domains WHERE domain = $domain}} # ggf BEST
+    vs
+    domains = lsearch;/etc/exim4/local_domains                      # OK
+
+
+## Named Lists
+   Format: <listtype> <name>
+           <listtype>_cache <name>
+           Bezug: +<name>
+
+    Typen: domainlist, hostlist, addresslist, localpartlist
+    Caching nur wenn die RHS keine '$' enthält, also konstante Ergebnisse zu erwarten sind.
+
+    Jeder Listtyp hat seine Eigenarten.
+
+### domainlist
+
+    domainlist - @, @mx_primary, @mx_secondary, @mx_any, <pattern>, lookup, literal
+    hostlist   - Namen, Adressen spec(10.11 ff)
+
+
+## String-Expansion
+
+    - von links nach rechts: $ und \ wirken als Trigger
+
+    > exim -be <string>
+    > exim -bem <message-file> <string>
+    > exim -be -Mset <spool-id> <string>
+
+    eg: exim -be '$primary_hostname'
+        exim -be '$tod_full'
+        exim -bem <(echo 'Subject: Hi') '$h_subject:'
+
+    Expansionen liefern neuen Text zurück oder können „forced expansion failure“
+    bewirken
+
+## Expansions-Items
+
+### Variablen
+    Format: $<variable>           eg: $localhost_number
+              ${<variable>}     
+### Operatoren
+    Format: ${<op>:<string>}
+    Für einfache Expansionen, lc, uc, hash, …
+
+### Funktionen
+    Format ${<function>{string1}...}
+
+# Debugging
+
+## Konfiguration
+   
+   - > exim -bV
+
+## Routing / Transport
+
+    > exim -bt  <address>
+
+    > exim -bt  <address>
+    > exim -bts <address>
+
+    Routing, Fake-Delivery
+    > exim -N < <message-file>
+
+    Fake-SMTP-Session
+    > exim -bh <sender-ip>
+    
+   - debug_print Option für Router und Transports
+
+
+### Minimalkonfiguration
+
+       .-[ m.conf ]-------- {{{
+       |exim_user = exim
+       |spool_directory = /tmp/exim-spool
+       |log_file_path = 
+       |
+       |begin routers
+       |
+       |    default:
+       |        driver = accept
+       |        transport = null
+       |        no_more
+       |
+       |begin transports
+       |
+       |    null:
+       |        driver = appendfile
+       |        file = /dev/null
+       `-------------        }}}
+
+
+# Routing
+
+  - Preconditions
+  - Driver und Driver-Options
+    Result: - accept  -> DONE (transport oder neue Adresse)
+            - pass    -> pass_router (bzw. nächster Router)
+            - decline -> nächster Router (or fail, wenn no_more)
+            - fail    -> DONE (bounce)
+            - defer   -> Semi-DONE (re-queue)
+            - error   -> wie defer
+
+# DNS Lookups
+
+## DNSSEC
+  dns_dnssec_ok = 1
+
+  dnslookup.dnssec_require_domains = 
+       smtp.dnssec_require_domains = 
+  dnslookup.dnssec_request_domains = 
+       smtp.dnssec_request_domains = 
+
+# Anhang
+
+## Misc
+
+    Spec.txt durchsuchen (less):
+    - Option        /^.<option>         eg: |exim_user|
+    - Variable      /^\$[^{]            eg: $localhost_number
+    - Operators:    /^\$\{<operator>    eg: ${hash:<string>} …
+    - Condition:    /^<condition> \{    eg: eq {<string1>}{<string2>} …
+    - Functions:    /^\$\{              eg: ${map{<string1>}{<string2>}} …
+
+## List of Options {{{
+
+    |accept_8bitmime|Use: main|Type: boolean|Default: true|
+    |acl_not_smtp|Use: main|Type: string*|Default: unset|
+    |acl_not_smtp_mime|Use: main|Type: string*|Default: unset|
+    |acl_not_smtp_start|Use: main|Type: string*|Default: unset|
+    |acl_smtp_auth|Use: main|Type: string*|Default: unset|
+    |acl_smtp_connect|Use: main|Type: string*|Default: unset|
+    |acl_smtp_data|Use: main|Type: string*|Default: unset|
+    |acl_smtp_data_prdr|Use: main|Type: string*|Default: unset|
+    |acl_smtp_etrn|Use: main|Type: string*|Default: unset|
+    |acl_smtp_expn|Use: main|Type: string*|Default: unset|
+    |acl_smtp_helo|Use: main|Type: string*|Default: unset|
+    |acl_smtp_mail|Use: main|Type: string*|Default: unset|
+    |acl_smtp_mailauth|Use: main|Type: string*|Default: unset|
+    |acl_smtp_mime|Use: main|Type: string*|Default: unset|
+    |acl_smtp_predata|Use: main|Type: string*|Default: unset|
+    |acl_smtp_quit|Use: main|Type: string*|Default: unset|
+    |acl_smtp_rcpt|Use: main|Type: string*|Default: unset|
+    |acl_smtp_starttls|Use: main|Type: string*|Default: unset|
+    |acl_smtp_vrfy|Use: main|Type: string*|Default: unset|
+    |admin_groups|Use: main|Type: string list*|Default: unset|
+    |allow_domain_literals|Use: main|Type: boolean|Default: false|
+    |allow_mx_to_ip|Use: main|Type: boolean|Default: false|
+    |allow_utf8_domains|Use: main|Type: boolean|Default: false|
+    |auth_advertise_hosts|Use: main|Type: host list*|Default: *|
+    |auto_thaw|Use: main|Type: time|Default: 0s|
+    |av_scanner|Use: main|Type: string|Default: see below|
+    |bi_command|Use: main|Type: string|Default: unset|
+    |bounce_message_file|Use: main|Type: string|Default: unset|
+    |bounce_message_text|Use: main|Type: string|Default: unset|
+    |bounce_return_body|Use: main|Type: boolean|Default: true|
+    |bounce_return_message|Use: main|Type: boolean|Default: true|
+    |bounce_return_size_limit|Use: main|Type: integer|Default: 100K|
+    |bounce_sender_authentication|Use: main|Type: string|Default: unset|
+    |callout_domain_negative_expire|Use: main|Type: time|Default: 3h|
+    |callout_domain_positive_expire|Use: main|Type: time|Default: 7d|
+    |callout_negative_expire|Use: main|Type: time|Default: 2h|
+    |callout_positive_expire|Use: main|Type: time|Default: 24h|
+    |callout_random_local_part|Use: main|Type: string*|Default: see below|
+    |check_log_inodes|Use: main|Type: integer|Default: 0|
+    |check_log_space|Use: main|Type: integer|Default: 0|
+    |check_rfc2047_length|Use: main|Type: boolean|Default: true|
+    |check_spool_inodes|Use: main|Type: integer|Default: 0|
+    |check_spool_space|Use: main|Type: integer|Default: 0|
+    |daemon_smtp_ports|Use: main|Type: string|Default: "smtp"|
+    |daemon_startup_retries|Use: main|Type: integer|Default: 9|
+    |daemon_startup_sleep|Use: main|Type: time|Default: 30s|
+    |delay_warning|Use: main|Type: time list|Default: 24h|
+    |delay_warning_condition|Use: main|Type: string*|Default: see below|
+    |deliver_drop_privilege|Use: main|Type: boolean|Default: false|
+    |deliver_queue_load_max|Use: main|Type: fixed-point|Default: unset|
+    |delivery_date_remove|Use: main|Type: boolean|Default: true|
+    |disable_fsync|Use: main|Type: boolean|Default: false|
+    |disable_ipv6|Use: main|Type: boolean|Default: false|
+    |dns_again_means_nonexist|Use: main|Type: domain list*|Default: unset|
+    |dns_check_names_pattern|Use: main|Type: string|Default: see below|
+    |dns_csa_search_limit|Use: main|Type: integer|Default: 5|
+    |dns_csa_use_reverse|Use: main|Type: boolean|Default: true|
+    |dns_dnssec_ok|Use: main|Type: integer|Default: -1|
+    |dns_ipv4_lookup|Use: main|Type: domain list*|Default: unset|
+    |dns_retrans|Use: main|Type: time|Default: 0s|
+    |dns_retry|Use: main|Type: integer|Default: 0|
+    |dns_use_edns0|Use: main|Type: integer|Default: -1|
+    |drop_cr|Use: main|Type: boolean|Default: false|
+    |dsn_from|Use: main|Type: string*|Default: see below|
+    |envelope_to_remove|Use: main|Type: boolean|Default: true|
+    |errors_copy|Use: main|Type: string list*|Default: unset|
+    |errors_reply_to|Use: main|Type: string|Default: unset|
+    |exim_group|Use: main|Type: string|Default: compile-time configured|
+    |exim_path|Use: main|Type: string|Default: see below|
+    |exim_user|Use: main|Type: string|Default: compile-time configured|
+    |extra_local_interfaces|Use: main|Type: string list|Default: unset|
+    |extract_addresses_remove_   arguments|Use: main|Type: boolean|Default: true|
+    |finduser_retries|Use: main|Type: integer|Default: 0|
+    |freeze_tell|Use: main|Type: string list, comma separated|Default: unset|
+    |gecos_name|Use: main|Type: string*|Default: unset|
+    |gecos_pattern|Use: main|Type: string|Default: unset|
+    |gnutls_compat_mode|Use: main|Type: boolean|Default: unset|
+    |headers_charset|Use: main|Type: string|Default: see below|
+    |header_maxsize|Use: main|Type: integer|Default: see below|
+    |header_line_maxsize|Use: main|Type: integer|Default: 0|
+    |helo_accept_junk_hosts|Use: main|Type: host list*|Default: unset|
+    |helo_allow_chars|Use: main|Type: string|Default: unset|
+    |helo_lookup_domains|Use: main|Type: domain list*|Default: "@:@[]"|
+    |helo_try_verify_hosts|Use: main|Type: host list*|Default: unset|
+    |helo_verify_hosts|Use: main|Type: host list*|Default: unset|
+    |hold_domains|Use: main|Type: domain list*|Default: unset|
+    |host_lookup|Use: main|Type: host list*|Default: unset|
+    |host_lookup_order|Use: main|Type: string list|Default: "bydns:byaddr"|
+    |host_reject_connection|Use: main|Type: host list*|Default: unset|
+    |hosts_connection_nolog|Use: main|Type: host list*|Default: unset|
+    |hosts_treat_as_local|Use: main|Type: domain list*|Default: unset|
+    |ibase_servers|Use: main|Type: string list|Default: unset|
+    |ignore_bounce_errors_after|Use: main|Type: time|Default: 10w|
+    |ignore_fromline_hosts|Use: main|Type: host list*|Default: unset|
+    |ignore_fromline_local|Use: main|Type: boolean|Default: false|
+    |keep_malformed|Use: main|Type: time|Default: 4d|
+    |ldap_ca_cert_dir|Use: main|Type: string|Default: unset|
+    |ldap_ca_cert_file|Use: main|Type: string|Default: unset|
+    |ldap_cert_file|Use: main|Type: string|Default: unset|
+    |ldap_cert_key|Use: main|Type: string|Default: unset|
+    |ldap_cipher_suite|Use: main|Type: string|Default: unset|
+    |ldap_default_servers|Use: main|Type: string list|Default: unset|
+    |ldap_require_cert|Use: main|Type: string|Default: unset.|
+    |ldap_start_tls|Use: main|Type: boolean|Default: false|
+    |ldap_version|Use: main|Type: integer|Default: unset|
+    |local_from_check|Use: main|Type: boolean|Default: true|
+    |local_from_prefix|Use: main|Type: string|Default: unset|
+    |local_from_suffix|Use: main|Type: string|Default: unset|
+    |local_interfaces|Use: main|Type: string list|Default: see below|
+    |local_scan_timeout|Use: main|Type: time|Default: 5m|
+    |local_sender_retain|Use: main|Type: boolean|Default: false|
+    |localhost_number|Use: main|Type: string*|Default: unset|
+    |log_file_path|Use: main|Type: string list*|Default: set at compile time|
+    |log_selector|Use: main|Type: string|Default: unset|
+    |log_timezone|Use: main|Type: boolean|Default: false|
+    |lookup_open_max|Use: main|Type: integer|Default: 25|
+    |max_username_length|Use: main|Type: integer|Default: 0|
+    |message_body_newlines|Use: main|Type: bool|Default: false|
+    |message_body_visible|Use: main|Type: integer|Default: 500|
+    |message_id_header_domain|Use: main|Type: string*|Default: unset|
+    |message_id_header_text|Use: main|Type: string*|Default: unset|
+    |message_logs|Use: main|Type: boolean|Default: true|
+    |message_size_limit|Use: main|Type: string*|Default: 50M|
+    |move_frozen_messages|Use: main|Type: boolean|Default: false|
+    |mua_wrapper|Use: main|Type: boolean|Default: false|
+    |mysql_servers|Use: main|Type: string list|Default: unset|
+    |never_users|Use: main|Type: string list*|Default: unset|
+    |openssl_options|Use: main|Type: string list|Default: +no_sslv2|
+    |oracle_servers|Use: main|Type: string list|Default: unset|
+    |percent_hack_domains|Use: main|Type: domain list*|Default: unset|
+    |perl_at_start|Use: main|Type: boolean|Default: false|
+    |perl_startup|Use: main|Type: string|Default: unset|
+    |pgsql_servers|Use: main|Type: string list|Default: unset|
+    |pid_file_path|Use: main|Type: string*|Default: set at compile time|
+    |pipelining_advertise_hosts|Use: main|Type: host list*|Default: *|
+    |prdr_enable|Use: main|Type: boolean|Default: false|
+    |preserve_message_logs|Use: main|Type: boolean|Default: false|
+    |primary_hostname|Use: main|Type: string|Default: see below|
+    |print_topbitchars|Use: main|Type: boolean|Default: false|
+    |process_log_path|Use: main|Type: string|Default: unset|
+    |prod_requires_admin|Use: main|Type: boolean|Default: true|
+    |qualify_domain|Use: main|Type: string|Default: see below|
+    |qualify_recipient|Use: main|Type: string|Default: see below|
+    |queue_domains|Use: main|Type: domain list*|Default: unset|
+    |queue_list_requires_admin|Use: main|Type: boolean|Default: true|
+    |queue_only|Use: main|Type: boolean|Default: false|
+    |queue_only_file|Use: main|Type: string|Default: unset|
+    |queue_only_load|Use: main|Type: fixed-point|Default: unset|
+    |queue_only_load_latch|Use: main|Type: boolean|Default: true|
+    |queue_only_override|Use: main|Type: boolean|Default: true|
+    |queue_run_in_order|Use: main|Type: boolean|Default: false|
+    |queue_run_max|Use: main|Type: integer|Default: 5|
+    |queue_smtp_domains|Use: main|Type: domain list*|Default: unset|
+    |receive_timeout|Use: main|Type: time|Default: 0s|
+    |received_header_text|Use: main|Type: string*|Default: see below|
+    |received_headers_max|Use: main|Type: integer|Default: 30|
+    |recipient_unqualified_hosts|Use: main|Type: host list*|Default: unset|
+    |recipients_max|Use: main|Type: integer|Default: 0|
+    |recipients_max_reject|Use: main|Type: boolean|Default: false|
+    |remote_max_parallel|Use: main|Type: integer|Default: 2|
+    |remote_sort_domains|Use: main|Type: domain list*|Default: unset|
+    |retry_data_expire|Use: main|Type: time|Default: 7d|
+    |retry_interval_max|Use: main|Type: time|Default: 24h|
+    |return_path_remove|Use: main|Type: boolean|Default: true|
+    |return_size_limit|Use: main|Type: integer|Default: 100K|
+    |rfc1413_hosts|Use: main|Type: host list*|Default: *|
+    |rfc1413_query_timeout|Use: main|Type: time|Default: 5s|
+    |sender_unqualified_hosts|Use: main|Type: host list*|Default: unset|
+    |smtp_accept_keepalive|Use: main|Type: boolean|Default: true|
+    |smtp_accept_max|Use: main|Type: integer|Default: 20|
+    |smtp_accept_max_nonmail|Use: main|Type: integer|Default: 10|
+    |smtp_accept_max_nonmail_hosts|Use: main|Type: host list*|Default: *|
+    |smtp_accept_max_per_connection|Use: main|Type: integer|Default: 1000|
+    |smtp_accept_max_per_host|Use: main|Type: string*|Default: unset|
+    |smtp_accept_queue|Use: main|Type: integer|Default: 0|
+    |smtp_accept_queue_per_connection|Use: main|Type: integer|Default: 10|
+    |smtp_accept_reserve|Use: main|Type: integer|Default: 0|
+    |smtp_active_hostname|Use: main|Type: string*|Default: unset|
+    |smtp_banner|Use: main|Type: string*|Default: see below|
+    |smtp_check_spool_space|Use: main|Type: boolean|Default: true|
+    |smtp_connect_backlog|Use: main|Type: integer|Default: 20|
+    |smtp_enforce_sync|Use: main|Type: boolean|Default: true|
+    |smtp_etrn_command|Use: main|Type: string*|Default: unset|
+    |smtp_etrn_serialize|Use: main|Type: boolean|Default: true|
+    |smtp_load_reserve|Use: main|Type: fixed-point|Default: unset|
+    |smtp_max_synprot_errors|Use: main|Type: integer|Default: 3|
+    |smtp_max_unknown_commands|Use: main|Type: integer|Default: 3|
+    |smtp_ratelimit_hosts|Use: main|Type: host list*|Default: unset|
+    |smtp_ratelimit_mail|Use: main|Type: string|Default: unset|
+    |smtp_ratelimit_rcpt|Use: main|Type: string|Default: unset|
+    |smtp_receive_timeout|Use: main|Type: time|Default: 5m|
+    |smtp_reserve_hosts|Use: main|Type: host list*|Default: unset|
+    |smtp_return_error_details|Use: main|Type: boolean|Default: false|
+    |spamd_address|Use: main|Type: string|Default: see below|
+    |split_spool_directory|Use: main|Type: boolean|Default: false|
+    |spool_directory|Use: main|Type: string*|Default: set at compile time|
+    |sqlite_lock_timeout|Use: main|Type: time|Default: 5s|
+    |strict_acl_vars|Use: main|Type: boolean|Default: false|
+    |strip_excess_angle_brackets|Use: main|Type: boolean|Default: false|
+    |strip_trailing_dot|Use: main|Type: boolean|Default: false|
+    |syslog_duplication|Use: main|Type: boolean|Default: true|
+    |syslog_facility|Use: main|Type: string|Default: unset|
+    |syslog_processname|Use: main|Type: string|Default: "exim"|
+    |syslog_timestamp|Use: main|Type: boolean|Default: true|
+    |system_filter|Use: main|Type: string*|Default: unset|
+    |system_filter_directory_transport|Use: main|Type: string*|Default: unset|
+    |system_filter_file_transport|Use: main|Type: string*|Default: unset|
+    |system_filter_group|Use: main|Type: string|Default: unset|
+    |system_filter_pipe_transport|Use: main|Type: string*|Default: unset|
+    |system_filter_reply_transport|Use: main|Type: string*|Default: unset|
+    |system_filter_user|Use: main|Type: string|Default: unset|
+    |tcp_nodelay|Use: main|Type: boolean|Default: true|
+    |timeout_frozen_after|Use: main|Type: time|Default: 0s|
+    |timezone|Use: main|Type: string|Default: unset|
+    |tls_advertise_hosts|Use: main|Type: host list*|Default: unset|
+    |tls_certificate|Use: main|Type: string*|Default: unset|
+    |tls_crl|Use: main|Type: string*|Default: unset|
+    |tls_dh_max_bits|Use: main|Type: integer|Default: 2236|
+    |tls_dhparam|Use: main|Type: string*|Default: unset|
+    |tls_ocsp_file|Use: main|Type: string*|Default: unset|
+    |tls_on_connect_ports|Use: main|Type: string list|Default: unset|
+    |tls_privatekey|Use: main|Type: string*|Default: unset|
+    |tls_remember_esmtp|Use: main|Type: boolean|Default: false|
+    |tls_require_ciphers|Use: main|Type: string*|Default: unset|
+    |tls_try_verify_hosts|Use: main|Type: host list*|Default: unset|
+    |tls_verify_certificates|Use: main|Type: string*|Default: unset|
+    |tls_verify_hosts|Use: main|Type: host list*|Default: unset|
+    |trusted_groups|Use: main|Type: string list*|Default: unset|
+    |trusted_users|Use: main|Type: string list*|Default: unset|
+    |unknown_login|Use: main|Type: string*|Default: unset|
+    |unknown_username|Use: main|Type: string|Default: unset|
+    |untrusted_set_sender|Use: main|Type: address list*|Default: unset|
+    |uucp_from_pattern|Use: main|Type: string|Default: see below|
+    |uucp_from_sender|Use: main|Type: string*|Default: "$1"|
+    |warn_message_file|Use: main|Type: string|Default: unset|
+    |write_rejectlog|Use: main|Type: boolean|Default: true|
+    |address_data|Use: routers|Type: string*|Default: unset|
+    |address_test|Use: routers**|Type: boolean|Default: true|
+    |cannot_route_message|Use: routers|Type: string*|Default: unset|
+    |caseful_local_part|Use: routers|Type: boolean|Default: false|
+    |check_local_user|Use: routers**|Type: boolean|Default: false|
+    |condition|Use: routers**|Type: string*|Default: unset|
+    |debug_print|Use: routers|Type: string*|Default: unset|
+    |disable_logging|Use: routers|Type: boolean|Default: false|
+    |domains|Use: routers**|Type: domain list*|Default: unset|
+    |driver|Use: routers|Type: string|Default: unset|
+    |errors_to|Use: routers|Type: string*|Default: unset|
+    |expn|Use: routers**|Type: boolean|Default: true|
+    |fail_verify|Use: routers|Type: boolean|Default: false|
+    |fail_verify_recipient|Use: routers|Type: boolean|Default: false|
+    |fail_verify_sender|Use: routers|Type: boolean|Default: false|
+    |fallback_hosts|Use: routers|Type: string list|Default: unset|
+    |group|Use: routers|Type: string*|Default: see below|
+    |headers_add|Use: routers|Type: list*|Default: unset|
+    |headers_remove|Use: routers|Type: list*|Default: unset|
+    |ignore_target_hosts|Use: routers|Type: host list*|Default: unset|
+    |initgroups|Use: routers|Type: boolean|Default: false|
+    |local_part_prefix|Use: routers**|Type: string list|Default: unset|
+    |local_part_prefix_optional|Use: routers|Type: boolean|Default: false|
+    |local_part_suffix|Use: routers**|Type: string list|Default: unset|
+    |local_part_suffix_optional|Use: routers|Type: boolean|Default: false|
+    |local_parts|Use: routers**|Type: local part list*|Default: unset|
+    |log_as_local|Use: routers|Type: boolean|Default: see below|
+    |more|Use: routers|Type: boolean*|Default: true|
+    |pass_on_timeout|Use: routers|Type: boolean|Default: false|
+    |pass_router|Use: routers|Type: string|Default: unset|
+    |redirect_router|Use: routers|Type: string|Default: unset|
+    |require_files|Use: routers**|Type: string list*|Default: unset|
+    |retry_use_local_part|Use: routers|Type: boolean|Default: see below|
+    |router_home_directory|Use: routers|Type: string*|Default: unset|
+    |self|Use: routers|Type: string|Default: freeze|
+    |senders|Use: routers**|Type: address list*|Default: unset|
+    |translate_ip_address|Use: routers|Type: string*|Default: unset|
+    |transport|Use: routers|Type: string*|Default: unset|
+    |transport_current_directory|Use: routers|Type: string*|Default: unset|
+    |transport_home_directory|Use: routers|Type: string*|Default: see below|
+    |unseen|Use: routers|Type: boolean*|Default: false|
+    |user|Use: routers|Type: string*|Default: see below|
+    |verify|Use: routers**|Type: boolean|Default: true|
+    |verify_only|Use: routers**|Type: boolean|Default: false|
+    |verify_recipient|Use: routers**|Type: boolean|Default: true|
+    |verify_sender|Use: routers**|Type: boolean|Default: true|
+    |check_secondary_mx|Use: dnslookup|Type: boolean|Default: false|
+    |check_srv|Use: dnslookup|Type: string*|Default: unset|
+    |dnssec_request_domains|Use: dnslookup|Type: domain list*|Default: unset|
+    |dnssec_require_domains|Use: dnslookup|Type: domain list*|Default: unset|
+    |mx_domains|Use: dnslookup|Type: domain list*|Default: unset|
+    |mx_fail_domains|Use: dnslookup|Type: domain list*|Default: unset|
+    |qualify_single|Use: dnslookup|Type: boolean|Default: true|
+    |rewrite_headers|Use: dnslookup|Type: boolean|Default: true|
+    |same_domain_copy_routing|Use: dnslookup|Type: boolean|Default: false|
+    |search_parents|Use: dnslookup|Type: boolean|Default: false|
+    |srv_fail_domains|Use: dnslookup|Type: domain list*|Default: unset|
+    |widen_domains|Use: dnslookup|Type: string list|Default: unset|
+    |hosts|Use: iplookup|Type: string|Default: unset|
+    |optional|Use: iplookup|Type: boolean|Default: false|
+    |port|Use: iplookup|Type: integer|Default: 0|
+    |protocol|Use: iplookup|Type: string|Default: udp|
+    |query|Use: iplookup|Type: string*|Default: see below|
+    |reroute|Use: iplookup|Type: string*|Default: unset|
+    |response_pattern|Use: iplookup|Type: string|Default: unset|
+    |timeout|Use: iplookup|Type: time|Default: 5s|
+    |host_all_ignored|Use: manualroute|Type: string|Default: defer|
+    |host_find_failed|Use: manualroute|Type: string|Default: freeze|
+    |hosts_randomize|Use: manualroute|Type: boolean|Default: false|
+    |route_data|Use: manualroute|Type: string*|Default: unset|
+    |route_list|Use: manualroute|Type: string list|Default: unset|
+    |same_domain_copy_routing|Use: manualroute|Type: boolean|Default: false|
+    |command|Use: queryprogram|Type: string*|Default: unset|
+    |command_group|Use: queryprogram|Type: string|Default: unset|
+    |command_user|Use: queryprogram|Type: string|Default: unset|
+    |current_directory|Use: queryprogram|Type: string|Default: /|
+    |timeout|Use: queryprogram|Type: time|Default: 1h|
+    |allow_defer|Use: redirect|Type: boolean|Default: false|
+    |allow_fail|Use: redirect|Type: boolean|Default: false|
+    |allow_filter|Use: redirect|Type: boolean|Default: false|
+    |allow_freeze|Use: redirect|Type: boolean|Default: false|
+    |check_ancestor|Use: redirect|Type: boolean|Default: false|
+    |check_group|Use: redirect|Type: boolean|Default: see below|
+    |check_owner|Use: redirect|Type: boolean|Default: see below|
+    |data|Use: redirect|Type: string*|Default: unset|
+    |directory_transport|Use: redirect|Type: string*|Default: unset|
+    |file|Use: redirect|Type: string*|Default: unset|
+    |file_transport|Use: redirect|Type: string*|Default: unset|
+    |filter_prepend_home|Use: redirect|Type: boolean|Default: true|
+    |forbid_blackhole|Use: redirect|Type: boolean|Default: false|
+    |forbid_exim_filter|Use: redirect|Type: boolean|Default: false|
+    |forbid_file|Use: redirect|Type: boolean|Default: false|
+    |forbid_filter_dlfunc|Use: redirect|Type: boolean|Default: false|
+    |forbid_filter_existstest|Use: redirect|Type: boolean|Default: false|
+    |forbid_filter_logwrite|Use: redirect|Type: boolean|Default: false|
+    |forbid_filter_lookup|Use: redirect|Type: boolean|Default: false|
+    |forbid_filter_perl|Use: redirect|Type: boolean|Default: false|
+    |forbid_filter_readfile|Use: redirect|Type: boolean|Default: false|
+    |forbid_filter_readsocket|Use: redirect|Type: boolean|Default: false|
+    |forbid_filter_reply|Use: redirect|Type: boolean|Default: false|
+    |forbid_filter_run|Use: redirect|Type: boolean|Default: false|
+    |forbid_include|Use: redirect|Type: boolean|Default: false|
+    |forbid_pipe|Use: redirect|Type: boolean|Default: false|
+    |forbid_sieve_filter|Use: redirect|Type: boolean|Default: false|
+    |forbid_smtp_code|Use: redirect|Type: boolean|Default: false|
+    |hide_child_in_errmsg|Use: redirect|Type: boolean|Default: false|
+    |ignore_eacces|Use: redirect|Type: boolean|Default: false|
+    |ignore_enotdir|Use: redirect|Type: boolean|Default: false|
+    |include_directory|Use: redirect|Type: string|Default: unset|
+    |modemask|Use: redirect|Type: octal integer|Default: 022|
+    |one_time|Use: redirect|Type: boolean|Default: false|
+    |owners|Use: redirect|Type: string list|Default: unset|
+    |owngroups|Use: redirect|Type: string list|Default: unset|
+    |pipe_transport|Use: redirect|Type: string*|Default: unset|
+    |qualify_domain|Use: redirect|Type: string*|Default: unset|
+    |qualify_preserve_domain|Use: redirect|Type: boolean|Default: false|
+    |repeat_use|Use: redirect|Type: boolean|Default: true|
+    |reply_transport|Use: redirect|Type: string*|Default: unset|
+    |rewrite|Use: redirect|Type: boolean|Default: true|
+    |sieve_subaddress|Use: redirect|Type: string*|Default: unset|
+    |sieve_useraddress|Use: redirect|Type: string*|Default: unset|
+    |sieve_vacation_directory|Use: redirect|Type: string*|Default: unset|
+    |skip_syntax_errors|Use: redirect|Type: boolean|Default: false|
+    |syntax_errors_text|Use: redirect|Type: string*|Default: unset|
+    |syntax_errors_to|Use: redirect|Type: string|Default: unset|
+    |body_only|Use: transports|Type: boolean|Default: false|
+    |current_directory|Use: transports|Type: string*|Default: unset|
+    |disable_logging|Use: transports|Type: boolean|Default: false|
+    |debug_print|Use: transports|Type: string*|Default: unset|
+    |delivery_date_add|Use: transports|Type: boolean|Default: false|
+    |driver|Use: transports|Type: string|Default: unset|
+    |envelope_to_add|Use: transports|Type: boolean|Default: false|
+    |group|Use: transports|Type: string*|Default: Exim group|
+    |headers_add|Use: transports|Type: list*|Default: unset|
+    |headers_only|Use: transports|Type: boolean|Default: false|
+    |headers_remove|Use: transports|Type: list*|Default: unset|
+    |headers_rewrite|Use: transports|Type: string|Default: unset|
+    |home_directory|Use: transports|Type: string*|Default: unset|
+    |initgroups|Use: transports|Type: boolean|Default: false|
+    |message_size_limit|Use: transports|Type: string*|Default: 0|
+    |rcpt_include_affixes|Use: transports|Type: boolean|Default: false|
+    |retry_use_local_part|Use: transports|Type: boolean|Default: see below|
+    |return_path|Use: transports|Type: string*|Default: unset|
+    |return_path_add|Use: transports|Type: boolean|Default: false|
+    |shadow_condition|Use: transports|Type: string*|Default: unset|
+    |shadow_transport|Use: transports|Type: string|Default: unset|
+    |transport_filter|Use: transports|Type: string*|Default: unset|
+    |transport_filter_timeout|Use: transports|Type: time|Default: 5m|
+    |user|Use: transports|Type: string*|Default: Exim user|
+    |allow_fifo|Use: appendfile|Type: boolean|Default: false|
+    |allow_symlink|Use: appendfile|Type: boolean|Default: false|
+    |batch_id|Use: appendfile|Type: string*|Default: unset|
+    |batch_max|Use: appendfile|Type: integer|Default: 1|
+    |check_group|Use: appendfile|Type: boolean|Default: false|
+    |check_owner|Use: appendfile|Type: boolean|Default: true|
+    |check_string|Use: appendfile|Type: string|Default: see below|
+    |create_directory|Use: appendfile|Type: boolean|Default: true|
+    |create_file|Use: appendfile|Type: string|Default: anywhere|
+    |directory|Use: appendfile|Type: string*|Default: unset|
+    |directory_file|Use: appendfile|Type: string*|Default: see below|
+    |directory_mode|Use: appendfile|Type: octal integer|Default: 0700|
+    |escape_string|Use: appendfile|Type: string|Default: see description|
+    |file|Use: appendfile|Type: string*|Default: unset|
+    |file_format|Use: appendfile|Type: string|Default: unset|
+    |file_must_exist|Use: appendfile|Type: boolean|Default: false|
+    |lock_fcntl_timeout|Use: appendfile|Type: time|Default: 0s|
+    |lock_flock_timeout|Use: appendfile|Type: time|Default: 0s|
+    |lock_interval|Use: appendfile|Type: time|Default: 3s|
+    |lock_retries|Use: appendfile|Type: integer|Default: 10|
+    |lockfile_mode|Use: appendfile|Type: octal integer|Default: 0600|
+    |lockfile_timeout|Use: appendfile|Type: time|Default: 30m|
+    |mailbox_filecount|Use: appendfile|Type: string*|Default: unset|
+    |mailbox_size|Use: appendfile|Type: string*|Default: unset|
+    |maildir_format|Use: appendfile|Type: boolean|Default: false|
+    |maildir_quota_directory_regex|Use: appendfile|Type: string|Default: See below|
+    |maildir_retries|Use: appendfile|Type: integer|Default: 10|
+    |maildir_tag|Use: appendfile|Type: string*|Default: unset|
+    |maildir_use_size_file|Use: appendfile*|Type: boolean|Default: false|
+    |maildirfolder_create_regex|Use: appendfile|Type: string|Default: unset|
+    |mailstore_format|Use: appendfile|Type: boolean|Default: false|
+    |mailstore_prefix|Use: appendfile|Type: string*|Default: unset|
+    |mailstore_suffix|Use: appendfile|Type: string*|Default: unset|
+    |mbx_format|Use: appendfile|Type: boolean|Default: false|
+    |message_prefix|Use: appendfile|Type: string*|Default: see below|
+    |message_suffix|Use: appendfile|Type: string*|Default: see below|
+    |mode|Use: appendfile|Type: octal integer|Default: 0600|
+    |mode_fail_narrower|Use: appendfile|Type: boolean|Default: true|
+    |notify_comsat|Use: appendfile|Type: boolean|Default: false|
+    |quota|Use: appendfile|Type: string*|Default: unset|
+    |quota_directory|Use: appendfile|Type: string*|Default: unset|
+    |quota_filecount|Use: appendfile|Type: string*|Default: 0|
+    |quota_is_inclusive|Use: appendfile|Type: boolean|Default: true|
+    |quota_size_regex|Use: appendfile|Type: string|Default: unset|
+    |quota_warn_message|Use: appendfile|Type: string*|Default: see below|
+    |quota_warn_threshold|Use: appendfile|Type: string*|Default: 0|
+    |use_bsmtp|Use: appendfile|Type: boolean|Default: false|
+    |use_crlf|Use: appendfile|Type: boolean|Default: false|
+    |use_fcntl_lock|Use: appendfile|Type: boolean|Default: see below|
+    |use_flock_lock|Use: appendfile|Type: boolean|Default: false|
+    |use_lockfile|Use: appendfile|Type: boolean|Default: see below|
+    |use_mbx_lock|Use: appendfile|Type: boolean|Default: see below|
+    |bcc|Use: autoreply|Type: string*|Default: unset|
+    |cc|Use: autoreply|Type: string*|Default: unset|
+    |file|Use: autoreply|Type: string*|Default: unset|
+    |file_expand|Use: autoreply|Type: boolean|Default: false|
+    |file_optional|Use: autoreply|Type: boolean|Default: false|
+    |from|Use: autoreply|Type: string*|Default: unset|
+    |headers|Use: autoreply|Type: string*|Default: unset|
+    |log|Use: autoreply|Type: string*|Default: unset|
+    |mode|Use: autoreply|Type: octal integer|Default: 0600|
+    |never_mail|Use: autoreply|Type: address list*|Default: unset|
+    |once|Use: autoreply|Type: string*|Default: unset|
+    |once_file_size|Use: autoreply|Type: integer|Default: 0|
+    |once_repeat|Use: autoreply|Type: time*|Default: 0s|
+    |reply_to|Use: autoreply|Type: string*|Default: unset|
+    |return_message|Use: autoreply|Type: boolean|Default: false|
+    |subject|Use: autoreply|Type: string*|Default: unset|
+    |text|Use: autoreply|Type: string*|Default: unset|
+    |to|Use: autoreply|Type: string*|Default: unset|
+    |batch_id|Use: lmtp|Type: string*|Default: unset|
+    |batch_max|Use: lmtp|Type: integer|Default: 1|
+    |command|Use: lmtp|Type: string*|Default: unset|
+    |ignore_quota|Use: lmtp|Type: boolean|Default: false|
+    |socket|Use: lmtp|Type: string*|Default: unset|
+    |timeout|Use: lmtp|Type: time|Default: 5m|
+    |allow_commands|Use: pipe|Type: string list*|Default: unset|
+    |batch_id|Use: pipe|Type: string*|Default: unset|
+    |batch_max|Use: pipe|Type: integer|Default: 1|
+    |check_string|Use: pipe|Type: string|Default: unset|
+    |command|Use: pipe|Type: string*|Default: unset|
+    |environment|Use: pipe|Type: string*|Default: unset|
+    |escape_string|Use: pipe|Type: string|Default: unset|
+    |freeze_exec_fail|Use: pipe|Type: boolean|Default: false|
+    |freeze_signal|Use: pipe|Type: boolean|Default: false|
+    |force_command|Use: pipe|Type: boolean|Default: false|
+    |ignore_status|Use: pipe|Type: boolean|Default: false|
+    |log_defer_output|Use: pipe|Type: boolean|Default: false|
+    |log_fail_output|Use: pipe|Type: boolean|Default: false|
+    |log_output|Use: pipe|Type: boolean|Default: false|
+    |max_output|Use: pipe|Type: integer|Default: 20K|
+    |message_prefix|Use: pipe|Type: string*|Default: see below|
+    |message_suffix|Use: pipe|Type: string*|Default: see below|
+    |path|Use: pipe|Type: string|Default: see below|
+    |permit_coredump|Use: pipe|Type: boolean|Default: false|
+    |pipe_as_creator|Use: pipe|Type: boolean|Default: false|
+    |restrict_to_path|Use: pipe|Type: boolean|Default: false|
+    |return_fail_output|Use: pipe|Type: boolean|Default: false|
+    |return_output|Use: pipe|Type: boolean|Default: false|
+    |temp_errors|Use: pipe|Type: string list|Default: see below|
+    |timeout|Use: pipe|Type: time|Default: 1h|
+    |timeout_defer|Use: pipe|Type: boolean|Default: false|
+    |umask|Use: pipe|Type: octal integer|Default: 022|
+    |use_bsmtp|Use: pipe|Type: boolean|Default: false|
+    |use_classresources|Use: pipe|Type: boolean|Default: false|
+    |use_crlf|Use: pipe|Type: boolean|Default: false|
+    |use_shell|Use: pipe|Type: boolean|Default: false|
+    |address_retry_include_sender|Use: smtp|Type: boolean|Default: true|
+    |allow_localhost|Use: smtp|Type: boolean|Default: false|
+    |authenticated_sender|Use: smtp|Type: string*|Default: unset|
+    |authenticated_sender_force|Use: smtp|Type: boolean|Default: false|
+    |command_timeout|Use: smtp|Type: time|Default: 5m|
+    |connect_timeout|Use: smtp|Type: time|Default: 5m|
+    |connection_max_messages|Use: smtp|Type: integer|Default: 500|
+    |data_timeout|Use: smtp|Type: time|Default: 5m|
+    |delay_after_cutoff|Use: smtp|Type: boolean|Default: true|
+    |dns_qualify_single|Use: smtp|Type: boolean|Default: true|
+    |dns_search_parents|Use: smtp|Type: boolean|Default: false|
+    |dnssec_request_domains|Use: smtp|Type: domain list*|Default: unset|
+    |dnssec_require_domains|Use: smtp|Type: domain list*|Default: unset|
+    |dscp|Use: smtp|Type: string*|Default: unset|
+    |fallback_hosts|Use: smtp|Type: string list|Default: unset|
+    |final_timeout|Use: smtp|Type: time|Default: 10m|
+    |gethostbyname|Use: smtp|Type: boolean|Default: false|
+    |gnutls_compat_mode|Use: smtp|Type: boolean|Default: unset|
+    |helo_data|Use: smtp|Type: string*|Default: see below|
+    |hosts|Use: smtp|Type: string list*|Default: unset|
+    |hosts_avoid_esmtp|Use: smtp|Type: host list*|Default: unset|
+    |hosts_avoid_pipelining|Use: smtp|Type: host list*|Default: unset|
+    |hosts_avoid_tls|Use: smtp|Type: host list*|Default: unset|
+    |hosts_verify_avoid_tls|Use: smtp|Type: host list*|Default: *|
+    |hosts_max_try|Use: smtp|Type: integer|Default: 5|
+    |hosts_max_try_hardlimit|Use: smtp|Type: integer|Default: 50|
+    |hosts_nopass_tls|Use: smtp|Type: host list*|Default: unset|
+    |hosts_override|Use: smtp|Type: boolean|Default: false|
+    |hosts_randomize|Use: smtp|Type: boolean|Default: false|
+    |hosts_require_auth|Use: smtp|Type: host list*|Default: unset|
+    |hosts_request_ocsp|Use: smtp|Type: host list*|Default: *|
+    |hosts_require_ocsp|Use: smtp|Type: host list*|Default: unset|
+    |hosts_require_tls|Use: smtp|Type: host list*|Default: unset|
+    |hosts_try_auth|Use: smtp|Type: host list*|Default: unset|
+    |hosts_try_prdr|Use: smtp|Type: host list*|Default: unset|
+    |interface|Use: smtp|Type: string list*|Default: unset|
+    |keepalive|Use: smtp|Type: boolean|Default: true|
+    |lmtp_ignore_quota|Use: smtp|Type: boolean|Default: false|
+    |max_rcpt|Use: smtp|Type: integer|Default: 100|
+    |multi_domain|Use: smtp|Type: boolean|Default: true|
+    |port|Use: smtp|Type: string*|Default: see below|
+    |protocol|Use: smtp|Type: string|Default: smtp|
+    |retry_include_ip_address|Use: smtp|Type: boolean|Default: true|
+    |serialize_hosts|Use: smtp|Type: host list*|Default: unset|
+    |size_addition|Use: smtp|Type: integer|Default: 1024|
+    |tls_certificate|Use: smtp|Type: string*|Default: unset|
+    |tls_crl|Use: smtp|Type: string*|Default: unset|
+    |tls_dh_min_bits|Use: smtp|Type: integer|Default: 1024|
+    |tls_privatekey|Use: smtp|Type: string*|Default: unset|
+    |tls_require_ciphers|Use: smtp|Type: string*|Default: unset|
+    |tls_sni|Use: smtp|Type: string*|Default: unset|
+    |tls_tempfail_tryclear|Use: smtp|Type: boolean|Default: true|
+    |tls_try_verify_hosts|Use: smtp|Type: host list* unset|Default:|
+    |tls_verify_certificates|Use: smtp|Type: string*|Default: unset|
+    |tls_verify_hosts|Use: smtp|Type: host list* unset|Default:|
+    |client_condition|Use: authenticators|Type: string*|Default: unset|
+    |client_set_id|Use: authenticators|Type: string*|Default: unset|
+    |driver|Use: authenticators|Type: string|Default: unset|
+    |public_name|Use: authenticators|Type: string|Default: unset|
+    |server_advertise_condition|Use: authenticators|Type: string*|Default: unset|
+    |server_condition|Use: authenticators|Type: string*|Default: unset|
+    |server_debug_print|Use: authenticators|Type: string*|Default: unset|
+    |server_set_id|Use: authenticators|Type: string*|Default: unset|
+    |server_mail_auth_condition|Use: authenticators|Type: string*|Default: unset|
+    |server_condition|Use: authenticators|Type: string*|Default: unset|
+    |server_prompts|Use: plaintext|Type: string*|Default: unset|
+    |client_ignore_invalid_base64|Use: plaintext|Type: boolean|Default: false|
+    |client_send|Use: plaintext|Type: string*|Default: unset|
+    |server_secret|Use: cram_md5|Type: string*|Default: unset|
+    |client_name|Use: cram_md5|Type: string*|Default: the primary host name|
+    |client_secret|Use: cram_md5|Type: string*|Default: unset|
+    |server_hostname|Use: cyrus_sasl|Type: string*|Default: see below|
+    |server_mech|Use: cyrus_sasl|Type: string|Default: see below|
+    |server_realm|Use: cyrus_sasl|Type: string*|Default: unset|
+    |server_service|Use: cyrus_sasl|Type: string|Default: "smtp"|
+    |server_socket|Use: dovecot|Type: string|Default: unset|
+    |server_channelbinding|Use: gsasl|Type: boolean|Default: false|
+    |server_hostname|Use: gsasl|Type: string*|Default: see below|
+    |server_mech|Use: gsasl|Type: string|Default: see below|
+    |server_password|Use: gsasl|Type: string*|Default: unset|
+    |server_realm|Use: gsasl|Type: string*|Default: unset|
+    |server_scram_iter|Use: gsasl|Type: string*|Default: unset|
+    |server_scram_salt|Use: gsasl|Type: string*|Default: unset|
+    |server_service|Use: gsasl|Type: string|Default: "smtp"|
+    |server_hostname|Use: heimdal_gssapi|Type: string*|Default: see below|
+    |server_keytab|Use: heimdal_gssapi|Type: string*|Default: unset|
+    |server_service|Use: heimdal_gssapi|Type: string*|Default: smtp|
+    |server_password|Use: spa|Type: string*|Default: unset|
+    |client_domain|Use: spa|Type: string*|Default: unset|
+    |client_password|Use: spa|Type: string*|Default: unset|
+    |client_username|Use: spa|Type: string*|Default: unset|
+    |dkim_domain|Use: smtp|Type: string*|Default: unset|
+    |dkim_selector|Use: smtp|Type: string*|Default: unset|
+    |dkim_private_key|Use: smtp|Type: string*|Default: unset|
+    |dkim_canon|Use: smtp|Type: string*|Default: unset|
+    |dkim_strict|Use: smtp|Type: string*|Default: unset|
+    |dkim_sign_headers|Use: smtp|Type: string*|Default: unset|
+    }}}
+
+## List of Variables {{{
+
+    $0, $1, etc
+    $acl_arg1, $acl_arg2, etc
+    $acl_c...
+    $acl_m...
+    $acl_narg
+    $acl_verify_message
+    $address_data
+    $address_file
+    $address_pipe
+    $auth1 - $auth3
+    $authenticated_id
+    $authenticated_fail_id
+    $authenticated_sender
+    $authentication_failed
+    $av_failed
+
+    $body_linecount
+    $body_zerocount
+    $bounce_recipient
+    $bounce_return_size_limit
+
+    $caller_gid
+    $caller_uid
+    $compile_date
+    $compile_number
+
+    $demime_errorlevel
+    $demime_reason
+    $dnslist_domain, $dnslist_matched, $dnslist_text, $dnslist_value
+    $domain
+    $domain_data
+
+    $exim_gid
+    $exim_path
+    $exim_uid
+
+    $found_extension
+    $header_<name>
+
+    $headers_added
+    $home
+    $host
+    $host_address
+    $host_data
+    $host_lookup_deferred
+    $host_lookup_failed
+    $host_port
+
+    $inode
+    $interface_address
+    $interface_port
+    $item
+
+    $ldap_dn
+    $load_average
+    $local_part
+    $local_part_data
+    $local_part_prefix
+    $local_part_suffix
+    $local_scan_data
+    $local_user_gid
+    $local_user_uid
+    $localhost_number
+    $log_inodes
+    $log_space
+    $lookup_dnssec_authenticated
+
+    $mailstore_basename
+    $malware_name
+    $max_received_linelength
+    $message_age
+    $message_body
+    $message_body_end
+    $message_body_size
+    $message_exim_id
+    $message_headers
+    $message_headers_raw
+    $message_id
+    $message_linecount
+    $message_size
+    $mime_xxx
+
+    $n0 - $n9
+
+    $original_domain
+    $original_local_part
+    $originator_gid
+    $originator_uid
+
+    $parent_domain
+    $parent_local_part
+    $pid
+    $pipe_addresses
+    $primary_hostname
+    $prvscheck_address
+    $prvscheck_keynum
+    $prvscheck_result
+    $qualify_domain
+    $qualify_recipient
+
+    $rcpt_count
+    $rcpt_defer_count
+    $rcpt_fail_count
+    $received_count
+    $received_for
+    $received_ip_address
+    $received_port
+    $received_protocol
+    $received_time
+    $recipient_data
+    $recipient_verify_failure
+    $recipients
+    $recipients_count
+    $regex_match_string
+    $reply_address
+    $return_path
+    $return_size_limit
+    $router_name
+    $runrc
+
+    $self_hostname
+    $sender_address
+    $sender_address_data
+    $sender_address_domain
+    $sender_address_local_part
+    $sender_data
+    $sender_fullhost
+    $sender_helo_name
+    $sender_host_address
+    $sender_host_authenticated
+    $sender_host_dnssec
+    $sender_host_name
+    $sender_host_port
+    $sender_ident
+    $sender_rate_xxx
+    $sender_rcvhost
+    $sender_verify_failure
+    $sending_ip_address
+    $sending_port
+    $smtp_active_hostname
+    $smtp_command
+    $smtp_command_argument
+    $smtp_count_at_connection_start
+    $sn0 - $sn9
+    $spam_xxx
+    $spool_directory
+    $spool_inodes
+    $spool_space
+
+    $thisaddress
+    $tls_in_bits
+    $tls_out_bits
+    $tls_in_ourcert
+    $tls_in_peercert
+    $tls_out_ourcert
+    $tls_out_peercert
+    $tls_in_certificate_verified
+    $tls_out_certificate_verified
+    $tls_in_cipher
+    $tls_out_cipher
+    $tls_in_ocsp
+    $tls_out_ocsp
+    $tls_in_peerdn
+    $tls_out_peerdn
+    $tls_in_sni
+    $tls_out_sni
+
+    $tod_bsdinbox
+    $tod_epoch
+    $tod_epoch_l
+    $tod_full
+    $tod_log
+    $tod_logfile
+    $tod_zone
+    $tod_zulu
+    $transport_name
+
+    $value
+    $verify_mode
+    $version_number
+
+    $warn_message_delay
+    $warn_message_recipients
+    }}}
+
+## List of Operators {{{
+
+    ${quote_<lookup-type>:<string>}
+    ${quote_ldap: a(bc)*, a<yz>; }
+    ${quote_ldap_dn: a(bc)*, a<yz>; }
+    ${<op>:<string>}
+    ${address:<string>}
+    ${addresses:<string>}
+    ${base62:<digits>}
+    ${base62d:<base-62 digits>}
+    ${domain:<string>}
+    ${escape:<string>}
+    ${eval:<string>} and ${eval10:<string>}
+    ${expand:<string>}
+    ${from_utf8:<string>}
+    ${hash_<n>_<m>:<string>}
+    ${hex2b64:<hexstring>}
+    ${hexquote:<string>}
+    ${lc:<string>}
+    ${length_<number>:<string>}
+    ${listcount:<string>}
+    ${listnamed:<name>} and ${listnamed_<type>:<name>}
+    ${local_part:<string>}
+    ${mask:<IP address>/<bit count>}
+    ${md5:<string>}
+    ${nhash_<n>_<m>:<string>}
+    ${quote:<string>}
+    ${quote_local_part:<string>}
+    ${quote_<lookup-type>:<string>}
+    ${randint:<n>}
+    ${reverse_ip:<ipaddr>}
+    ${rfc2047:<string>}
+    ${rfc2047d:<string>}
+    ${rxquote:<string>}
+    ${sha1:<string>}
+    ${sha256:<certificate>}
+    ${stat:<string>}
+    ${str2b64:<string>}
+    ${strlen:<string>}
+    ${substr_<start>_<length>:<string>}
+    ${time_eval:<string>}
+    ${time_interval:<string>}
+    ${uc:<string>}
+    ${utf8clean:<string>}
+    }}}
+
+## List of Conditions {{{
+
+    acl {{<name>}{<arg1>}{<arg2>}...}
+    bool {<string>}
+    bool_lax {<string>}
+    crypteq {<string1>}{<string2>}
+    eq {<string1>}{<string2>}, eqi {<string1>}{<string2>}
+    exists {<file name>}
+    ge {<string1>}{<string2>}, gei {<string1>}{<string2>}
+    gt {<string1>}{<string2>}, gti {<string1>}{<string2>}
+    inlist {<string1>}{<string2>}, inlisti {<string1>}{<string2>}
+    isip {<string>}, isip4 {<string>}, isip6 {<string>}
+    ldapauth {<ldap query>}
+    le {<string1>}{<string2>}, lei {<string1>}{<string2>}
+    lt {<string1>}{<string2>}, lti {<string1>}{<string2>}
+    match {<string1>}{<string2>}
+    match_address {<string1>}{<string2>}
+    match_domain {<string1>}{<string2>}
+    match_ip {<string1>}{<string2>}
+    match_local_part {<string1>}{<string2>}
+    pam {<string1>:<string2>:...}
+    pwcheck {<string1>:<string2>}
+    radius {<authentication string>}
+    saslauthd {{<user>}{<password>}{<service>}{<realm>}}
+    or {{<cond1>}{<cond2>}...}
+    and {{<cond1>}{<cond2>}...}
+    }}}
+
+## List of Functions {{{
+
+    ${lookup dnsdb{mx=a.b.example}{$value}fail}
+    ${lookup dnsdb{ptr=192.168.4.5}{$value}fail}
+    ${lookup dnsdb{>: a=host1.example}}
+    ${lookup dnsdb{>\n,: txt=a.b.example}}
+    ${lookup dnsdb{>\n; txt=a.b.example}}
+    ${lookup dnsdb{spf=example.org}}
+    ${lookup dnsdb{mxh=a.b.example}}
+    ${lookup dnsdb{zns=xxx.quercite.com}}
+    ${lookup dnsdb{zns=xxx.edu}}
+    ${lookup dnsdb {csa=$sender_helo_name}}
+    ${lookup dnsdb {>; a+=$sender_helo_name}}
+    ${lookup dnsdb{one.domain.com:two.domain.com}}
+    ${lookup dnsdb{a=one.host.com:two.host.com}}
+    ${lookup dnsdb{ptr = <; 1.2.3.4 ; 4.5.6.8}}
+    ${lookup dnsdb{defer_lax,a=one.host.com:two.host.com}}
+    ${lookup dnsdb{a=one.host.com:two.host.com}}
+    ${quote_ldap: a(bc)*, a<yz>; }
+    ${quote_ldap_dn: a(bc)*, a<yz>; }
+    ${lookup ldap {ldapi://%2Ftmp%2Fldap.sock/o=...
+    ${lookup ldap
+    ${lookup mysql{select mailbox from users where id='userx'}\
+    ${lookup pgsql{select home,name from users where id='userx'}\
+    ${lookup mysql{servers=master; UPDATE ...} }
+    ${lookup pgsql{servers=master/db/name/pw; UPDATE ...} }
+    ${lookup sqlite {/some/thing/sqlitedb \
+    ${acl{<name>}{<arg>}...}
+    ${certextract{<field>}{<certificate>}{<string2>}{<string3>}}
+    ${dlfunc{<file>}{<function>}{<arg>}{<arg>}...}
+    ${extract{<key>}{<string1>}{<string2>}{<string3>}}
+    ${extract{<number>}{<separators>}{<string1>}{<string2>}{<string3>}}
+    ${filter{<string>}{<condition>}}
+    ${hash{<string1>}{<string2>}{<string3>}}
+    ${hmac{<hashname>}{<secret>}{<string>}}
+    ${if <condition> {<string1>}{<string2>}}
+    ${length{<string1>}{<string2>}}
+    ${listextract{<number>}{<string1>}{<string2>}{<string3>}}
+    ${lookup{<key>} <search type> {<file>} {<string1>} {<string2>}}
+    ${lookup <search type> {<query>} {<string1>} {<string2>}}
+    ${map{<string1>}{<string2>}}
+    ${nhash{<string1>}{<string2>}{<string3>}}
+    ${perl{<subroutine>}{<arg>}{<arg>}...}
+    ${prvs{<address>}{<secret>}{<keynumber>}}
+    ${prvscheck{<address>}{<secret>}{<string>}}
+    ${readfile{<file name>}{<eol string>}}
+    ${readsocket{<name>}{<request>}{<timeout>}{<eol string>}{<fail string>}}
+    ${reduce{<string1>}{<string2>}{<string3>}}
+    ${run{<command> <args>}{<string1>}{<string2>}}
+    ${sg{<subject>}{<regex>}{<replacement>}}
+    ${sort{<string>}{<comparator>}{<extractor>}}
+    ${substr{<string1>}{<string2>}{<string3>}}
+    ${tr{<subject>}{<characters>}{<replacements>}}
+    ${perl{foo}}
+    ${perl{foo}{argument}}
+    ${perl{foo}{argument1}{argument2} ... }
+    ${lookup dnsdb {csa=$sender_helo_name}}
+    }}}
+
+## Routing Pre-Conditions {{{
+
+    address_test
+    check_local_user
+    condition
+    domains
+    expn
+    local_part_prefix
+    local_part_suffix
+    local_parts
+    require_files
+    senders
+    verify
+    verify_only
+    verify_recipient
+    verify_sender
+    }}}
+
+
+
+Cheat sheet: http://www.datadisk.co.uk/html_docs/exim/exim_cs.htm
+
+# vim:tw=0:et:ts=4:sw=4:fdm=marker:
+