### Global settings.
SECTION(global, priv)m4_dnl
+admin_groups = CONF_admin_groups
prod_requires_admin = false
SECTION(global, logging)m4_dnl
SECTION(global, incoming)m4_dnl
received_header_text = Received: \
- ${if def:sender_rcvhost {from $sender_rcvhost\n\t} \
- {${if def:sender_ident \
- {from ${quote_local_part:$sender_ident} }}\
+ ${if def:sender_rcvhost \
+ {from $sender_rcvhost\
${if def:sender_helo_name \
- {(helo=$sender_helo_name)\n\t}}}}\
+ { (helo=$sender_helo_name)}}\n\t} \
+ {${if def:sender_ident \
+ {from ${quote_local_part:$sender_ident} }}}}\
by $primary_hostname \
+ (Exim $version_number)\
+ ${if def:tls_cipher {\n\t} { }}\
${if def:received_protocol \
{with $received_protocol \
- ${if def:tls_cipher {(cipher=$tls_cipher)\n\t}}}}\
- (Exim $version_number)\n\t\
+ ${if def:tls_cipher {(cipher=$tls_cipher)}}}}\n\t\
${if def:sender_address \
- {(envelope-from <$sender_address>\
+ {(envelope-from $sender_address\
${if def:authenticated_id \
{; auth=$authenticated_id}})\n\t}}\
id $message_exim_id\
acl_smtp_helo = helo
SECTION(acl, misc)m4_dnl
helo:
- require message = The other one has bells on
- verify = helo
+ ## Check that the caller's claimed identity is actually plausible.
+ ## This seems like it's a fairly effective filter on spamminess, but
+ ## it's too blunt a tool. Rather than reject, add a warning header.
+ ## Only we can't do this the easy way, so save it up for use in MAIL.
+ ## Also, we're liable to get a subsequent HELO (e.g., after STARTTLS)
+ ## and we should only care about the most recent one.
+ warn set acl_c_helo_warning = false
+ !condition = \
+ ${if exists {CONF_sysconf_dir/helo.conf} \
+ {${lookup {$sender_helo_name} \
+ partial0-lsearch \
+ {CONF_sysconf_dir/helo.conf} \
+ {${if match_ip \
+ {$sender_host_address} \
+ {$value}}}}}}
+ !verify = helo
+ set acl_c_helo_warning = true
accept
SECTION(acl, mail)m4_dnl
mail:
+ ## If we stashed a warning header about HELO from earlier, we should
+ ## add it now.
+ warn condition = $acl_c_helo_warning
+ add_header = :after_received:X-Distorted-Warning: \
+ BADHELO \
+ Client's HELO doesn't match its IP address.\n\t\
+ HELO name=$sender_helo_name, \
+ address=$sender_host_address
+
## Always allow the empty sender, so that we can receive bounces.
accept senders = :
pipe_transport = pipe
reply_transport = reply:>)
+m4_define(<:FILTER_ROUTER:>,
+<:$1_vrf:
+ $2
+ FILTER_VERIFY<::>$3
+$1:
+ $2
+ verify = no
+ FILTER_TRANSPORTS<::>$4:>)
+
DIVERT(null)
###--------------------------------------------------------------------------
### Some standard transports.
tls_privatekey = CONF_sysconf_dir/client.key
tls_verify_certificates = CONF_ca_dir/ca.cert
tls_require_ciphers = CONF_good_ciphers
- tls_dh_min_bits = 3070
+ tls_dh_min_bits = 2046
tls_tempfail_tryclear = false
authenticated_sender = ${if def:authenticated_id \
- ${authenticated_id@CONF_master_domain} \
+ {$authenticated_id@CONF_master_domain} \
fail}
## A standard transport for local delivery.
deliver:
driver = appendfile
file = /var/mail/$local_part
+ group = mail
+ mode = 0600
+ mode_fail_narrower = false
USER_DELIVERY
## Transports for user filters.
mailbox:
driver = appendfile
+ initgroups = true
USER_DELIVERY
maildir:
driver = appendfile
maildir_format = true
+ initgroups = true
USER_DELIVERY
pipe:
driver = pipe
- return_output = true
+ path = ${if and {{def:home} {exists{$home/bin}}} {$home/bin:} {}}\
+ /usr/local/bin:/usr/local/sbin:\
+ /usr/bin:/usr/sbin:/bin:/sbin
+ initgroups = true
+ umask = 002
+ return_fail_output = true
+ log_output = true
## A special dummy transport for use during address verification.
dummy: