SECTION(global, priv)m4_dnl
admin_groups = CONF_admin_groups
+trusted_groups = CONF_trusted_groups
prod_requires_admin = false
SECTION(global, logging)m4_dnl
SECTION(global, daemon)m4_dnl
local_interfaces = <; CONF_interfaces
-extra_local_interfaces = <; 0.0.0.0 ; ::
+extra_local_interfaces = <; 0.0.0.0 ; ::0
SECTION(global, resource)m4_dnl
deliver_queue_load_max = 8
extract_addresses_remove_arguments = false
headers_charset = utf-8
qualify_domain = CONF_master_domain
+untrusted_set_sender = *
SECTION(global, bounce)m4_dnl
delay_warning = 1h : 24h : 2d
SECTION(global, tls)m4_dnl
-tls_certificate = CONF_sysconf_dir/server.cert
+tls_certificate = CONF_sysconf_dir/server.certlist
tls_privatekey = CONF_sysconf_dir/server.key
tls_advertise_hosts = ${if exists {CONF_sysconf_dir/server.key} {*}{}}
tls_dhparam = CONF_ca_dir/dh-param-2048.pem
{CONF_sysconf_dir/helo.conf} \
{${if match_ip \
{$sender_host_address} \
- {$value}}}}}}
+ {<; $value}}}}}}
!verify = helo
set acl_c_helo_warning = true
mail:
## If we stashed a warning header about HELO from earlier, we should
- ## add it now.
+ ## add it now. Only don't bother if the client has authenticated
+ ## successfully for submission (because we can't expect mobile
+ ## clients to be properly set up knowing their names), or it's one of
+ ## our own satellites (because they're either properly set up anyway,
+ ## or satellites using us as a smarthost).
warn condition = $acl_c_helo_warning
+ !condition = ${if eq{$acl_c_mode}{submission}}
+ !hosts = +allnets
add_header = :after_received:X-Distorted-Warning: \
BADHELO \
Client's HELO doesn't match its IP address.\n\t\
## Always allow the empty sender, so that we can receive bounces.
accept senders = :
- ## Ensure that the sender is routable. This is important to prevent
- ## undeliverable bounces.
- require message = Invalid sender; \
- ($sender_verify_failure; $acl_verify_message)
- verify = sender
+ ## Ensure that the sender looks valid.
+ require acl = mail_check_sender
## If this is directly from a client then hack on it for a while.
warn condition = ${if eq{$acl_c_mode}{submission}}
- control = submission
+ control = submission/sender_retain
## Insist that a local client connect through TLS.
deny message = Hosts within CONF_master_domain must use TLS
## And we're done.
accept
+SECTION(acl, misc)m4_dnl
+mail_check_sender:
+
+ ## See whether there's a special exception for this sender domain.
+ accept senders = ${LOOKUP_DOMAIN($sender_address_domain,
+ {KV(senders, {$value}{})},
+ {})}
+
+ ## Ensure that the sender is routable. This is important to prevent
+ ## undeliverable bounces.
+ require message = Invalid sender; \
+ ($sender_verify_failure; $acl_verify_message)
+ verify = sender
+
+ ## We're good, then.
+ accept
+
SECTION(global, acl)m4_dnl
acl_smtp_connect = connect
SECTION(acl, connect)m4_dnl
## Reject if the client isn't allowed to relay and the recipient
## isn't in one of our known domains.
- deny message = Relaying not permitted
- !hosts = CONF_relay_clients
- !authenticated = *
- !domains = +known
+ require message = Relaying not permitted
+ acl = check_relay
## Ensure that the recipient is routable.
require message = Invalid recipient \
($recipient_verify_failure; $acl_verify_message)
verify = recipient
+SECTION(acl, misc)m4_dnl
+check_relay:
+ ## Accept either if the client is allowed to relay through us, or if
+ ## we're the correct place to send this mail.
+
+ ## Known clients and authenticated users are OK.
+ accept hosts = CONF_relay_clients
+ accept authenticated = *
+
+ ## Known domains are OK.
+ accept domains = +public
+
+ ## Finally, domains in our table are OK, unless they say they aren't.
+ accept domains = \
+ ${if exists{CONF_sysconf_dir/domains.conf} \
+ {partial0-lsearch; CONF_sysconf_dir/domains.conf}}
+ condition = DOMKV(service, {$value}{true})
+
+ ## Nope, that's not allowed.
+ deny
+
SECTION(acl, rcpt-tail)m4_dnl
## Everything checks out OK: let this one go through.
accept
SECTION(global, acl)m4_dnl
acl_smtp_expn = expn_vrfy
acl_smtp_vrfy = expn_vrfy
-SECTION(acl)m4_dnl
+SECTION(acl, misc)m4_dnl
expn_vrfy:
accept hosts = +trusted
deny message = Suck it and see
warn set acl_c_user = $authenticated_id
hosts = +thishost
!authenticated = *
+ condition = ${if def:sender_ident}
set acl_c_user = $sender_ident
- ## User must be authenticated.
+ ## User must be authenticated by now.
deny message = Sender not authenticated
- !hosts = +thishost
- !authenticated = *
-
- ## Make sure that the local part is one that the authenticated sender
- ## is allowed to claim.
- deny message = Sender address forbidden to calling user
- !condition = ${LOOKUP_DOMAIN($sender_address_domain,
- {${if and {{match_local_part \
- {$acl_c_user} \
- {+dom_users}} \
- {match_local_part \
- {$sender_address_local_part} \
- {+dom_locals}}}}},
- {${if and {{match_local_part \
- {$sender_address_local_part} \
- {+user_extaddr}} \
- {or {{eq {$sender_address_domain} \
- {}} \
- {match_domain \
- {$sender_address_domain} \
- {+public}}}}}}})}
+ condition = ${if !def:acl_c_user}
## All done.
accept
DIVERT(null)
###--------------------------------------------------------------------------
+### Common routers.
+
+SECTION(routers, alias)m4_dnl
+## Look up the local part in the address map.
+alias:
+ driver = redirect
+ allow_fail = true
+ allow_defer = true
+ user = CONF_filter_user
+ FILTER_TRANSPORTS
+ local_parts = nwildlsearch; CONF_alias_file
+ data = ${expand:$local_part_data}
+SECTION(routers, alias-opts)m4_dnl
+
+DIVERT(null)
+###--------------------------------------------------------------------------
### Some standard transports.
m4_define(<:USER_DELIVERY:>,
smtp_local:
driver = smtp
hosts_require_tls = *
- tls_certificate = CONF_sysconf_dir/client.cert
+ tls_certificate = CONF_sysconf_dir/client.certlist
tls_privatekey = CONF_sysconf_dir/client.key
tls_verify_certificates = CONF_ca_dir/ca.cert
tls_require_ciphers = CONF_good_ciphers