diff --git a/postfix/HISTORY b/postfix/HISTORY index 19895a78c..913da047d 100644 --- a/postfix/HISTORY +++ b/postfix/HISTORY @@ -28959,20 +28959,29 @@ Apologies for any names omitted. Completed: simplified cleanup_envelope_test implementation. -TODO: +20250127 - Add a log-only mode for REQUIRETLS, so that one can find out - how much would break. Maybe make it a map, so that different - sites can have different enforcement levels. + Cleanup: broken non-TLS builds because of a missing #ifdef + USE_TLS/#endif around a new function get_effective_tls_level(). + File: smtp/smtp_connect.c. - If we support log-only REQUIRETLS, then don't panic ("can't - happen") when the code reaches a point that can't be reached - when REQUIRETLS is actually enforced. + Cleanup: a few remaining pre-ANSI C function definitions + in the lowest-level Postfix code. Files: util/binhash.c, + util/close_on_exec.c, util/non_blocking.c, util/ring.c. + +20250129 + + Completed: smtp_enforce_requiretls list of next-hop domains + (or UNIX-domain pathnames) that are ready for REQUIRETLS + enforcement. This may help with gradual adoption. + +TODO Encapsulate the sendopts-to-cleanup-flags mapping. How do we make it work with multi-instance SMTP-based content - filters? How is this different from the single-instance case? + filters? How is this different from the single-instance + case? What REQUIRETLS expectations can we enforce when delivering over a UNIX-domain channel? The SMTP/LMTP client currently diff --git a/postfix/html/lmtp.8.html b/postfix/html/lmtp.8.html index 054c592fd..715a34ee9 100644 --- a/postfix/html/lmtp.8.html +++ b/postfix/html/lmtp.8.html @@ -765,6 +765,13 @@ SMTP(8) SMTP(8) Enable support for the ESMTP verb "REQUIRETLS", defined in RFC 8689. + smtp_enforce_requiretls (empty) + An optional list of next-hop destinations that the Postfix + SMTP/LMTP client will enforce REQUIRETLS for, when a message was + received with the REQUIRETLS option: the next-hop server must + offer a matching TLS server certificate, and the server must + announce REQUIRETLS support). + OBSOLETE TLS CONTROLS The following configuration parameters exist for compatibility with Postfix versions before 2.3. Support for these will be removed in a diff --git a/postfix/html/postconf.5.html b/postfix/html/postconf.5.html index 1150d0316..c755aaabf 100644 --- a/postfix/html/postconf.5.html +++ b/postfix/html/postconf.5.html @@ -5041,6 +5041,17 @@ configuration parameter. See there for details.
This feature is available in Postfix 2.11 and later.
+ + +The LMTP-specific version of the smtp_enforce_requiretls +configuration parameter. See there for details.
+ +This feature is available in Postfix ≥ 3.10.
+ +Note: REQUIRETLS overrides "TLS-Required: no".
+Notes:
+ +REQUIRETLS enforcement is controlled with smtp_enforce_requiretls +or lmtp_enforce_requiretls.
+ +REQUIRETLS overrides "TLS-Required: no".
+ +This feature is available in Postfix ≥ 3.10.
@@ -11921,6 +11941,86 @@ RES_USE_DNSSEC and RES_USE_EDNS0 resolver options.This feature is available in Postfix 2.11 and later.
+ + +An optional list of next-hop destinations that the Postfix +SMTP/LMTP client will enforce REQUIRETLS for, when a message was +received with the REQUIRETLS option: the next-hop server must offer +a matching TLS server certificate, and the server must announce +REQUIRETLS support). Such a message will be returned to the sender +if some REQUIRETLS requirement cannot be satisfied. These "hard" +REQUIRETLS failures are logged as "REQUIRETLS failure".
+ +Other messages that were received with the REQUIRETLS option +will be delivered with REQUIRETLS if possible. If not, a message +will be delivered as if it was received without the REQUIRETLS +option. This allows a mail sending site to discover when REQUIRETLS +can be enforced, without disrupting email deliveries. These "soft" +REQUIRETLS failures are logged with "REQUIRETLS Debug".
+ +On a perimeter MTA, it can make sense to turn off REQUIRETLS +enforcement, or even to turn off REQUIRETLS support, when delivering +a message to an internal destination. The internal servers may not +support REQUIRETLS, and their connections may be secured with means +other than DANE, STS, and the like.
+ +The supported syntax differs with SMTP and LMTP:
+ +With SMTP, specify a list of next-hop domain names (without +the ":port" or ":service" suffix), "/file/name" patterns or +"type:table" lookup tables, separated by commas and/or whitespace. +Continue long lines by starting the next line with whitespace. A +"/file/name" pattern is replaced by its contents; a "type:table" +lookup table is matched when a domain appears as lookup key. Specify +"!pattern" to exclude a domain from the list.
+ +With LMTP, specify list of domain names (without the "inet": +prefix, or ":port" or ":service" suffix), and/or UNIX-domain socket +"/path/name" (without the "unix:" prefix), separated by commas +and/or whitespace. Continue long lines by starting the next line +with whitespace. Specify "!pattern" to exclude a pattern from the +list.
+ +By default, specify the form ".domain" to match any name ending +in ".domain". This behavior is controlled by the presence or absence +of "smtp_enforce_requiretls" or "lmtp_enforce_requiretls" in the +parent_domain_matches_subdomains parameter value (by default they +are absent).
+ ++SMTP Examples: +
+ ++# Enforce REQUIRETLS for SMTP with selected next-hop domains. +smtp_enforce_requiretls = example.com, foo.example ++ +
+# Enforce REQUIRETLS for SMTP with all but a few next-hop domains. +smtp_enforce_requiretls = !foo.example, static:all +
+LMTP examples: +
+ ++# Don't enforce REQUIRETLS +lmtp_enforce_requiretls = ++ +
+# Enforce REQUIRETLS for specific destinations. +lmtp_enforce_requiretls = /path/to/socket, message-store.example +
This feature is available in Postfix ≥ 3.10.
+ +Note: REQUIRETLS overrides "TLS-Required: no".
+Notes:
+ +REQUIRETLS enforcement is controlled with smtp_enforce_requiretls +or lmtp_enforce_requiretls.
+ +REQUIRETLS overrides "TLS-Required: no".
+ +This feature is available in Postfix ≥ 3.10.
+ +%PARAM smtp_enforce_requiretls empty + +An optional list of next-hop destinations that the Postfix +SMTP/LMTP client will enforce REQUIRETLS for, when a message was +received with the REQUIRETLS option: the next-hop server must offer +a matching TLS server certificate, and the server must announce +REQUIRETLS support). Such a message will be returned to the sender +if some REQUIRETLS requirement cannot be satisfied. These "hard" +REQUIRETLS failures are logged as "REQUIRETLS failure".
+ +Other messages that were received with the REQUIRETLS option +will be delivered with REQUIRETLS if possible. If not, a message +will be delivered as if it was received without the REQUIRETLS +option. This allows a mail sending site to discover when REQUIRETLS +can be enforced, without disrupting email deliveries. These "soft" +REQUIRETLS failures are logged with "REQUIRETLS Debug".
+ +On a perimeter MTA, it can make sense to turn off REQUIRETLS +enforcement, or even to turn off REQUIRETLS support, when delivering +a message to an internal destination. The internal servers may not +support REQUIRETLS, and their connections may be secured with means +other than DANE, STS, and the like.
+ +The supported syntax differs with SMTP and LMTP:
+ +With SMTP, specify a list of next-hop domain names (without +the ":port" or ":service" suffix), "/file/name" patterns or +"type:table" lookup tables, separated by commas and/or whitespace. +Continue long lines by starting the next line with whitespace. A +"/file/name" pattern is replaced by its contents; a "type:table" +lookup table is matched when a domain appears as lookup key. Specify +"!pattern" to exclude a domain from the list.
+ +With LMTP, specify list of domain names (without the "inet": +prefix, or ":port" or ":service" suffix), and/or UNIX-domain socket +"/path/name" (without the "unix:" prefix), separated by commas +and/or whitespace. Continue long lines by starting the next line +with whitespace. Specify "!pattern" to exclude a pattern from the +list.
+ +By default, specify the form ".domain" to match any name ending +in ".domain". This behavior is controlled by the presence or absence +of "smtp_enforce_requiretls" or "lmtp_enforce_requiretls" in the +parent_domain_matches_subdomains parameter value (by default they +are absent).
+ ++SMTP Examples: +
+ ++# Enforce REQUIRETLS for SMTP with selected next-hop domains. +smtp_enforce_requiretls = example.com, foo.example ++ +
+# Enforce REQUIRETLS for SMTP with all but a few next-hop domains. +smtp_enforce_requiretls = !foo.example, static:all +
+LMTP examples: +
+ ++# Don't enforce REQUIRETLS +lmtp_enforce_requiretls = ++ +
+# Enforce REQUIRETLS for specific destinations. +lmtp_enforce_requiretls = /path/to/socket, message-store.example +
This feature is available in Postfix ≥ 3.10.
+ +%PARAM lmtp_enforce_requiretls empty + +The LMTP-specific version of the smtp_enforce_requiretls +configuration parameter. See there for details.
This feature is available in Postfix ≥ 3.10.
diff --git a/postfix/proto/stop.spell-cc b/postfix/proto/stop.spell-cc index 34e439196..c8fffdf36 100644 --- a/postfix/proto/stop.spell-cc +++ b/postfix/proto/stop.spell-cc @@ -1858,3 +1858,4 @@ TINYCDB getdata XXXSENDOPTS xtra +NODICT diff --git a/postfix/src/global/addr_match_list.c b/postfix/src/global/addr_match_list.c index 8008df203..136ce24b5 100644 --- a/postfix/src/global/addr_match_list.c +++ b/postfix/src/global/addr_match_list.c @@ -42,6 +42,10 @@ /* Request that addr_match_list_match() logs a warning and /* returns zero with list->error set to a non-zero dictionary /* error code, instead of raising a fatal error. +/* .IP MATCH_FLAG_NOFILE +/* Disable special handling for /file/name. +/* .IP MATCH_FLAG_NODICT +/* Disable special handling for type:name. /* .PP /* Specify MATCH_FLAG_NONE to request none of the above. /* The last argument is a list of patterns, or the absolute @@ -67,6 +71,9 @@ /* IBM T.J. Watson Research /* P.O. Box 704 /* Yorktown Heights, NY 10598, USA +/* +/* Wietse Venema +/* porcupine.org /*--*/ /* System library. */ diff --git a/postfix/src/global/domain_list.c b/postfix/src/global/domain_list.c index d79beafd3..e3fe1caec 100644 --- a/postfix/src/global/domain_list.c +++ b/postfix/src/global/domain_list.c @@ -45,6 +45,10 @@ /* Request that domain_list_match() logs a warning and returns /* zero, with list->error set to a non-zero dictionary error /* code, instead of raising a fatal error. +/* .IP MATCH_FLAG_NOFILE +/* Disable special handling for /file/name. +/* .IP MATCH_FLAG_NODICT +/* Disable special handling for type:name. /* .PP /* Specify MATCH_FLAG_NONE to request none of the above. /* The last argument is a list of domain patterns, or the name of @@ -69,6 +73,9 @@ /* IBM T.J. Watson Research /* P.O. Box 704 /* Yorktown Heights, NY 10598, USA +/* +/* Wietse Venema +/* porcupine.org /*--*/ /* System library. */ diff --git a/postfix/src/global/mail_params.h b/postfix/src/global/mail_params.h index fc0b7a5f6..6a0417169 100644 --- a/postfix/src/global/mail_params.h +++ b/postfix/src/global/mail_params.h @@ -4387,6 +4387,13 @@ extern int var_requiretls_enable; #define DEF_TLSREQUIRED_ENABLE "yes" extern int var_tls_required_enable; +#define VAR_SMTP_ENFORCE_REQUIRETLS "smtp_enforce_requiretls" +#define DEF_SMTP_ENFORCE_REQUIRETLS "" +extern char *var_smtp_enforce_requiretls; + +#define VAR_LMTP_ENFORCE_REQUIRETLS "lmtp_enforce_requiretls" +#define DEF_LMTP_ENFORCE_REQUIRETLS "" + /* * Workaround for future incompatibility. Our implementation of RFC 2308 * negative reply caching relies on the promise that res_query() and diff --git a/postfix/src/global/mail_version.h b/postfix/src/global/mail_version.h index f2675f1fd..41df81ba5 100644 --- a/postfix/src/global/mail_version.h +++ b/postfix/src/global/mail_version.h @@ -20,7 +20,7 @@ * Patches change both the patchlevel and the release date. Snapshots have no * patchlevel; they change the release date only. */ -#define MAIL_RELEASE_DATE "20250126" +#define MAIL_RELEASE_DATE "20250129" #define MAIL_VERSION_NUMBER "3.10" #ifdef SNAPSHOT diff --git a/postfix/src/global/namadr_list.c b/postfix/src/global/namadr_list.c index 071a73341..0a9a9054f 100644 --- a/postfix/src/global/namadr_list.c +++ b/postfix/src/global/namadr_list.c @@ -51,6 +51,10 @@ /* Request that namadr_list_match() logs a warning and returns /* zero with list->error set to a non-zero dictionary error /* code, instead of raising a fatal error. +/* .IP MATCH_FLAG_NOFILE +/* Disable special handling for /file/name. +/* .IP MATCH_FLAG_NODICT +/* Disable special handling for type:name. /* .PP /* Specify MATCH_FLAG_NONE to request none of the above. /* The last argument is a list of patterns, or the absolute @@ -75,6 +79,9 @@ /* IBM T.J. Watson Research /* P.O. Box 704 /* Yorktown Heights, NY 10598, USA +/* +/* Wietse Venema +/* porcupine.org /*--*/ /* System library. */ diff --git a/postfix/src/global/string_list.c b/postfix/src/global/string_list.c index ddd950a00..88a43fb1b 100644 --- a/postfix/src/global/string_list.c +++ b/postfix/src/global/string_list.c @@ -39,6 +39,10 @@ /* Request that string_list_match() logs a warning and returns /* zero with list->error set to a non-zero dictionary error /* code, instead of raising a fatal error. +/* .IP MATCH_FLAG_NOFILE +/* Disable special handling for /file/name. +/* .IP MATCH_FLAG_NODICT +/* Disable special handling for type:name. /* .PP /* Specify MATCH_FLAG_NONE to request none of the above. /* The last argument specifies a list of string patterns. @@ -61,6 +65,9 @@ /* IBM T.J. Watson Research /* P.O. Box 704 /* Yorktown Heights, NY 10598, USA +/* +/* Wietse Venema +/* porcupine.org /*--*/ /* System library. */ diff --git a/postfix/src/smtp/Makefile.in b/postfix/src/smtp/Makefile.in index 44add46b2..801e7ee0e 100644 --- a/postfix/src/smtp/Makefile.in +++ b/postfix/src/smtp/Makefile.in @@ -84,6 +84,7 @@ smtp.o: ../../include/deliver_request.h smtp.o: ../../include/delivered_hdr.h smtp.o: ../../include/dict.h smtp.o: ../../include/dns.h +smtp.o: ../../include/domain_list.h smtp.o: ../../include/dsn.h smtp.o: ../../include/dsn_buf.h smtp.o: ../../include/ext_prop.h @@ -134,6 +135,7 @@ smtp_addr.o: ../../include/check_arg.h smtp_addr.o: ../../include/deliver_request.h smtp_addr.o: ../../include/dict.h smtp_addr.o: ../../include/dns.h +smtp_addr.o: ../../include/domain_list.h smtp_addr.o: ../../include/dsn.h smtp_addr.o: ../../include/dsn_buf.h smtp_addr.o: ../../include/header_body_checks.h @@ -178,6 +180,7 @@ smtp_chat.o: ../../include/cleanup_user.h smtp_chat.o: ../../include/deliver_request.h smtp_chat.o: ../../include/dict.h smtp_chat.o: ../../include/dns.h +smtp_chat.o: ../../include/domain_list.h smtp_chat.o: ../../include/dsn.h smtp_chat.o: ../../include/dsn_buf.h smtp_chat.o: ../../include/dsn_util.h @@ -229,6 +232,7 @@ smtp_connect.o: ../../include/deliver_pass.h smtp_connect.o: ../../include/deliver_request.h smtp_connect.o: ../../include/dict.h smtp_connect.o: ../../include/dns.h +smtp_connect.o: ../../include/domain_list.h smtp_connect.o: ../../include/dsn.h smtp_connect.o: ../../include/dsn_buf.h smtp_connect.o: ../../include/header_body_checks.h @@ -284,6 +288,7 @@ smtp_key.o: ../../include/check_arg.h smtp_key.o: ../../include/deliver_request.h smtp_key.o: ../../include/dict.h smtp_key.o: ../../include/dns.h +smtp_key.o: ../../include/domain_list.h smtp_key.o: ../../include/dsn.h smtp_key.o: ../../include/dsn_buf.h smtp_key.o: ../../include/header_body_checks.h @@ -321,6 +326,7 @@ smtp_map11.o: ../../include/check_arg.h smtp_map11.o: ../../include/deliver_request.h smtp_map11.o: ../../include/dict.h smtp_map11.o: ../../include/dns.h +smtp_map11.o: ../../include/domain_list.h smtp_map11.o: ../../include/dsn.h smtp_map11.o: ../../include/dsn_buf.h smtp_map11.o: ../../include/header_body_checks.h @@ -361,6 +367,7 @@ smtp_misc.o: ../../include/check_arg.h smtp_misc.o: ../../include/deliver_request.h smtp_misc.o: ../../include/dict.h smtp_misc.o: ../../include/dns.h +smtp_misc.o: ../../include/domain_list.h smtp_misc.o: ../../include/dsn.h smtp_misc.o: ../../include/dsn_buf.h smtp_misc.o: ../../include/ext_prop.h @@ -404,6 +411,7 @@ smtp_proto.o: ../../include/defer.h smtp_proto.o: ../../include/deliver_request.h smtp_proto.o: ../../include/dict.h smtp_proto.o: ../../include/dns.h +smtp_proto.o: ../../include/domain_list.h smtp_proto.o: ../../include/dsn.h smtp_proto.o: ../../include/dsn_buf.h smtp_proto.o: ../../include/dsn_mask.h @@ -470,6 +478,7 @@ smtp_rcpt.o: ../../include/deliver_completed.h smtp_rcpt.o: ../../include/deliver_request.h smtp_rcpt.o: ../../include/dict.h smtp_rcpt.o: ../../include/dns.h +smtp_rcpt.o: ../../include/domain_list.h smtp_rcpt.o: ../../include/dsn.h smtp_rcpt.o: ../../include/dsn_buf.h smtp_rcpt.o: ../../include/dsn_mask.h @@ -510,6 +519,7 @@ smtp_reuse.o: ../../include/check_arg.h smtp_reuse.o: ../../include/deliver_request.h smtp_reuse.o: ../../include/dict.h smtp_reuse.o: ../../include/dns.h +smtp_reuse.o: ../../include/domain_list.h smtp_reuse.o: ../../include/dsn.h smtp_reuse.o: ../../include/dsn_buf.h smtp_reuse.o: ../../include/header_body_checks.h @@ -551,6 +561,7 @@ smtp_sasl_auth_cache.o: ../../include/deliver_request.h smtp_sasl_auth_cache.o: ../../include/dict.h smtp_sasl_auth_cache.o: ../../include/dict_proxy.h smtp_sasl_auth_cache.o: ../../include/dns.h +smtp_sasl_auth_cache.o: ../../include/domain_list.h smtp_sasl_auth_cache.o: ../../include/dsn.h smtp_sasl_auth_cache.o: ../../include/dsn_buf.h smtp_sasl_auth_cache.o: ../../include/dsn_util.h @@ -591,6 +602,7 @@ smtp_sasl_glue.o: ../../include/check_arg.h smtp_sasl_glue.o: ../../include/deliver_request.h smtp_sasl_glue.o: ../../include/dict.h smtp_sasl_glue.o: ../../include/dns.h +smtp_sasl_glue.o: ../../include/domain_list.h smtp_sasl_glue.o: ../../include/dsn.h smtp_sasl_glue.o: ../../include/dsn_buf.h smtp_sasl_glue.o: ../../include/header_body_checks.h @@ -636,6 +648,7 @@ smtp_sasl_proto.o: ../../include/check_arg.h smtp_sasl_proto.o: ../../include/deliver_request.h smtp_sasl_proto.o: ../../include/dict.h smtp_sasl_proto.o: ../../include/dns.h +smtp_sasl_proto.o: ../../include/domain_list.h smtp_sasl_proto.o: ../../include/dsn.h smtp_sasl_proto.o: ../../include/dsn_buf.h smtp_sasl_proto.o: ../../include/header_body_checks.h @@ -677,6 +690,7 @@ smtp_session.o: ../../include/debug_peer.h smtp_session.o: ../../include/deliver_request.h smtp_session.o: ../../include/dict.h smtp_session.o: ../../include/dns.h +smtp_session.o: ../../include/domain_list.h smtp_session.o: ../../include/dsn.h smtp_session.o: ../../include/dsn_buf.h smtp_session.o: ../../include/header_body_checks.h @@ -717,6 +731,7 @@ smtp_state.o: ../../include/debug_peer.h smtp_state.o: ../../include/deliver_request.h smtp_state.o: ../../include/dict.h smtp_state.o: ../../include/dns.h +smtp_state.o: ../../include/domain_list.h smtp_state.o: ../../include/dsn.h smtp_state.o: ../../include/dsn_buf.h smtp_state.o: ../../include/header_body_checks.h @@ -757,6 +772,7 @@ smtp_tls_policy.o: ../../include/ctable.h smtp_tls_policy.o: ../../include/deliver_request.h smtp_tls_policy.o: ../../include/dict.h smtp_tls_policy.o: ../../include/dns.h +smtp_tls_policy.o: ../../include/domain_list.h smtp_tls_policy.o: ../../include/dsn.h smtp_tls_policy.o: ../../include/dsn_buf.h smtp_tls_policy.o: ../../include/header_body_checks.h @@ -799,6 +815,7 @@ smtp_tlsrpt.o: ../../include/check_arg.h smtp_tlsrpt.o: ../../include/deliver_request.h smtp_tlsrpt.o: ../../include/dict.h smtp_tlsrpt.o: ../../include/dns.h +smtp_tlsrpt.o: ../../include/domain_list.h smtp_tlsrpt.o: ../../include/dsn.h smtp_tlsrpt.o: ../../include/dsn_buf.h smtp_tlsrpt.o: ../../include/header_body_checks.h @@ -843,6 +860,7 @@ smtp_trouble.o: ../../include/deliver_completed.h smtp_trouble.o: ../../include/deliver_request.h smtp_trouble.o: ../../include/dict.h smtp_trouble.o: ../../include/dns.h +smtp_trouble.o: ../../include/domain_list.h smtp_trouble.o: ../../include/dsn.h smtp_trouble.o: ../../include/dsn_buf.h smtp_trouble.o: ../../include/header_body_checks.h @@ -884,6 +902,7 @@ smtp_unalias.o: ../../include/check_arg.h smtp_unalias.o: ../../include/deliver_request.h smtp_unalias.o: ../../include/dict.h smtp_unalias.o: ../../include/dns.h +smtp_unalias.o: ../../include/domain_list.h smtp_unalias.o: ../../include/dsn.h smtp_unalias.o: ../../include/dsn_buf.h smtp_unalias.o: ../../include/header_body_checks.h diff --git a/postfix/src/smtp/lmtp_params.c b/postfix/src/smtp/lmtp_params.c index b77500326..8dfc5ace9 100644 --- a/postfix/src/smtp/lmtp_params.c +++ b/postfix/src/smtp/lmtp_params.c @@ -68,6 +68,7 @@ VAR_HFROM_FORMAT, DEF_HFROM_FORMAT, &var_hfrom_format, 1, 0, VAR_USE_SRV_LOOKUP, DEF_USE_SRV_LOOKUP, &var_use_srv_lookup, 0, 0, VAR_LMTP_TLSRPT_SOCKNAME, DEF_LMTP_TLSRPT_SOCKNAME, &var_smtp_tlsrpt_sockname, 0, 0, + VAR_LMTP_ENFORCE_REQUIRETLS, DEF_LMTP_ENFORCE_REQUIRETLS, &var_smtp_enforce_requiretls, 0, 0, 0, }; static const CONFIG_TIME_TABLE lmtp_time_table[] = { diff --git a/postfix/src/smtp/smtp.c b/postfix/src/smtp/smtp.c index 597cc105a..fbaa452a4 100644 --- a/postfix/src/smtp/smtp.c +++ b/postfix/src/smtp/smtp.c @@ -653,6 +653,12 @@ /* .IP "\fBrequiretls_enable (yes)\fR" /* Enable support for the ESMTP verb "REQUIRETLS", defined in RFC /* 8689. +/* .IP "\fBsmtp_enforce_requiretls (empty)\fR" +/* An optional list of next-hop destinations that the Postfix +/* SMTP/LMTP client will enforce REQUIRETLS for, when a message was +/* received with the REQUIRETLS option: the next-hop server must offer +/* a matching TLS server certificate, and the server must announce +/* REQUIRETLS support). /* OBSOLETE TLS CONTROLS /* .ad /* .fi @@ -1020,6 +1026,8 @@ #include