helo:
## Don't worry if this is local submission. MUAs won't necessarily
## have a clear idea of their hostnames. (For some reason.)
- accept condition = ${if !eq{$acl_c_mode}{submission}}
+ accept condition = ${if eq{$acl_c_mode}{submission}}
## Check that the caller's claimed identity is actually plausible.
## This seems like it's a fairly effective filter on spamminess, but
## See whether there's a special exception for this sender domain.
accept senders = ${LOOKUP_DOMAIN($sender_address_domain,
- {KV(senders, {$value}{})},
- {})}
+ {KV(senders)})}
## Ensure that the sender is routable. This is important to prevent
## undeliverable bounces.
<:${if def:acl_m_hdrrm{$acl_m_hdrrm:}}\
$2:>):>)
+m4_define(<:DKIM_SIGN_P:>,
+ <:and {{exists{CONF_sysconf_dir/dkim-sign.conf}} \
+ {!def:h_DKIM-Signature:} \
+ {!def:h_List-ID:} \
+ {or {{def:authenticated_id} \
+ {def:authenticated_sender}}}}:>)
+
+m4_define(<:DKIM_KEYS_INSTANCE:>,
+ <:${lookup {${domain:$h_From:}} partial0-lsearch \
+ {CONF_sysconf_dir/dkim-sign.conf} \
+ _LOOKUP_ARGS(<:$1:>, <:$2:>)}:>)
+m4_define(<:DKIM_KEYS_STATE:>, <:${lookup {$1} lsearch \
+ {DKIM_KEYS_INSTANCE(<:{CONF_dkim_keys_dir/$value/active/dkim-keys.state}:>)} \
+ _LOOKUP_ARGS(<:$2:>, <:$3:>, <:fail:>)}:>)
+m4_define(<:DKIM_KEYS_INFO:>, <:DKIM_KEYS_STATE(<:params:>,
+ <:{${if and {{>={$tod_epoch}{KV(t0)}} \
+ {<{$tod_epoch}{${eval:KV(t0) + KV(n)*KV(step)}}}} \
+ {DKIM_KEYS_STATE(<:info.${eval:($tod_epoch - KV(t0))/KV(step)}:>,
+ <:$1:>, <:$2:>)} \
+ m4_ifelse(<:$2:>, <::>, <:fail:>, <:$2:>)}}:>,
+ m4_ifelse(<:$2:>, <::>, <:fail:>, <:$2:>)):>)
+
+m4_define(<:DKIM_SIGN:>,
+ <:dkim_domain = \
+ ${if DKIM_SIGN_P \
+ {DKIM_KEYS_INSTANCE({${domain:$h_From:}})}}
+ dkim_selector = DKIM_KEYS_INFO(<:{KV(k)}:>)
+ dkim_private_key = \
+ DKIM_KEYS_INSTANCE(<:m4_dnl
+ {CONF_dkim_keys_dir/$value/active/$dkim_selector.priv}:>)
+ dkim_canon = relaxed
+ dkim_strict = true
+ dkim_sign_headers = CONF_dkim_headers:\
+ X-CONF_header_token-DKIM-Key-Publication
+ headers_add = \
+ ${if DKIM_SIGN_P \
+ {DKIM_KEYS_INFO(<:m4_dnl
+ {X-CONF_header_token-DKIM-Key-Publication: \
+ DKIM signature not suitable for \
+ as evidence after delivery; \
+ DKIM private key KV(k) will be \
+ published at KV(u) on or before \
+ KV(tpub)}:>)}}:>)
+
m4_define(<:SMTP_DELIVERY:>,
<:## Prevent sending messages with overly long lines. The use of
## `message_size_limit' here is somewhat misleading.
driver = smtp
SMTP_DELIVERY
APPLY_HEADER_CHANGES
+ DKIM_SIGN
tls_require_ciphers = CONF_acceptable_ciphers
tls_dh_min_bits = 508
tls_tempfail_tryclear = true
<:driver = smtp
SMTP_DELIVERY
APPLY_HEADER_CHANGES
+ DKIM_SIGN
hosts_try_auth = *
hosts_require_tls = DOMKV(tls-peer-ca, {*}{})
hosts_require_auth = \