Import Postfix 3.8.4 (last was 3.7.3)

December 22, 2023: 3.8.4/3.7.9
==============================

Security: this release adds support to defend against an email
spoofing attack (SMTP smuggling) on recipients at a Postfix server.
For background, see https://www.postfix.org/smtp-smuggling.html.

Sites concerned about SMTP smuggling attacks should enable this
feature on Internet-facing Postfix servers. For compatibility with
non-standard clients, Postfix by default excludes clients in
mynetworks from this countermeasure.

The recommended settings are:

# Optionally disconnect remote SMTP clients that send bare newlines,
# but allow local clients with non-standard SMTP implementations
# such as netcat, fax machines, or load balancer health checks.
#
smtpd_forbid_bare_newline = yes
smtpd_forbid_bare_newline_exclusions = $mynetworks
The smtpd_forbid_bare_newline feature is disabled by default.

November 1, 2023: 3.8.3/3.7.8
=============================

Bugfix (defect introduced Postfix 2.5, date 20080104): the Postfix
SMTP server was waiting for a client command instead of replying
immediately, after a client certificate verification error in TLS
wrappermode. Reported by Andreas Kinzler.

Usability: the Postfix SMTP server (finally) attempts to log the
SASL username after authentication failure. In Postfix logging,
this appends ", sasl_username=xxx" after the reason for SASL
authentication failure. The logging replaces an unavailable reason
with "(reason unavailable)", and replaces an unavailable sasl_username
with "(unavailable)". Based on code by Jozsef Kadlecsik.

Compatibility bugfix (defect introduced: Postfix 2.11, date 20130405):
in forward_path, the expression ${recipient_delimiter} would expand
to an empty string when a recipient address had no recipient
delimiter. The compatibility fix is to use a configured recipient
delimiter value instead. Reported by Tod A. Sandman.

September 1, 2023: 3.8.2/3.7.7
==============================

Bugfix (defect introduced: Postfix alpha, 19980207): the valid_hostname()
check in the Postfix DNS client library was blocking unusual but
legitimate wildcard names (*.name) in some DNS lookup results and
lookup requests. Examples:

name          class/type result
*.one.example   IN CNAME *.other.example
*.other.example IN A     10.0.0.1
*.other.example IN TLSA  ..certificate info...
Such syntax is blesed in RFC 1034 section 4.3.3.

Bugfix (defect introduced: Postfix 3.0, 20140218): when an address
verification probe fails during or after an opportunistic TLS
handshake, don't enforce a minimum time-in-queue before falling
back to plaintext. Problem reported by Serg.

June 5, 2023: 3.8.1/3.7.6
=========================

Optional: harden a Postfix SMTP server against remote SMTP clients
that violate RFC 2920 (or 5321) command pipelining constraints.
With "smtpd_forbid_unauth_pipelining = yes", the server disconnects
a client immediately, after responding with "554 5.5.0 Error: SMTP
protocol synchronization" and after logging "improper command
pipelining" with the unexpected remote SMTP client input. This
feature is disabled by default in Postfix 3.5-3.8 to avoid breaking
home-grown utilities, but it is enabled by default in Postfix 3.9.
A similar feature is enabled by default in the Exim SMTP server.

Optional: some OS distributions crank up TLS security to 11, and
in doing so increase the number of plaintext email deliveries. This
introduces basic OpenSSL configuration file support that may be
used to override OS-level settings. Details are in the postconf(5)
manpage under tls_config_file and tls_config_name.

Bugfix (defect introduced: Postfix 1.0): the command "postconf ..
name=v1 .. name=v2 .." (multiple instances of the same parameter
name) created multiple main.cf name=value entries with the same
parameter name. It now logs a warning and skips the earlier name(s)
and value(s). Found during code maintenance.

Bugfix (defect introduced: Postfix 3.3): the command "postconf -M
name1/type1='name2 type2 ...'" died with a segmentation violation
when the request matched multiple master.cf entries. The master.cf
file was not damaged. Problem reported by SATOH Fumiyasu.

Bugfix (defect introduced: Postfix 2.11): the command "postconf -M
name1/type1='name2 type2 ...'" could add a service definition to
master.cf that conflicted with an already existing service definition.
It now replaces all existing service definitions that match the
service pattern 'name1/type1' or the service name and type in 'name2
type2 ...' with a single service definition 'name2 type2 ...'.
Problem reported by SATOH Fumiyasu.

Bugfix (defect introduced: Postfix 3.8) the posttls-finger command
could access uninitialized memory when reconnecting. This also
fixes a malformed warning message when a destination contains
":service" information. Reported by Thomas Korbar.

Bugfix (defect introduced: Postfix 3.2): the MySQL client could
return "not found" instead of "error" (for example, resulting in
a 5XX SMTP status instead of 4XX) during the time that all MySQL
server connections were turned down after error. Found during code
maintenance. File: global/dict_mysql.c. This was already fixed in
Postfix 3.4-3.7.

April 18, 2023: 3.7.5
=====================

Bugfix (problem introduced in Postfix 3.5): check_ccert_access did
not handle inline map specifications. Report and fix by Sean
Gallagher.

Bugfix (problem introduced in Postfix 3.4): the posttls-finger
command failed to detect that a connection was resumed in the case
that a server did not return a certificate. Fix by Viktor Dukhovni.

Workaround: OpenSSL 3.x EVP_get_cipherbyname() can return lazily-bound
handles. Postfix now checks that the expected functionality will
be available instead of failing later. Fix by Viktor Dukhovni.

Safety: the long form "{ name = value }" in import_environment or
export_environment is not documented (with spaces around the '='),
but it was silently accepted, and it was stored in the process
environment as the invalid form "name = value", thus not setting
or overriding an entry for "name". This form is now stored as the
expected "name=value". Found during code maintenance.

Bugfix (problem introduced in Postfix 3.2): the MySQL client could
return "not found" instead of "error" (for example, resulting in
a 5XX SMTP status instead of 4XX) during the time that all MySQL
server connections were turned down after error. Found during code
maintenance.

April 17, 2023: 3.8.0
=====================

Support to look up DNS SRV records in the Postfix SMTP/LMTP client,
Based on code by Tomas Korbar (Red Hat). For example, with
"use_srv_lookup = submission" and "relayhost = example.com:submission",
the Postfix SMTP client will look up DNS SRV records for
_submission._tcp.example.com, and will relay email through the
hosts and ports that are specified with those records.

TLS obsolescence: Postfix now treats the "export" and "low" cipher
grade settings as "medium". The "export" and "low" grades are no
longer supported in OpenSSL 1.1.1, the minimum version required in
Postfix 3.6.0 and later. Also, Postfix default settings now exclude
deprecated or unused ciphers (SEED, IDEA, 3DES, RC2, RC4, RC5),
digest (MD5), key exchange algorithms (DH, ECDH), and public key
algorithm (DSS).

Attack resistance: the Postfix SMTP server can now aggregate
smtpd_client_*_rate and smtpd_client_*_count statistics by network
block instead of by IP address, to raise the bar against a memory
exhaustion attack in the anvil(8) server; Postfix TLS support
unconditionally disables TLS renegotiation in the middle of an SMTP
connection, to avoid a CPU exhaustion attack.

The PostgreSQL client encoding is now configurable with the "encoding"
Postfix configuration file attribute. The default is "UTF8".
Previously the encoding was hard-coded as "LATIN1", which is not
useful in the context of SMTP.

The postconf command now warns for #comment in or after a Postfix
parameter value. Postfix programs do not support #comment after
other text, and treat that as input.


January 12, 2023: 3.7.4
=======================

Workaround: with OpenSSL 3 and later always turn on
SSL_OP_IGNORE_UNEXPECTED_EOF, to avoid warning messages and missed
opportunities for TLS session reuse. This is safe because the SMTP
protocol implements application-level framing, and is therefore
not affected by TLS truncation attacks. Fix by Viktor Dukhovni.

Workaround: OpenSSL 3.x EVP_get_digestbyname() can return lazily-bound
handles for digest implementations. In sufficiently hostile
configurations, Postfix could mistakenly believe that a digest
algorithm is available, and fail when it is not. A similar workaround
may be needed for EVP_get_cipherbyname(). Fix by Viktor Dukhovni.

Bugfix (bug introduced in Postfix 2.11): the checkok() macro in
tls/tls_fprint.c evaluated its argument unconditionally; it should
evaluate the argument only if there was no prior error. Found during
code review.

Bugfix (bug introduced in Postfix 2.8): postscreen died with a
segmentation violation when postscreen_dnsbl_threshold < 1. It
should reject such input with a fatal error instead. Discovered by
Benny Pedersen.

Bitrot: fixes for linker warnings from newer Darwin (MacOS) versions.
Viktor Dukhovni.

Portability: Linux 6 support.

Added missing documentation that cidr:, pcre: and regexp: tables
support inline specification only in Postfix 3.7 and later.
This commit is contained in:
christos 2023-12-23 20:24:46 +00:00
parent 4f70b70cbe
commit d168ba35ff
419 changed files with 9786 additions and 3849 deletions

View File

@ -26207,7 +26207,7 @@ Apologies for any names omitted.
Cleanup: unit tests. File: cleanup/cleanup_milter.c.
Cleamup: disable hash-table seed in unit tests. Many
Cleanup: disable hash-table seed in unit tests. Many
Makefiles, some unit test 'reference' files.
Bugfix (documented but not implemented since Postfix 2.2):
@ -26234,7 +26234,7 @@ Apologies for any names omitted.
mantools/check-spell-install-proto-text.
Cleanup: for consistent parameter naming (tlsproxy_client_xxx
correspnds to smtp_tls_xxx), renamed tlsproxy_client_level
corresponds to smtp_tls_xxx), renamed tlsproxy_client_level
to tlsproxy_client_security_level, and tlsproxy_client_policy
to tlsproxy_client_policy_maps, with backwards-compatible
defaults and updated documentation. Problem reported by
@ -26258,7 +26258,7 @@ Apologies for any names omitted.
20220128
Clenaup: standardize on FNV hash, after having verified
Cleanup: standardize on FNV hash, after having verified
that collisions will change with the hash seed value, and
that the collision rate is low. Files: util/htable.c,
util/hash_fnv.[hc].
@ -26281,11 +26281,41 @@ Apologies for any names omitted.
Bitrot: Berkeley DB 18 is like Berkeley DB 6. Yasuhiro
Kimura. File: util/dict_db.c.
20220204
Updated collate.pl script for better tracking when a
Milter rejects, discards, or quarantines a message. Viktor
Dukhovni. File: auxiliary/collate/collate.pl.
20220212
Cleanup: removed WISHLIST items that were recently fixed.
20220217
Typo (introduced: Postfix.3.7): "pcre2 --libs" should be
"pcre2 --libs8". Reported by Carlos Velasco. File
proto/PCRE_README.html.
Typo: "pcre2 --libs" should be "pcre2 --libs8". Reported by
Carlos Velasco. File proto/PCRE_README.html.
Future proofing: added comments on the purpose of address
sanitization. File: showq/showq.c.
20220220
Added a hash_fnvz() function to eliminate unnecessary strlen()
calls, and added regression tests. File: util/hash_fnv.c,
util/htable.c.
Cleanup: unused initialization. File: util/make_dirs.c
20220222
Documentation: updated comment text. File: util/hash_fnv.c.
20220312
Cleanup: when a main.cf like file may have changed while
it was read, forget the settings before re-reading the file.
File: util/dict.c.
20220322
@ -26294,12 +26324,26 @@ Apologies for any names omitted.
to the proxy_read_maps default value. Files: global/mail_params.h,
mantools/missing-proxy-read-maps.
20220325
Documentation: how to stop recursion in virtual_alias_maps.
File: proto/virtual.
20220330
Documentation: updated the postlogd(8) daemon manpage,
adding that the Postfix >= 3.7 postlog(1) command can run
with setgid permissions. File: postlogd/postlogd.c.
20220403
(Rolled back because there was too much collateral damage)
Cleanup: milter_header_checks maps are now opened before the
cleanup server enters the chroot jail. Files: cleanup/cleanup.h,
cleanup/cleanup_init.c, cleanup/cleanup_milter.c,
global/header_body_checks.c, global/header_body_checks.h,
global/maps.c, global/maps.h, smtp/smtp.c.
20220404
Bugfix: in an internal client module, "host or service not
@ -26309,6 +26353,30 @@ Apologies for any names omitted.
dovecot auth, tcp_table, memcache, socketmap, and so on).
Problem reported by Christian Degenkolb. File: util/inet_connect.c.
20220407
Documentation: updated the firewall/gateway example to use
the "relay" transport to forward inbound messages. File:
proto/STANDARD_CONFIGURATION_README.html
Documentation: updated smtp_fallback_relay description.
The text was based on an early Postfix implementation.
File: proto/postconf.proto.
Cleanup (problem introduced: Postfix 2.7): milter_header_checks
maps are now opened before the cleanup server enters the
chroot jail. Problem reported by Jesper Dybdal. Files:
cleanup/cleanup.h, cleanup/cleanup_init.c,
cleanup/cleanup_milter.c, cleanup/cleanup_state.c.
20220407
Feature: the policy delegation protocol now sends a
"compatibility_level" attribute with the value of the
compatibility_level configuration parameter. Files:
global/mail_proto.h, smtpd/smtpd_check.c,
proto/SMTPD_POLICY_README.html.
20220415
Cleanup (problem introduced: Postfix 3.0): with dynamic map
@ -26322,11 +26390,11 @@ Apologies for any names omitted.
20220417
Cleanup (problem introduced: Postfix 2.7): milter_header_checks
maps are now opened before the cleanup server enters the
chroot jail. Problem reported by Jesper Dybdal. Files:
cleanup/cleanup.h, cleanup/cleanup_init.c,
cleanup/cleanup_milter.c, cleanup/cleanup_state.c.
Bugfix (introduced: 20220406): reset the milter_header_checks
response buffer, so that a negative response for one email
message will not be applied to a later email message that is
handled by the same cleanup process. File:
cleanup/cleanup_milter.c.
20220421
@ -26343,10 +26411,12 @@ Apologies for any names omitted.
The conditions were that SMTPUTF8 support was enabled (the
default), and that postscreen received non-UTF8 input, for
example, a TLS or RDP handshake request. Depending on
compiler details, the result of the read operation could
be uninteresting, a combined memory leak and file handle
leak, or a segmentation violation (signal 11).
example, a TLS or RDP handshake request.
Depending on compiler details, the result of the read
operation could be uninteresting, a combined memory leak
and file handle leak, or a segmentation violation (signal
11).
The segmentation violation result was reported by Michael
Grimm who used a FreeBSD 13.1 early version. The result was
@ -26355,10 +26425,136 @@ Apologies for any names omitted.
on Linux-based systems that use GCC, or on a few older
systems that use GCC.
20220427
Cleanup: incorrect error message after postscreen received
a STARTTLS command with too many arguments. File:
postscreen/postscreen_smtpd.c.
20220429
Noise: shut up a useless warning. File: cleanup_map1n.c.
Documentation: IPv6 support, by Pau Amma. Files: proto/INSTALL,
proto/IPV6_README.html.
20220501
Cleanup: merged the infrastructure that "knows" which tables
are created with "postmap" or "postalias", with infrastructure
that has other information about lookup tables. The old design
pre-dated dynamically-loaded table drivers, and was difficult
to maintain.
The following files were moved from the "global" directory to
the "util" directory: src/util/mkmap.h, src/util/mkmap_cdb.c,
src/util/mkmap_db.c, src/util/mkmap_dbm.c, src/util/mkmap_fail.c,
src/util/mkmap_lmdb.c, src/util/mkmap_open.c,
src/util/mkmap_sdbm.c.
The corresponding postfix-xxx.so shared objects are now created
by util/Makefile instead of global/Makefile. There is no change
in how these files are installed or deployed.
Other files affected by this change: src/util/dict_open.c,
src/global/dynamicmaps.c, src/global/mail_version.h,
src/global/header_body_checks.h, src/global/maps.c,
src/global/dict_proxy.h, src/util/dict.c, src/util/dict_dbm.h,
src/util/dict_fail.h, src/util/dict_db.h, src/util/dict_lmdb.h,
src/util/dict_cdb.h, src/util/dict_sdbm.h, src/util/dict.h,
src/global/mail_dict.c, src/postalias/postalias.c,
src/postmap/postmap.c.
Portability: variable declaration after code. File:
global/compat_level.c.
20220504
Documentation: dymap_init() description. File:
global/dynamicmaps.c.
20220506
Added an argv_uniq() function to deduplicate same-value
adjacent array elements. Added a ton of tests to validate
the argv implementation. File: util/argv.c.
Cleanup: the dict_mapnames() function (used in "postconf
-m") now deduplicates dictionary type names. File:
util/dict_open.c.
20220507
Documentation: inverted the paragraph about "known" addresses,
in the descriptions of smtpd_reject_unlisted_sender and
smtpd_reject_unlisted_recipient. File: proto/postconf.proto.
Documentation: added the HISTORY file to the pre-release-checks.
Files: mantools/check-double-history, mantools/check-spell-history,
proto/stop.double-history, proto/stop.spell-history.
Documentation: added POSTLOG_SERVICE and POSTLOG_HOSTNAME
to the import_environment description. File: proto/postconf.proto.
20220509
Cleanup: the pgsql: client encoding is now configurable
with the "encoding" configuration file attribute. The default
is "UTF8". Previously the encoding was hard-coded as "LATIN1".
Files: global/dict_pgsql,c, proto/pgsql_table.
20220512
Documentation: in the text for smtpd_reject_unlisted_sender
and smtpd_reject_unlisted_recipient, refer to the address
class validation in ADDRESS_CLASS_README, instead of repeating
that information in postconf(5). File: proto/postconf.proto.
20220515
Documentation: the text for reject_xxx_sender_login_mismatch
was not optimal for clarity. As new features were added
over time, they were documented in terms of the existing
features. File: proto/postconf.proto.
Documentation: minor tweaks in ADDRESS_CLASS_README. File:
proto/ADDRESS_CLASS_README.html.
20220523
Documentation: add the Postfix >= 3.7 postlog(1) command
to the list of programs that can have set-gid permissions.
File: proto/MAILLOG_README.html.
20220527
Internal documentation: update the timeline annotations of
Milter protocol features. File: milter/milter8.c.
Documentation: edit text for clarity. File:
proto/MILTER_README.html.
20220529
Documentation: Cyrus SASL configuration file location.
Viktor Dukhovni. File: proto/SASL_README.html.
20220617
Cleanup: missing <stdio.h> include was causing a warning
on some platform. posttls-finger/posttls-finger.c.
20220620
Documentation: inet_interfaces and proxy_interfaces
descriptions. File: proto/postconf.proto.
20220719
Cleanup: Postfix 3.5.0 introduced debug logging noise in
map_search_create(). Files: global/map_search.c.
map_search_create(). Files: global/map_search.c,
global/map_search.ref.
20220724
@ -26368,25 +26564,58 @@ Apologies for any names omitted.
Report by Spil Oss, fix by Viktor Dukhovni. File:
tls/tls_server.c.
20220802
Documentation: in the aliases(5) manpage, more specific
pointers to the local(8) manpage sections for delivery to
file, command execution, and delivery rights. File:
proto/aliases.
20220805
Feature: "mail_version" attribute in the SMTPD policy
protocol, with the value of the "mail_version" configuration
parameter. This differs from the "compatibility_level"
attribute, because "mail_version" indicates the presence
of new features, while "compatibility_level" concerns changes
in default settings. Files: global/mail_proto.h,
proto/SMTPD_POLICY_README.html, smtpd/smtpd_check.c.
20220808
Documentation: some Debian releases hard-code the search
path for Cyrus SASL application configuration files,
overriding the cyrus_sasl_config_path setting. Viktor
Dukhovni. File: proto/SASL_README.html.
20220815
Updated the postscreen_dnsbl_sites documentation, based
on questions on the postfix-users mailing list. File:
proto/postconf.proto.
20220905
Cleanup: Postfix 3.3.0 introduced an uninitialized
verify_append() request status in case of a null original
recipient address. File: global/verify.c.
Cleanup: uninitialized verify_append() request status in case
of a null original recipient address. File: global/verify.c.
20220906
20220907
Cleanup: Postfix 3.7.1 introduced a missing msg_panic()
argument (in code that never executes). File:
cleanup/cleanup_milter.c.
Support for Linux 6.x. Eray Aslan. Files: makedefs,
util/sys_defs.h.
20220930
Documented the use of the JSON LINES format in the postqueue(1)
manpage. File: postqueue/postqueue.c.
20221006
Bugfix (introduced: Postfix 3.7.0). A message could falsely
be flagged as corrupt with "warning: Unexpected record type
'X'". Such messages were moved to the "corrupt" queue directory,
where they may still be found. See below for instructions to
deal with these falsely flagged messages.
'X'. Such messages were moved to the "corrupt" queue
directory, where they may still be found. See below for
instructions to deal with these falsely flagged messages.
This could happen for messages with 5000 or more recipients,
or with fewer recipients on a busy mail server. Problem
@ -26398,3 +26627,602 @@ Apologies for any names omitted.
If delivery of the file is still desired, the file can be
moved back to /var/spool/postfix/incoming after updating
Postfix and executing "postfix reload".
20221007
Ran "make manpages", updated the change log and release
notes for consistency with new stable releases, update
pre-release-checks stop filters. Files: RELEASE_NOTES,
HISTORY, stop.spell-history, stop.double-history,
stop.spell-proto-html, postqueue.1, postqueue.1.html.
20221008
Cleanup: in the default master.cf file, unconditionally
enable header rewriting and missing header insertion, for
the submission and smtps services. Dan Mahoney. File
conf/master.cf.
20221017
Robustness: unconditionally disable a CPU resource attack
requesting TLS renegotiation. There's no good reason to
support this in the middle of an SMTP connection. Viktor
Dukhovni. File: tls/tls_misc.c.
20221023
Documentation: describe limitations of smtpd(8) features
that cannot work with smtpd_proxy_filter. File:
proto/SMTPD_PROXY_README.html.
Documentation: the local_header_rewrite_clients and
remote_header_rewrite_domain features also enable adding
missing headers. File: proto/postconf.proto.
20221125
Bugfix (introduced: Postfix 3.6): the Postfix TLS client
logged a TLS connection as 'Untrusted' instead of 'Trusted',
when a matching DANE record was found but the MX RRset was
insecure. Fix by Viktor Dukhovni. File: tls/tls_client.c.
20221128
Bugfix (introduced: Postfix 2.2): the smtpd_proxy_client
code mis-parsed the last XFORWARD attribute name in the
SMTP server's EHLO response. The result was that the
smtpd_proxy_client code failed to forward the IDENT attribute.
Fix by Andreas Weigel. File: smtpd/smtpd_proxy.c.
Typo in MAILLOG_README. Paul Menzel.
20221207
Workaround: OpenSSL 3.x EVP_get_digestbyname() can return
lazily bound handles that may fail to work when one attempts
to use them, because no provider search happens until one
constructs an actual operation context. In sufficiently
hostile configurations, Postfix could mistakenly believe
that an algorithm is available, when in fact it is not. A
similar workaround may be needed for EVP_get_cipherbyname().
Fix by Viktor Dukhovni. Files: tls/tls.h, tls/tls_dane.c,
tls/tls_fprint.c, tls/tls_misc.c.
Bugfix (introduced: Postfix 2.11): the checkok() macro in
tls/tls_fprint.c evaluated its argument unconditionally;
it should evaluate the argument only if there was no prior
error. Found during code review. File: tls/tls_fprint.c.
20221215
Foolproofing: postscreen segfault with postscreen_dnsbl_threshold
< 1. It should reject such input with a fatal error instead.
Discovered by Benny Pedersen. File: postscreen/postscreen.c.
Documentation: replaced instances of '.domain' in some
examples; clarified that bcc maps are indexed by envelope
address; lmtp_line_length_limit default wasn't updated to
998. File: proto/postconf.proto.
20221227
Documentation: the mysql_table(5) manpage did not document
the tls_ciphers feature that was added in Postfix 2.11.
File: proto/mysql_table.
Cleanup: added a pre-release check that the parameter lists
in the proto/*_table documentation match the global/dict*.c
implementations. Files: Makefile.in, mantools/check-table-proto
Documentation: consistent xxxx_table formatting to make
parameter documentation easier to match against the
corresponding implementation. Files: proto/mysql_table,
proto/pgsql_table, proto/ldap_table.
Typofixes for changes made 20221207. File: tls/tls_fprint.c.
20221228
Long ago, a committee decided that "grep -E" and "grep -F"
are better than "egrep" and "fgrep". This could not be an
optimization for ease of use: the new command syntax requires
mixed case for common usage, and the new command is longer.
To make things better, some implementation now warns when
the "obsolete" syntax is used. To address this, all Postfix
code and documentation has been converted; a script
auxiliary/fix-grep/fix-grep.sh can revert the syntax if you
want to build Postfix on an older platform. Files: too many
to mention here.
20230101
Documentation: add text that cidr:, pcre: and regexp: tables
support inline specification only in Postfix 3.7 and later.
Files: proto/cidr_table, proto/pcre_table, proto/regexp_table.
20230102
Cleanup: in internal documentation, text about DHE was under
the corresponding ECDHE function. Viktor Dukhovni. File:
tls/tls_dh.c.
20230103
Bugfix (introduced: Postfix 2.7): the verify daemon logged
a garbled cache name when terminating a cache scan in
progress. Reported by Phil Biggs, fix by Viktor Dukhovni.
File: util/dict_cache.c.
20230104
Feature: configuration parameter tls_ffdhe_auto_groups for
FFDHE support in TLS 1.3 with OpenSSL 3.0. Viktor Dukhovni.
Files: mantools/postlink, proto/FORWARD_SECRECY_README.html,
proto/postconf.proto, src/tlsproxy/tlsproxy.c, src/smtpd/smtpd.c,
src/tls/tls.h, src/tls/tls_proxy_client_misc.c, src/tls/tls_misc.c,
src/tls/tls_dh.c, src/tls/tls_proxy_client_scan.c,
src/tls/tls_server.c, src/tls/tls_client.c,
src/tls/tls_proxy_client_print.c, src/tls/tls_proxy.h,
src/global/mail_params.h, src/smtp/smtp.c.
Documentation: remove text for behavior that is no longer
implemented in Postfix or in other relevant systems. Viktor
Dukhovni. File: proto/FORWARD_SECRECY_README.html.
Bitrot: fixes for linker warnings from newer Darwin (MacOS)
versions. Viktor Dukhovni. File: makedefs.
20230108
Minor wordsmithing. Files: text in proto/postconf.proto,
warning message tls.tls_dh.c.
20230115
Workaround for a breaking change in OpenSSL 3: always turn
on SSL_OP_IGNORE_UNEXPECTED_EOF, to avoid warning messages
and missed opportunities for TLS session reuse. This is
safe because the SMTP protocol implements application-level
framing, and is therefore not affected by TLS truncation
attacks. Fix by Viktor Dukhovni. Files: tls/tls.h, tls_client.c,
tls/tls_server.c.
20230121
Documentation: describe when Postfix and Milters inspect
SMTP commands or header/body content. File:
proto/MILTER_README.html.
20230127
Bugfix (introduced: Postfix 3.4): the posttls-finger command
failed to detect that a connection was resumed in the case
that a server did not return a certificate. Viktor Dukhovni.
File: posttls-finger/posttls-finger.c.
Workaround: OpenSSL 3.x EVP_get_cipherbyname() can return
lazily-bound handles. Postfix now checks that the expected
functionality will be available instead of failing later.
Fix by Viktor Dukhovni. File: tls/tls_server.c.
Portability: MacOS support for the postfix-env.sh test
script.
20230129
Documentation: in the postconf(5) manpage, the text for
append_dot_mydomain described old default behavior. File:
proto/postconf.proto.
Documentation: in the smtpd(8) manpage, the text for the
info_log_address_format parameter was in the wrong place.
File: smtpd/smtpd.c.
20230202
Documentation: fixed a broken HTML tag in SASL_README.html.
20230209
Cleanup: noise suppression for resolver-related macros.
Viktor Dukhovni. Files: dns/dns_str_resflags.c, util/sys_defs.h.
20230212
Cleanup: valgrind complained about uninitialized padding.
File: util/unix_send_fd.c
20230213
Feature: SRV lookup support in the Postfix SMTP/LMTP client.
See https://www.postfix.org/postconf.5.html#use_srv_lookup.
Based on code by Tomas Korbar (Red Hat). Files: proto/stop,
proto/stop.spell-proto-html, dns/dns.h, dns/dns_lookup.c,
dns/dns_rr.c, dns/dns_sa_to_rr.c, dns/dns_strrecord.c,
dns/dns_strtype.c, global/mail_params.h, smtp/lmtp_params.c,
smtp/smtp_addr.c, smtp/smtp_addr.h, smtp/smtp.c,
smtp/smtp_connect.c, smtp/smtp.h, smtp/smtp_params.c,
smtp/smtp_session.c, smtpd/smtpd_check.c, util/attr.h,
util/unix_send_fd.c, mantools/postlink, proto/postconf.proto.
20230214
SRV lookup: propagate preference and port information when
converting a numerical hostname to IP address. File:
smtp/smtp_addr.c.
SRV lookup: add SRV support to the posttls-finger command.
File: posttls-finger/posttls-finger.c.
SRV lookup: updated documentation examples. File:
proto/postconf.proto.
20230219
Code health: replaced a proliferation of 'bare' zero arguments
with named constants: DNS_RR_NOPREF, DNS_RR_NOWEIGHT,
DNS_RR_NOPORT, and added convenience wrappers for
dns_rr_create(), to simplify code that needs to specify
only a subset of all arguments. Files: src/dns/dns.h,
src/dns/dns_rr_eq_sa.c, src/dns/dns_sa_to_rr.c,
src/smtpd/smtpd_check.c.
Code health: updated internal documentation. Files:
dns/dns_rr.c, smtp/smtp_connect.c.
Compatibility: downgraded some modernisms to avoid breaking
builds on older test systems. File: dns/dns_rr.c.
Code health: simplified the SRV record priority grouping
and record ordering code. Eliminated some special-case
handling of zero-weight records (that was already started
in the initial implementation). File: dns/dns_rr.c.
20230224
Documentation fix (error introduced: Postfix 2.7): In a
"make makefiles" example in SASL_README, a backslash-newline
inside single quotes produced a broken Makefile. Problem
reported by James Brown (Bordo International). Updated "make
makefiles" examples, replacing single quotes with double
quotes, and inside those quotes replacing \" with \\\" to
protect a string-valued macro definition. Files:
proto/INSTALL.html, proto/MYSQL_README.html,
proto/PGSQL_README.html, proto/postconf.proto,
proto/SASL_README.html, proto/SQLITE_README.html.
20230303
Cleanup: Postfix TLS configuration. Treat "export" and "low"
cipher grades as "medium", and ignore "export" and "low"
cipherlist settings. These grades are no longer supported
in OpenSSL 1.1.1, the minimum version that Postfix requires.
Also, update Postfix default settings to exclude the following
deprecated or unused ciphers (SEED, IDEA, 3DES, RC2, RC4,
RC5), digest (MD5), key exchange algorithms (DH, ECDH), and
public key algorithm (DSS). Viktor Dukhovni. Files:
proto/postconf.proto, global/mail_params.h, smtp/smtp.c,
smtpd/smtpd.c, tls/tls_misc.c, tls/tls_proxy_client_misc.c,
tls/tls_proxy_client_print.c, tls/tls_proxy_client_scan.c,
tls/tls_proxy.h, tlsproxy/tlsproxy.c.
20230308
Documentation: basic style sheet. Files: conf/postfix-files,
html/postfix-doc.css, mantools/make_soho_readme,
mantools/makemanidx, mantools/man2html, proto/[A-Z]*.html,
proto/postconf.html.prolog.
Cleanup: the postfix(1) and postlog(1) commands now produce
stderr output even when stderr is not connected to a terminal.
This eliminates an inconsistency, and makes these programs
easier to use in some automated procedures. The canonical
example is to capture output from "postmulti -p status" to
figure out which instances are or are not running. Files:
postfix/postfix.c, postlog/postlog.c.
20230209
Cleanup: in smtp_service_addr() refined the loop detection
code for SRV lookup. File: smtp/smtp_addr.c.
Cleanup: renamed macros with invisible side effects and
implicit inputs to upper case. Verified that the compiled
code did not change. File: tls_fprint.c.
20230310
Cleanup: the milter header/body checks logged less text (up
to 60 bytes) than the 'original' header/body checks (up to
200 bytes). Problem reported by Aleksandr Stankevic. Fixed
the same inconsistency in the Postfix SMTP client. Files:
cleanup/cleanup_milter.c, smtp/smtp_proto.c.
20230311
Hardening: the Postfix SMTP server can now aggregate
smtpd_client_*_rate and smtpd_client_*_count statistics by
network block, as specified with smtpd_client_ipv4_prefix_length
(default 32, no aggregation) and smtpd_client_ipv6_prefix_length
(default 72, aggregation by /72 network blocks). The latter
raises the bar for a memory exhaustion attack. Files:
util/inet_prefix_top.[hc], smtpd/smtpd.c, smtpd/smtpd_peer.c,
mantools/postlink, proto/postconf.proto.
20230313
Factored out a function that may be generally useful, and
made a vstring_alloc() argument more precise to avoid memory
reallocation. Files: util/inet_prefix_top.c,
util/inet_addr_sizes.[hc].
20230314
Bugfix (introduced: Postfix 3.5): check_ccert_access did
not parse inline map specifications. Report and fix by
Sean Gallagher. File: global/map_search.c.
Cleanup: don't do smtpd_client_*_rate and smtpd_client_*_count
address range computations when "/usr/sbin/sendmail -bs"
is not talking to a network client. File: smtpd/smtpd_peer.c.
Cleanup: renamed net_mask_top.* to inet_prefix_top.*.
Cleanup: updated unit tests. Files: smtpd/smtpd_check.c,
smtpd/smtpd_server.in, smtpd/smtpd_server.ref.
Increased the smtpd_client_ipv6_prefix_length to 84 bits,
which should prevent anvil exhaustion attacks from a typical
/64 consumer network, without penalizing legitimate usage.
20230319
Shut up a compiler waning triggered by an extreme setting.
File: smtp/smtp.h.
20230328
Cleanup: replaced ``argv_split_append(x, y, "")'' with
``argv_add(x, y, , ARGV_END)'', in two places. File:
posttls-finger/posttls-finger.c.
20230330
Safety: the long form { name = value } in import_environment
or export_environment is not documented, but it is accepted,
and it was stored in the process environment as the invalid
form "name = value, thus not setting or overriding an entry
for "name". This form is now stored as the expected
"name=value". Found during code maintenance. Also refined
the "missing attribute name" detection. Files: clean_env.c,
split_nameval.c.
20230402
Cleanup: changed the DNS_RR data structure so that it remains
ABI-compatible when new fields are added at the end. This
avoids crashing programs that are started while Postfix is
being updated. However, *this* specific change cannot be
ABI-compatible. Files: dns/dns_rr.c.
Cleanup: added missing Valgrind test support. Files:
dns/Makefile.in, util/Makefile.in.
Documentation: fixed a `whitelist' instance in the postscreen(8)
manpage. File: postscreen/postscreen.c.
Cleanup: support for multiline entities in match lists, for
example, inline maps. Added Valgrind support to the namadr_list
unit test. Files: util/match_list.c, global/namadr_list.in,
util/Makefile.in.
20240406
Bugfix (introduced: 20230402): after a change in the DNS_RR
structure, the dns_rr_copy() function had not been updated,
causing the Postfix SMTP client to panic as it detected a
double-free() attempt. Reported by Florian Piekert. File:
dns/dns_rr.c.
Usability: The postconf command now warns for trailing
comments in Postfix parameter values. Also refactored comment
warnings in match lists. Files: util/mystrtok.c,
util/mystrtok.ref, util/match_list.c, global/namadr_list.ref,
postconf/postconf_dbms.c, postconf/test71.ref.
Cleanup: some postconf warnings did not include the full
main.cf or master.cf pathname, complicating the analysis
of multi-instance configurations. Also refactored ad-hoc
code that computed full main.cf or master.cf pathnames.
Files: postconf/postconf.h, postconf/postconf_dbms.c,
postconf/postconf_edit.c, postconf/postconf_main.c,
postconf/postconf_master.c, postconf/postconf_misc.c.
Cleanup: eliminated unused libdns dependencies. Files:
postlogd/Makefile.in.
Cleanup: added inet_prefix_top() tests. File:
util/inet_prefix_top.c.
20230413
Cleanup: in postconf source, removed redundant pcf_set_config_dir()
calls as these are made automatically when a config file
pathname cache is queried. Files: postconf/postconf_edit.c,
postconf/postconf_main.c, postconf/postconf_master.c.
Cleanup: in source-code comments, replaced redundant (and
sometimes incomplete) lookup table configuration info with
a reference to the corresponding *_table(5) manpage.
20230418
Bugfix defect (introduced: Postfix 3.2): the MySQL client
could return "not found" instead of "error" (for example,
resulting in a 5XX SMTP status instead of 4XX) during the
time that all MySQL server connections were turned down
after error. Found during code maintenance. File:
global/dict_mysql.c.
20230428
Bugfix (defect introduced: Postfix 1.0): the command "postconf
.. name=v1 .. name=v2 .." (multiple instances of the same
parameter name) created multiple name=value entries with
the same parameter name. It now logs a warning and skips
the earlier update. Found during code maintenance. File:
postconf/postconf_edit.c
Bugfix (defect introduced: Postfix 3.3): the command "postconf
-M name1/type1='name2 type2 ...'" died with a segmentation
violation when the request matched multiple master.cf
entries. The master.cf file was not damaged. Problem reported
by SATOH Fumiyasu. File: postconf/postconf_master.c.
20230502
Bugfix (defect introduced: Postfix 2.11): the command
"postconf -M name1/type1='name2 type2 ...'" could add a
service definition to master.cf that conflicted with an
already existing service definition. It now replaces all
existing service definitions that match the service pattern
'name1/type1' or the service name and type in 'name2 type2
...' with a single service definition 'name2 type2 ...'.
Problem reported by SATOH Fumiyasu. File: postconf/postconf_edit.c.
20230517
Bugfix (defect introduced: Postfix 3.8) the posttls-finger
command could access uninitialized memory when reconnecting.
This also fixes a warning message when a destination contains
":service" information. Reported by Thomas Korbar. File:
posttls-finger/posttls-finger.c.
20230519
Bitrot: preliminary support for OpenSSL configuration files,
primarily OpenSSL 1.1.1b and later. This introduces new
parameters "tls_config_file" and "tls_config_name", which
can be used to limit collateral damage from OS distributions
that crank up security to 11, increasing the number of
plaintext email deliveries. Details are in the postconf(5)
manpage under "tls_config_file" and "tls_config_name".
Viktor Dukhovni. Files: mantools/postlink, proto/postconf.proto,
global/mail_params.h, posttls-finger/posttls-finger.c,
smtp/smtp.c, smtp/smtp_proto.c, tls/tls_client.c, tls/tls.h,
tls/tls_misc.c, tls/tls_proxy_client_print.c,
tls/tls_proxy_client_scan.c, tls/tls_proxy.h, tls/tls_server.c,
tlsproxy/tlsproxy.c.
20230523
Cleanup: use TLS_CLIENT_PARAMS to pass the OpensSSL 'init'
configurations. This information is independent from the
client or server TLS context, and therefore does not belong
in tls_*_init() or tls_*_start() calls. The tlsproxy(8)
server uses TLS_CLIENT_PARAMS to report differences between
its own global TLS settings, and those from its clients.
Files: posttls-finger/posttls-finger.c, smtp/smtp.c,
smtp/smtp_proto.c, tls/tls.h, tls/tls_proxy_client_misc.c,
tls/tls_proxy_client_print.c, tls/tls_proxy_client_scan.c,
tls/tls_proxy.h, tlsproxy/tlsproxy.c.
20230524
Cleanup: reverted cosmetic-only changes to minimize the
patch footprint for OpenSSL INI file support; updated daemon
manpages with the new tls_config_file and tls_config_name
configuration parameters. Files: smtp/smtp.c, smtpd/smtpd.c,
tls/tls_client.c, tls/tls.h, tls/tls_server.c, tlsproxy/tlsproxy.c,
20230529
Cleanup: made OpenSSL 'default' INI file support error
handling consistent with OpenSSL default behavior. Viktor
Dukhovni. Files: proto/postconf.proto, tls/tls_misc.c.
20230602
Backwards compatibility for stable releases that originally
had no OpenSSL INI support. Skip the new OpenSSL INI support
code, unless the Postfix configuration actually specifies
non-default tls_config_xxx settings. File: tls/tls_misc.c.
Cleanup: added a multiple initialization guard in the
tls_library_init() function, and made an initialization
error sticky. File: tls/tls_misc.c.
20230605
Security: new parameter smtpd_forbid_unauth_pipelining
(default: no) to disconnect remote SMTP clients that violate
RFC 2920 (or 5321) command pipelining constraints. Files:
global/mail_params.h, smtpd/smtpd.c, proto/postconf.proto.
20230815
Bugfix (bug introduced: 20140218): when opportunistic TLS fails
during or after the handshake, don't require that a probe
message spent a minimum time-in-queue before falling back to
plaintext. Problem reported by Serg. File: smtp/smtp.h.
20230819
Bugfix (defect introduced: 19980207): the valid_hostname()
check in the Postfix DNS client library was blocking unusual
but legitimate wildcard names (*.name) in some DNS lookup
results and lookup requests. Examples:
name class/type value
*.one.example IN CNAME *.other.example
*.other.example IN A 10.0.0.1
*.other.example IN TLSA ..certificate info...
Such syntax is blesed in RFC 1034 section 4.3.3.
This problem was reported first in the context of TLSA
record lookups. Files: util/valid_hostname.[hc],
dns/dns_lookup.c.
20230929
Bugfix (defect introduced Postfix 2.5, 20080104): the Postfix
SMTP server was waiting for a client command instead of
replying immediately, after a client certificate verification
error in TLS wrappermode. Reported by Andreas Kinzler. File:
smtpd/smtpd.c.
20231006
Usability: the Postfix SMTP server now attempts to log the
SASL username after authentication failure. In Postfix
logging, this appends ", sasl_username=xxx" after the reason
for SASL authentication failure. The logging replaces an
unavailable reason with "(reason unavailable)", and replaces
an unavailable sasl_username with "(unavailable)". Based
on code by Jozsef Kadlecsik. Files: xsasl/xsasl_server.c,
xsasl/xsasl_cyrus_server.c, smtpd/smtpd_sasl_glue.c.
20231026
Bugfix (defect introduced: Postfix 2.11): in forward_path,
the expression ${recipient_delimiter} would expand to an
empty string when a recipient address had no recipient
delimiter. Fixed by restoring Postfix 2.10 behavior to use
a configured recipient delimiter value. Reported by Tod
A. Sandman. Files: proto/postconf.proto, local/local_expand.c.
20231221
Security: with "smtpd_forbid_bare_newline = yes" (default
"no" for Postfix < 3.9), reply with "Error: bare <LF>
received" and disconnect when an SMTP client sends a line
ending in <LF>, violating the RFC 5321 requirement that
lines must end in <CR><LF>. This prevents SMTP smuggling
attacks that target a recipient at a Postfix server. For
backwards compatibility, local clients are excluded by
default with "smtpd_forbid_bare_newline_exclusions =
$mynetworks". Files: mantools/postlink, proto/postconf.proto,
global/mail_params.h, global/smtp_stream.c, global/smtp_stream.h,
smtpd/smtpd.c.

View File

@ -466,7 +466,7 @@ configuration file, except for one: the parameter that specifies the location
of Postfix configuration files. In order to build Postfix with a configuration
directory other than /etc/postfix, use:
$ make makefiles CCARGS='-DDEF_CONFIG_DIR=\"/some/where\"'
$ make makefiles CCARGS="-DDEF_CONFIG_DIR=\\\"/some/where\\\""
$ make
IMPORTANT: Be sure to get the quotes right. These details matter a lot.
@ -567,7 +567,7 @@ The following is an extensive list of names and values.
|| |Do not build with IPv6 support. By default, |
|| |IPv6 support is compiled in on platforms that|
|| |are known to have IPv6 support. Note: this |
||-DNO_IPV6 |directive is for debugging And testing only. |
||-DNO_IPV6 |directive is for debugging and testing only. |
|| |It is not guaranteed to work on all |
|| |platforms. If you don't want IPv6 support, |
|| |set "inet_protocols = ipv4" in main.cf. |
@ -829,7 +829,7 @@ and watch your maillog file for any error messages. The pathname is /var/log/
maillog, /var/log/mail, /var/log/syslog, or something else. Typically, the
pathname is defined in the /etc/syslog.conf file.
$ egrep '(reject|warning|error|fatal|panic):' /some/log/file
$ grep -E '(reject|warning|error|fatal|panic):' /some/log/file
Note: the most important error message is logged first. Later messages are not
as useful.
@ -879,7 +879,7 @@ and watch your maillog file for any error messages. The pathname is /var/log/
maillog, /var/log/mail, /var/log/syslog, or something else. Typically, the
pathname is defined in the /etc/syslog.conf file.
$ egrep '(reject|warning|error|fatal|panic):' /some/log/file
$ grep -E '(reject|warning|error|fatal|panic):' /some/log/file
Note: the most important error message is logged first. Later messages are not
as useful.
@ -919,7 +919,7 @@ and watch your maillog file for any error messages. The pathname is /var/log/
maillog, /var/log/mail, /var/log/syslog, or something else. Typically, the
pathname is defined in the /etc/syslog.conf file.
$ egrep '(reject|warning|error|fatal|panic):' /some/log/file
$ grep -E '(reject|warning|error|fatal|panic):' /some/log/file
Note: the most important error message is logged first. Later messages are not
as useful.
@ -1151,7 +1151,7 @@ Hopefully, the number of problems will be small, but it is a good idea to run
every night before the syslog files are rotated:
# postfix check
# egrep '(reject|warning|error|fatal|panic):' /some/log/file
# grep -E '(reject|warning|error|fatal|panic):' /some/log/file
* The first line (postfix check) causes Postfix to report file permission/
ownership discrepancies.

View File

@ -116,7 +116,8 @@ manpages:
# Some checks require a bin/postconf executable.
pre-release-checks: typo-check missing-proxy-read-maps-check \
postlink-check postfix-files-check
postlink-check postfix-files-check check-spell-history \
check-double-history check-table-proto
postfix-files-check:
mantools/check-postfix-files | diff /dev/null -
@ -148,6 +149,15 @@ double-install-proto-text:
double-proto-html:
mantools/check-double-proto-html | diff /dev/null -
check-spell-history:
mantools/check-spell-history | diff /dev/null -
check-double-history:
mantools/check-double-history | diff /dev/null -
check-table-proto:
mantools/check-table-proto | diff /dev/null -
# The build-time shlib_directory setting must take precedence over
# the installed main.cf settings, otherwise we can't update an
# installed system from dynamicmaps=yes<->dynamicmaps=no or from

View File

@ -25,13 +25,13 @@ important for the operation of Postfix.
An address class is defined by three items.
* The list of domains that are a member of the class: for example, all local
domains, or all relay domains.
* The list of domains that are a member of that address class: for example,
all local domains, or all relay domains.
* The default delivery transport. For example, the local, virtual or relay
delivery transport (delivery transports are defined in master.cf). This
helps to keep Postfix configurations simple, by avoiding the need for
explicit routing information in transport maps.
* The default delivery transport for that address class. For example, the
local, virtual or relay delivery transport (delivery transports are defined
in master.cf). This helps to keep Postfix configurations simple, by
avoiding the need for explicit routing information in transport maps.
* The list of valid recipient addresses for that address class. The Postfix
SMTP server rejects invalid recipients with "User unknown in <name of
@ -48,9 +48,9 @@ The local domain class.
* Purpose: final delivery for traditional UNIX system accounts and
traditional Sendmail-style aliases. This is typically used for the
canonical domains of the machine. For a discussion of the difference
between canonical domains, hosted domains and other domains, see the
VIRTUAL_README file.
canonical domains of the machine (for example, $myhostname, $mydomain). For
a discussion of the difference between canonical domains, hosted domains
and other domains, see the VIRTUAL_README file.
* Domain names are listed with the mydestination parameter. This domain class
also includes mail for user@[ipaddress] when the IP address is listed with
@ -68,9 +68,10 @@ The local domain class.
The virtual alias domain class.
* Purpose: hosted domains where each recipient address is aliased to a local
UNIX system account or to a remote address. A virtual alias example is
given in the VIRTUAL_README file.
* Purpose: hosted domains where each recipient address is aliased to an
address in a different domain, for example, a local UNIX system account or
a remote address. A virtual alias example is given in the VIRTUAL_README
file.
* Domain names are listed in virtual_alias_domains. The default value is
$virtual_alias_maps for Postfix 1.1 compatibility.
@ -81,7 +82,7 @@ The virtual alias domain class.
compatibility.
* There is no mail delivery transport parameter. Every address must be
aliased to some other address.
aliased to an address in some other domain.
The virtual mailbox domain class.
@ -158,8 +159,8 @@ earlier Postfix versions:
mail (and bounced undeliverable mail) out of the mail queue. This is
controlled by the smtpd_reject_unlisted_recipient configuration parameter.
* As of Postfix version 2.1, the SMTP server also rejects unknown sender
addresses (i.e. addresses that it would reject as unknown recipient
* As of Postfix version 2.1, the SMTP server can also reject unknown sender
addresses (i.e. addresses that it would reject as an unknown recipient
addresses). Sender "egress filtering" can help to slow down an email worm
explosion. This is controlled by the smtpd_reject_unlisted_sender
configuration parameter.

View File

@ -369,7 +369,7 @@ Hopefully, the number of problems will be small, but it is a good idea to run
every night before the syslog files are rotated:
# postfix check
# egrep '(reject|warning|error|fatal|panic):' /some/log/file
# grep -E '(reject|warning|error|fatal|panic):' /some/log/file
* The first line (postfix check) causes Postfix to report file permission/
ownership discrepancies.

View File

@ -46,7 +46,7 @@ Postfix logs all failed and successful deliveries to a logfile.
When Postfix does not receive or deliver mail, the first order of business is
to look for errors that prevent Postfix from working properly:
% eeggrreepp ''((wwaarrnniinngg||eerrrroorr||ffaattaall||ppaanniicc))::'' //ssoommee//lloogg//ffiillee || mmoorree
% ggrreepp --EE ''((wwaarrnniinngg||eerrrroorr||ffaattaall||ppaanniicc))::'' //ssoommee//lloogg//ffiillee || mmoorree
Note: the most important message is near the BEGINNING of the output. Error
messages that come later are less useful.

View File

@ -69,9 +69,7 @@ ignore those here). The client sends a random "pre-master secret" to the server
encrypted with the server's RSA public key. The server decrypts this with its
private key, and uses it together with other data exchanged in the clear to
generate the session key. An attacker with access to the server's private key
can perform the same computation at any later time. The TLS library in Windows
XP and Windows Server 2003 only supported cipher suites of this type, and
Exchange 2003 servers largely do not support forward secrecy.
can perform the same computation at any later time.
Later revisions to the TLS protocol introduced forward-secrecy cipher suites in
which the client and server implement a key exchange protocol based on
@ -83,28 +81,22 @@ designate appropriate "parameters" consisting of a mathematical "group" and an
element of that group called a "generator". Presently, there are two flavors of
"groups" that work with PFS:
* PPrriimmee--ffiieelldd ggrroouuppss ((EEDDHH)):: The server needs to be configured with a
suitably-large prime and a corresponding "generator". The acronym for
forward secrecy over prime fields is EDH for Ephemeral Diffie-Hellman (also
abbreviated as DHE).
* FFFFDDHHEE:: Finite-field Diffie-Hellman ephemeral key exchange groups (also EDH
or DHE). The server needs to be configured with a suitably-large prime and
a corresponding "generator". Standard choices of the prime and generator
are specified in RFC7919, and can be used in the TLS 1.3 protocol with the
server and client negotiating a mutually supported choice. In earlier
versions of TLS (1.0 through 1.2), when FFDHE key exchange is performed,
the server chooses the prime and generator unilaterally.
* EElllliippttiicc--ccuurrvvee ggrroouuppss ((EEEECCDDHH)):: The server needs to be configured with a
"named curve". These offer better security at lower computational cost than
prime field groups, but are not as widely implemented. The acronym for the
elliptic curve version is EECDH which is short for Ephemeral Elliptic Curve
Diffie-Hellman (also abbreviated as ECDHE).
It is not essential to know what these are, but one does need to know that
OpenSSL supports EECDH with version 1.0.0 or later. Thus the configuration
parameters related to Elliptic-Curve forward secrecy are available when Postfix
is linked with OpenSSL >= 1.0.0 (provided EC support has not been disabled by
the vendor, as in some versions of RedHat Linux).
Elliptic curves used in cryptography are typically identified by a "name" that
stands for a set of well-known parameter values, and it is these "names" (or
associated ASN.1 object identifiers) that are used in the TLS protocol. On the
other hand, with TLS there are no specially designated prime field groups, so
each server is free to select its own suitably-strong prime and generator.
* EEEECCDDHH:: This is short for Ephemeral Elliptic Curve Diffie-Hellman (also
abbreviated as ECDHE). EECDH offers better security at lower computational
cost than FFDHE. Elliptic curves used in cryptography are typically
identified by a "name" that stands for a set of well-known parameter
values, and it is these "named curves" (or, in certificates, associated
ASN.1 object identifiers) that are used in the TLS protocol. When EECDH key
exchange is used, a mutually supported named curve is negotiated as part of
the TLS handshake.
FFoorrwwaarrdd SSeeccrreeccyy iinn tthhee PPoossttffiixx SSMMTTPP SSeerrvveerr
@ -113,87 +105,49 @@ configuration. If the remote SMTP client prefers cipher suites with forward
secrecy, then the traffic between the server and client will resist decryption
even if the server's long-term authentication keys are later compromised.
Some remote SMTP clients may support forward secrecy, but prefer cipher suites
without forward secrecy. In that case, Postfix >= 2.8 could be configured to
ignore the client's preference with the main.cf setting "tls_preempt_cipherlist
= yes". However, this will likely cause interoperability issues with older
Exchange servers and is not recommended for now.
Most remote SMTP clients now support forward secrecy (the only choice as of TLS
1.3), but some may prefer cipher suites without forward secrecy. Postfix >= 2.8
servers can be configured to override the client's preference by setting
"tls_preempt_cipherlist = yes".
EEDDHH SSeerrvveerr ssuuppppoorrtt
FFFFDDHHEE SSeerrvveerr ssuuppppoorrtt
Postfix >= 2.2 supports 1024-bit-prime EDH out of the box, with no additional
configuration, but you may want to override the default prime to be 2048 bits
long, and you may want to regenerate your primes periodically. See the quick-
start section for details. With Postfix >= 3.1 the out of the box (compiled-in)
EDH prime size is 2048 bits.
Postfix >= 3.1 supports 2048-bit-prime FFDHE out of the box, with no additional
configuration. You can also generate your own FFDHE parameters, but this is not
necessary and no longer recommended. See the quick-start section for details.
With prime-field EDH, OpenSSL wants the server to provide two explicitly-
selected (prime, generator) combinations. One for the now long-obsolete
"export" cipher suites, and another for non-export cipher suites. Postfix has
two such default combinations compiled in, but also supports explicitly-
configured overrides.
* The "export" EDH parameters are used only with the obsolete "export"
ciphers. To use a non-default prime, generate a 512-bit DH parameter file
and set smtpd_tls_dh512_param_file to the filename (see the quick-start
section for details). With Postfix releases after the middle of 2015 the
default opportunistic TLS cipher grade (smtpd_tls_ciphers) is "medium" or
stronger, and export ciphers are no longer used.
* The non-export EDH parameters are used for all other EDH cipher suites. To
use a non-default prime, generate a 1024-bit or 2048-bit DH parameter file
and set smtpd_tls_dh1024_param_file to the filename. Despite the name this
is simply the non-export parameter file and the prime need not actually be
1024 bits long (see the quick-start section for details).
As of mid-2015, SMTP clients are starting to reject TLS handshakes with primes
smaller than 2048 bits. Each site needs to determine which prime size works
best for the majority of its clients. See the quick-start section for the
recommended configuration to work around this issue.
Postfix >= 3.8 supports the finite-field Diffie-Hellman ephemeral (FFDHE) key
exchange group negotiation API of OpenSSL >= 3.0. FFDHE groups are explicitly
negotiated between client and server starting with TLS 1.3. In earlier TLS
versions, the server chooses the group unilaterally. The list of candidate
FFDHE groups can be configured via "tls_ffdhe_auto_groups", which can be used
to select a prioritized list of supported groups (most preferred first) on both
the server and client. The default list is suitable for most users. Either, but
not both of "tls_eecdh_auto_curves" and "tls_ffdhe_auto_groups" may be set
empty, disabling either EC or FFDHE key exchange in OpenSSL 3.0 with TLS 1.3.
That said, interoperability will be poor if the EC curves are all disabled or
don't include the most widely used curves.
EEEECCDDHH SSeerrvveerr ssuuppppoorrtt
Postfix >= 2.6 supports NIST P-256 EECDH when built with OpenSSL >= 1.0.0. When
the remote SMTP client also supports EECDH and implements the P-256 curve,
forward secrecy just works.
Note: With Postfix 2.6 and 2.7, enable EECDH by setting the main.cf
parameter smtpd_tls_eecdh_grade to "strong".
The elliptic curve standards are evolving, with new curves introduced in RFC
8031 to augment or replace the NIST curves tarnished by the Snowden
revelations. Fortunately, TLS clients advertise their list of supported curves
to the server so that servers can choose newer stronger curves when mutually
supported. OpenSSL 1.0.2 released in January 2015 was the first release to
implement negotiation of supported curves in TLS servers. In older OpenSSL
releases, the server is limited to selecting a single widely supported curve.
With Postfix prior to 3.2 or OpenSSL prior to 1.0.2, only a single server-side
curve can be configured, by specifying a suitable EECDH "grade":
smtpd_tls_eecdh_grade = strong | ultra
# Underlying curves, best not changed:
# tls_eecdh_strong_curve = prime256v1
# tls_eecdh_ultra_curve = secp384r1
Postfix >= 3.2 supports the curve negotiation API of OpenSSL >= 1.0.2. When
using this software combination, the default setting of "smtpd_tls_eecdh_grade"
changes to "auto", which selects a curve that is supported by both the server
and client. The list of candidate curves can be configured via
"tls_eecdh_auto_curves", which can be used to configure a prioritized list of
supported curves (most preferred first) on both the server and client. The
default list is suitable for most users.
As of Postfix 3.2 and OpenSSL 1.0.2, a range of supported EECDH curves is
enabled in the server and client, and a suitable mutually supported curve is
negotiated as part of the TLS handshake. The list of supported curves is
configurable via the "tls_eecdh_auto_curves" parameter. With TLS 1.2 the server
needs to leave its setting of "smtpd_tls_eecdh_grade" at the default value of
"auto" (earlier choices of an explicit single curve grade are deprecated). With
TLS 1.3, the "smtpd_tls_eecdh_grade" parameter is not used, and curve selection
is unconditionally negotiated.
FFoorrwwaarrdd SSeeccrreeccyy iinn tthhee PPoossttffiixx SSMMTTPP CClliieenntt
The Postfix >= 2.2 SMTP client supports forward secrecy in its default
configuration. All supported OpenSSL releases support EDH key exchange. OpenSSL
releases >= 1.0.0 also support EECDH key exchange (provided elliptic-curve
support has not been disabled by the vendor as in some versions of RedHat
Linux). If the remote SMTP server supports cipher suites with forward secrecy
configuration. All supported OpenSSL releases support both FFDHE and EECDH key
exchange. If the remote SMTP server supports cipher suites with forward secrecy
(and does not override the SMTP client's cipher preference), then the traffic
between the server and client will resist decryption even if the server's long-
term authentication keys are later compromised.
term authentication keys are later compromised. Forward secrecy is always on in
TLS 1.3.
Postfix >= 3.2 supports the curve negotiation API of OpenSSL >= 1.0.2. The list
of candidate curves can be changed via the "tls_eecdh_auto_curves"
@ -201,21 +155,20 @@ configuration parameter, which can be used to select a prioritized list of
supported curves (most preferred first) on both the Postfix SMTP server and
SMTP client. The default list is suitable for most users.
The default Postfix SMTP client cipher lists are correctly ordered to prefer
EECDH and EDH cipher suites ahead of similar cipher suites that don't implement
forward secrecy. Administrators are strongly discouraged from changing the
cipher list definitions.
Postfix >= 3.8 supports the finite-field Diffie-Hellman ephemeral (FFDHE) key
exchange group negotiation API of OpenSSL >= 3.0. The list of candidate FFDHE
groups can be configured via "tls_ffdhe_auto_groups", which can be used to
select a prioritized list of supported groups (most preferred first) on both
the server and client. The default list is suitable for most users.
The default minimum cipher grade for opportunistic TLS is "medium" for Postfix
releases after the middle of 2015, "export" for older releases. Changing the
minimum cipher grade does not change the cipher preference order. Note that
cipher grades higher than "medium" exclude Exchange 2003 and likely other MTAs,
thus a "high" cipher grade should be chosen only on a case-by-case basis via
the TLS policy table.
The default Postfix SMTP client cipher lists are correctly ordered to prefer
EECDH and FFDHE cipher suites ahead of similar cipher suites that don't
implement forward secrecy. Administrators are strongly discouraged from
changing the cipher list definitions.
GGeettttiinngg ssttaarrtteedd,, qquuiicckk aanndd ddiirrttyy
EEEECCDDHH CClliieenntt ssuuppppoorrtt ((PPoossttffiixx >>== 22..22 wwiitthh OOppeennSSSSLL >>== 11..00..00))
EEEECCDDHH CClliieenntt ssuuppppoorrtt ((PPoossttffiixx >>== 33..22 wwiitthh OOppeennSSSSLL >>== 11..11..11))
This works "out of the box" with no need for additional configuration.
@ -225,77 +178,47 @@ configuration parameter, which can be used to select a prioritized list of
supported curves (most preferred first) on both the Postfix SMTP server and
SMTP client. The default list is suitable for most users.
EEEECCDDHH SSeerrvveerr ssuuppppoorrtt ((PPoossttffiixx >>== 22..66 wwiitthh OOppeennSSSSLL >>== 11..00..00))
EEEECCDDHH SSeerrvveerr ssuuppppoorrtt ((PPoossttffiixx >>== 33..22 wwiitthh OOppeennSSSSLL >>== 11..11..11))
With Postfix 2.6 and 2.7, enable elliptic-curve support in the Postfix SMTP
server. This is the default with Postfix >= 2.8. Note, however, that elliptic-
curve support may be disabled by the vendor, as in some versions of RedHat
Linux.
This works "out of the box" with no need for additional configuration.
/etc/postfix/main.cf:
# Postfix 2.6 & 2.7 only. EECDH is on by default with Postfix >= 2.8.
# The default grade is "auto" with Postfix >= 3.2.
smtpd_tls_eecdh_grade = strong
Postfix >= 3.2 supports the curve negotiation API of OpenSSL >= 1.0.2. The list
of candidate curves can be changed via the "tls_eecdh_auto_curves"
configuration parameter, which can be used to select a prioritized list of
supported curves (most preferred first) on both the Postfix SMTP server and
SMTP client. The default list is suitable for most users.
EEDDHH CClliieenntt ssuuppppoorrtt ((PPoossttffiixx >>== 22..22,, aallll ssuuppppoorrtteedd OOppeennSSSSLL vveerrssiioonnss))
FFFFDDHHEE CClliieenntt ssuuppppoorrtt ((PPoossttffiixx >>== 33..22,, OOppeennSSSSLL >>== 11..11..11))
This works "out of the box" without additional configuration.
In Postfix < 3.8, or OpenSSL prior to 3.0, FFDHE for TLS 1.2 or below works
"out of the box", no additional configuration is necessary. The most one can do
is (not advisable) disable all "kDHE" ciphers, which would then disable FFDHE
key exchange in TLS 1.2 and below.
EEDDHH SSeerrvveerr ssuuppppoorrtt ((PPoossttffiixx >>== 22..22,, aallll ssuuppppoorrtteedd OOppeennSSSSLL vveerrssiioonnss))
With OpenSSL 1.1.1, FFDHE is not supported for TLS 1.3, which uses only EECDH
key exchange. Support for FFDHE with TLS 1.3 was added in OpenSSL 3.0. With
OpenSSL 3.0 and Postfix 3.8 the list of supported TLS 1.3 FFDHE groups becomes
configurable via the "tls_ffdhe_auto_groups" parameter, which can be set empty
to disable FFDHE in TLS 1.3, or conversely expanded to support more groups. The
default should work well for most users.
Optionally generate non-default Postfix SMTP server EDH parameters for improved
security against pre-computation attacks and for compatibility with Debian-
patched Exim SMTP clients that require a >= 2048-bit length for the non-export
prime.
FFFFDDHHEE SSeerrvveerr ssuuppppoorrtt ((PPoossttffiixx >>== 22..22,, aallll ssuuppppoorrtteedd OOppeennSSSSLL vveerrssiioonnss))
With Postfix >= 3.7 built against OpenSSL version is 3.0.0 or later, when the
value of smtpd_tls_dh1024_param_file is either empty or "aauuttoo", the EDH
parameter selection is delegated to the OpenSSL library, which selects
appropriate parameters based on the TLS handshake. This choice is likely to be
the most interoperable with SMTP clients using various TLS libraries, and
custom local parameters are no longer recommended when using Postfix >= 3.7
built against OpenSSL 3.0.0. Just leave smtpd_tls_dh1024_param_file at its
default value (both in main.cf(5) and any master.cf(5) overrides, and let
OpenSSL do the work.
In Postfix < 3.8, or OpenSSL prior to 3.0, FFDHE for TLS 1.2 or below works
"out of the box", no additional configuration is necessary. One can of course
(not advisable) disable all "kDHE" ciphers, which would then disable FFDHE key
exchange in TLS 1.2 and below.
Otherwise, execute as root (prime group generation can take a few seconds to a
few minutes):
The built-in default Postfix FFDHE group is a 2048-bit group as of Postfix 3.1.
You can optionally generate non-default Postfix SMTP server FFDHE parameters
for possibly improved security against pre-computation attacks, but this is not
necessary or recommended. Just leave "smtpd_tls_dh1024_param_file" at its
default empty value.
# cd /etc/postfix
# umask 022
# openssl dhparam -out dh512.tmp 512 && mv dh512.tmp dh512.pem
# openssl dhparam -out dh1024.tmp 1024 && mv dh1024.tmp dh1024.pem
# openssl dhparam -out dh2048.tmp 2048 && mv dh2048.tmp dh2048.pem
# chmod 644 dh512.pem dh1024.pem dh2048.pem
The Postfix SMTP server EDH parameter files are not secret, after all these
parameters are sent to all remote SMTP clients in the clear. Mode 0644 is
appropriate.
You can improve security against pre-computation attacks further by
regenerating the Postfix SMTP server EDH parameters periodically (an hourly or
daily cron job running the above commands as root can automate this task).
Once the parameters are in place, update main.cf as follows:
/etc/postfix/main.cf:
smtpd_tls_dh1024_param_file = ${config_directory}/dh2048.pem
smtpd_tls_dh512_param_file = ${config_directory}/dh512.pem
If some of your MSA clients don't support 2048-bit EDH, you may need to adjust
the submission entry in master.cf accordingly:
/etc/postfix/master.cf:
submission inet n - n - - smtpd
# Some submission clients may not yet do 2048-bit EDH, if such
# clients use your MSA, configure 1024-bit EDH instead. However,
# as of mid-2015, many submission clients no longer accept primes
# with less than 2048-bits. Each site needs to determine which
# type of client is more important to support.
-o smtpd_tls_dh1024_param_file=${config_directory}/dh1024.pem
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
...
The set of FFDHE groups enabled for use with TLS 1.3 becomes configurable with
Postfix >= 3.8 and OpenSSL >= 3.0. The default setting of
"tls_ffdhe_auto_groups" enables the RFC7919 2048 and 3072-bit groups. If you
need more security, you should probably be using EECDH.
HHooww ccaann II sseeee tthhaatt aa ccoonnnneeccttiioonn hhaass ffoorrwwaarrdd sseeccrreeccyy??

View File

@ -466,7 +466,7 @@ configuration file, except for one: the parameter that specifies the location
of Postfix configuration files. In order to build Postfix with a configuration
directory other than /etc/postfix, use:
$ make makefiles CCARGS='-DDEF_CONFIG_DIR=\"/some/where\"'
$ make makefiles CCARGS="-DDEF_CONFIG_DIR=\\\"/some/where\\\""
$ make
IMPORTANT: Be sure to get the quotes right. These details matter a lot.
@ -567,7 +567,7 @@ The following is an extensive list of names and values.
|| |Do not build with IPv6 support. By default, |
|| |IPv6 support is compiled in on platforms that|
|| |are known to have IPv6 support. Note: this |
||-DNO_IPV6 |directive is for debugging And testing only. |
||-DNO_IPV6 |directive is for debugging and testing only. |
|| |It is not guaranteed to work on all |
|| |platforms. If you don't want IPv6 support, |
|| |set "inet_protocols = ipv4" in main.cf. |
@ -829,7 +829,7 @@ and watch your maillog file for any error messages. The pathname is /var/log/
maillog, /var/log/mail, /var/log/syslog, or something else. Typically, the
pathname is defined in the /etc/syslog.conf file.
$ egrep '(reject|warning|error|fatal|panic):' /some/log/file
$ grep -E '(reject|warning|error|fatal|panic):' /some/log/file
Note: the most important error message is logged first. Later messages are not
as useful.
@ -879,7 +879,7 @@ and watch your maillog file for any error messages. The pathname is /var/log/
maillog, /var/log/mail, /var/log/syslog, or something else. Typically, the
pathname is defined in the /etc/syslog.conf file.
$ egrep '(reject|warning|error|fatal|panic):' /some/log/file
$ grep -E '(reject|warning|error|fatal|panic):' /some/log/file
Note: the most important error message is logged first. Later messages are not
as useful.
@ -919,7 +919,7 @@ and watch your maillog file for any error messages. The pathname is /var/log/
maillog, /var/log/mail, /var/log/syslog, or something else. Typically, the
pathname is defined in the /etc/syslog.conf file.
$ egrep '(reject|warning|error|fatal|panic):' /some/log/file
$ grep -E '(reject|warning|error|fatal|panic):' /some/log/file
Note: the most important error message is logged first. Later messages are not
as useful.
@ -1151,7 +1151,7 @@ Hopefully, the number of problems will be small, but it is a good idea to run
every night before the syslog files are rotated:
# postfix check
# egrep '(reject|warning|error|fatal|panic):' /some/log/file
# grep -E '(reject|warning|error|fatal|panic):' /some/log/file
* The first line (postfix check) causes Postfix to report file permission/
ownership discrepancies.

View File

@ -43,7 +43,8 @@ Postfix version 2.2 supports IPv4 and IPv6 on the following platforms:
On other platforms Postfix will simply use IPv4 as it has always done.
See below for tips how to port Postfix IPv6 support to other environments.
See "IPv6 Support for unsupported platforms" for tips to port Postfix IPv6
support to other environments.
CCoonnffiigguurraattiioonn
@ -83,6 +84,9 @@ configuration work with Postfix.
Note 2: on older Linux and Solaris systems, the setting "inet_protocols =
ipv6" will not prevent Postfix from accepting IPv4 connections.
For an unsupported test option to build Postfix without IPv6 support, see
the NO_IPV6 option in the INSTALL document.
* The other new parameter is smtp_bind_address6. This sets the local
interface address for outgoing IPv6 SMTP connections, just like the
smtp_bind_address parameter does for IPv4:

View File

@ -4,7 +4,7 @@ PPoossttffiixx llooggggiinngg ttoo ffiillee oorr ssttdd
OOvveerrvviieeww
Postfix supports it own logging system as an alternative to syslog (which
Postfix supports its own logging system as an alternative to syslog (which
remains the default). This is available with Postfix version 3.4 or later.
Topics covered in this document:
@ -108,6 +108,6 @@ Limitations:
$maillog_file (also, logging to stdout would interfere with the operation
of some of these programs). These programs can log to postlogd(8) if they
are run by the super-user, or if their executable file has set-gid
permission. Do not set this permission on programs other than postdrop(1)
and postqueue(1).
permission. Do not set this permission on programs other than postdrop(1),
postqueue(1), and (Postfix >= 3.7) postlog(1).

View File

@ -24,6 +24,7 @@ implementations.
This document provides information on the following topics:
* How Milter applications plug into Postfix
* When Postfix and Milters inspect an SMTP session
* Building Milter applications
* Running Milter applications
* Configuring Postfix
@ -80,12 +81,47 @@ Postfix architecture).
Local -> sendmail(1)
WWhheenn PPoossttffiixx aanndd MMiilltteerrss iinnssppeecctt aann SSMMTTPP sseessssiioonn
Generally, Postfix inspects information first, then the first configured
Milter, the second configured Milter, and so on.
* With most SMTP commands: Postfix reviews one SMTP command, and if Postfix
does not reject it, Postfix passes the command to the first configured
Milter. If the first Milter does not reject the command, Postfix passes it
to the second configured Milter, and so on. This includes commands with an
envelope sender (MAIL FROM) or envelope recipient (RCPT TO). Postfix stores
the same envelope records in a queue file as when no Milters are
configured, including rewritten envelope addresses, expanded virtual
aliases, BCC addresses from sender/recipient_bcc_maps, and so on.
* With header/body content: Postfix may rewrite or reject header/body content
before it stores that content in the queue file; Postfix stores the same
header/body content as when no Milters are configured. If Postfix does not
reject the header/body content, Postfix passes it to the first configured
Milter which may modify or reject that content or may modify the stored
envelope. If the first Milter does not reject the header/body content,
Postfix passes it to the second configured Milter, and so on.
Details:
* Postfix hides its own Postfix-prepended Received: header, for compatibility
with Sendmail. Postfix does not hide other headers that Postfix or Milters
added or modified.
* When the Postfix SMTP server receives a sequence of one or more valid BDAT
commands, it generates one DATA command for the Milters.
* The Milter API does not support inspection of SMTP commands such as QUIT,
NOOP, or VRFY; the API supports only commands that are needed for email
delivery.
BBuuiillddiinngg MMiilltteerr aapppplliiccaattiioonnss
Milter applications have been written in C, JAVA and Perl, but this document
deals with C applications only. For these, you need an object library that
implements the Sendmail 8 Milter protocol. Postfix currently does not provide
such a library, but Sendmail does.
Milter applications have been written in C, Haskell, Java, Perl, Python, Rust,
and more, but this document covers C applications only. For these, you need an
object library that implements the Sendmail 8 Milter protocol. Postfix
currently does not provide such a library, but Sendmail does.
Some systems install the Sendmail libmilter library by default. With other
systems, libmilter may be provided by a package (called "sendmail-devel" on
@ -148,9 +184,9 @@ section.
You specify SMTP-only Milter applications (there can be more than one) with the
smtpd_milters parameter. Each Milter application is identified by the name of
its listening socket; other Milter configuration options will be discussed in
later sections. Milter applications are applied in the order as specified, and
the first Milter application that rejects a command will override the responses
from other Milter applications.
later sections. Postfix sends commands to each Milter application in the order
as configured with smtpd_milters. When a Milter application rejects a command,
that will override responses from other Milter applications.
/etc/postfix/main.cf:
# Milters for mail that arrives via the smtpd(8) server.
@ -192,9 +228,9 @@ Instead, keep Postfix's own Received: message header and use the header_checks
You specify non-SMTP Milter applications with the non_smtpd_milters parameter.
This parameter uses the same syntax as the smtpd_milters parameter in the
previous section. As with the SMTP-only filters, you can specify more than one
Milter application; they are applied in the order as specified, and the first
Milter application that rejects a command will override the responses from the
other applications.
Milter application. Postfix sends commands to each Milter application in the
order as configured with non_smtpd_milters. When a Milter application rejects a
command, that will override responses from other Milter applications.
/etc/postfix/main.cf:
# Milters for non-SMTP mail.
@ -470,9 +506,9 @@ Sendmail. See the workarounds section below for solutions.
WWhhaatt mmaaccrrooss wwiillll PPoossttffiixx sseenndd ttoo MMiilltteerrss??
Postfix sends specific sets of macros at different Milter protocol stages. The
sets are configured with the parameters as shown in the table below (EOH = end
of headers; EOM = end of message). The protocol version is a number that
Postfix sends at the beginning of the Milter protocol handshake.
names of these macros are configured with the parameters shown in the table
below (EOH = end of headers; EOM = end of message). Some lists require a
minimum Milter protocol version.
As of Sendmail 8.14.0, Milter applications can specify what macros they want to
receive at different Milter protocol stages. An application-specified list
@ -643,6 +679,6 @@ the CONTENT_INSPECTION_README document for a discussion.
The solution is to use Postfix version 2.4 or later.
* Most Milter configuration options are global. Future Postfix versions may
support per-Milter timeouts, per-Milter error handling, etc.
* Postfix versions before 3.0 did not support per-Milter timeouts, per-Milter
error handling, etc.

View File

@ -35,8 +35,8 @@ DHAS_MYSQL and -I for the directory containing the mysql headers, and the
mysqlclient library (and libm) to AUXLIBS_MYSQL, for example:
make -f Makefile.init makefiles \
'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include' \
'AUXLIBS_MYSQL=-L/usr/local/mysql/lib -lmysqlclient -lz -lm'
"CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include" \
"AUXLIBS_MYSQL=-L/usr/local/mysql/lib -lmysqlclient -lz -lm"
If your MySQL shared library is in a directory that the RUN-TIME linker does
not know about, add a "-Wl,-R,/path/to/directory" option after "-lmysqlclient".
@ -54,9 +54,9 @@ building a dynamically-loaded or statically-loaded MySQL database client.
On Solaris, use this instead:
make -f Makefile.init makefiles \
'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include' \
'AUXLIBS_MYSQL=-L/usr/local/mysql/lib -R/usr/local/mysql/lib \
-lmysqlclient -lz -lm'
"CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include" \
"AUXLIBS_MYSQL=-L/usr/local/mysql/lib -R/usr/local/mysql/lib \
-lmysqlclient -lz -lm"
Then, just run 'make'. This requires libz, the compression library. Older mysql
implementations build without libz.

View File

@ -33,8 +33,8 @@ For example:
% make tidy
% make -f Makefile.init makefiles \
'CCARGS=-DHAS_PGSQL -I/usr/local/include/pgsql' \
'AUXLIBS_PGSQL=-L/usr/local/lib -lpq'
"CCARGS=-DHAS_PGSQL -I/usr/local/include/pgsql" \
"AUXLIBS_PGSQL=-L/usr/local/lib -lpq"
If your PostgreSQL shared library is in a directory that the RUN-TIME linker
does not know about, add a "-Wl,-R,/path/to/directory" option after "-lpq".

View File

@ -117,25 +117,25 @@ recent messages pertaining to the domains in question.
# Find deliveries to example.com
#
$ tail -10000 /var/log/maillog |
egrep -i ': to=<.*@example\.com>,' |
grep -E -i ': to=<.*@example\.com>,' |
less
# Find messages from example.com
#
$ tail -10000 /var/log/maillog |
egrep -i ': from=<.*@example\.com>,' |
grep -E -i ': from=<.*@example\.com>,' |
less
You may want to drill in on some specific queue ids:
# Find all messages for a specific queue id.
#
$ tail -10000 /var/log/maillog | egrep ': 2B2173FF68: '
$ tail -10000 /var/log/maillog | grep -E ': 2B2173FF68: '
Also look for queue manager warning messages in the log. These warnings can
suggest strategies to reduce congestion.
$ egrep 'qmgr.*(panic|fatal|error|warning):' /var/log/maillog
$ grep -E 'qmgr.*(panic|fatal|error|warning):' /var/log/maillog
When all else fails try the Postfix mailing list for help, but please don't
forget to include the top 10 or 20 lines of qshape(1) output.

View File

@ -1,199 +1,170 @@
This is the Postfix 3.7 (stable) release.
This is the Postfix 3.8 stable release.
The stable Postfix release is called postfix-3.7.x where 3=major
release number, 7=minor release number, x=patchlevel. The stable
The stable Postfix release is called postfix-3.8.x where 3=major
release number, 8=minor release number, x=patchlevel. The stable
release never changes except for patches that address bugs or
emergencies. Patches change the patchlevel and the release date.
New features are developed in snapshot releases. These are called
postfix-3.8-yyyymmdd where yyyymmdd is the release date (yyyy=year,
mm=month, dd=day). Patches are never issued for snapshot releases;
postfix-3.9-yyyymmdd where yyyymmdd is the release date (yyyy=year,
mm=month, dd=day). Patches are never issued for snapshot releases;
instead, a new snapshot is released.
The mail_release_date configuration parameter (format: yyyymmdd)
specifies the release date of a stable release or snapshot release.
If you upgrade from Postfix 3.5 or earlier, read RELEASE_NOTES-3.6
If you upgrade from Postfix 3.6 or earlier, please read RELEASE_NOTES-3.7
before proceeding.
License change
---------------
Dual license
------------
This software is distributed with a dual license: in addition to the
historical IBM Public License 1.0, it is now also distributed with the
more recent Eclipse Public License 2.0. Recipients can choose to take
the software under the license of their choice. Those who are more
comfortable with the IPL can continue with that license.
As of Postfix 3.2.5 this software is distributed with a dual license:
in addition to the historical IBM Public License (IPL) 1.0, it is
now also distributed with the more recent Eclipse Public License
(EPL) 2.0. Recipients can choose to take the software under the
license of their choice. Those who are more comfortable with the
IPL can continue with that license.
Major changes with Postfix 3.8.4
================================
Bugfix for messages not delivered after "warning: Unexpected record type 'X'
============================================================================
Security: the Postfix SMTP server optionally disconnects a remote
SMTP client that sends a 'bare newline' line ending in SMTP. This
prevents an SMTP smuggling attack on recipients at a Postfix server.
For background, see https://www.postfix.org/smtp-smuggling.html
Due to a bug introduced in Postfix 3.7.0, a message could falsely
be flagged as corrupt with "warning: Unexpected record type 'X'".
Sites concerned about SMTP smuggling attacks should enable this
feature in Internet-facing Postfix servers. For compatibility with
non-standard clients, Postfix by default excludes clients in
mynetworks from this countermeasure.
Such messages were moved to the "corrupt" queue directory, where
they may still be found. See below for instructions to deal with
these falsely flagged messages.
The default settings are:
This could happen for messages with 5000 or more recipients, or
with fewer recipients on a busy mail server. The problem was first
reported by Frank Brendel, reproduced by John Alex.
# Optionally disconnect remote SMTP clients that send bare newlines,
# but allow local clients with non-standard SMTP implementations
# such as netcat, fax machines, or load balancer health checks.
#
smtpd_forbid_bare_newline = no
smtpd_forbid_bare_newline_exclusions = $mynetworks
A file in the "corrupt" queue directory may be inspected with the
command "postcat /var/spool/postfix/corrupt/<filename>. If delivery
of the file is still desired, the file can be moved back to
/var/spool/postfix/incoming after updating Postfix and executing
"postfix reload".
This feature is back-ported from Postfix 3.9, with the difference
that "smtpd_forbid_bare_newline = no" by default.
Major changes - configuration
-----------------------------
Major changes with Postfix 3.8.1
================================
[Feature 20210605] Support to inline the content of small cidr:,
pcre:, and regexp: tables in Postfix parameter values.
Security: the Postfix SMTP server optionally disconnects remote
SMTP clients that violate RFC 2920 (or 5321) command pipelining
constraints. The server replies with "554 5.5.0 Error: SMTP protocol
synchronization" and logs the unexpected remote SMTP client input.
Specify "smtpd_forbid_unauth_pipelining = yes" to enable. This
feature is enabled by default in Postfix 3.9 and later.
Example:
Workaround to limit collateral damage from OS distributions that
crank up security to 11, increasing the number of plaintext email
deliveries. This introduces basic OpenSSL configuration file support,
with two new parameters "tls_config_file" and "tls_config_name".
Details are in the postconf(5) manpage under "tls_config_file" and
"tls_config_name".
smtpd_forbidden_commands =
CONNECT GET POST regexp:{{/^[^A-Z]/ Thrash}}
Major changes - documentation and code cleanup
----------------------------------------------
This is the new smtpd_forbidden_commands default value. It will
immediately disconnect a remote SMTP client when a command does not
start with a letter (a-z or A-Z).
There are numerous small fixes to Postfix documentation, and small
code-health changes that should not affect documented behavior but
may improve Postfix behavior for malformed input, or that make
Postfix easier to maintain. See the HISTORY file for details.
The basic syntax is:
Major changes - SRV support
---------------------------
/etc/postfix/main.cf:
parameter = .. map-type:{ { rule-1 }, { rule-2 } .. } ..
[Feature 20230214] Support to look up DNS SRV records in the Postfix
SMTP/LMTP client, Based on code by Tomas Korbar (Red Hat).
/etc/postfix/master.cf:
.. -o { parameter = .. map-type:{ { rule-1 }, { rule-2 } .. } .. } ..
For example, with "use_srv_lookup = submission" and "relayhost =
example.com:submission", the Postfix SMTP client will look up DNS
SRV records for _submission._tcp.example.com, and will relay email
through the hosts and ports that are specified with those records.
where map-type is one of cidr, pcre, or regexp.
See https://www.postfix.org/postconf.5.html#use_srv_lookup for more
details, including how to selectively use SRV in a configuration
that connects to multiple ISP accounts.
Postfix ignores whitespace after '{' and before '}', and writes each
rule as one text line to a nameless in-memory file:
SRV support may also be useful inside a cloud-based infrastructure
when Postfix needs to deliver mail to services that run on a
dynamically-allocated port.
in-memory file:
rule-1
rule-2
..
Major changes - TLS support
---------------------------
Postfix parses the result as if it is a file in /etc/postfix.
[Incompat 20230304] This introduces the following changes:
Note: if a rule contains $, specify $$ to keep Postfix from trying
to do $name expansion as it evaluates the parameter value.
- Postfix treats the "export" and "low" cipher grade settings as
"medium". The "export" and "low" grades are no longer supported
in OpenSSL 1.1.1, the minimum version that Postfix requires.
Major changes - lmdb support
----------------------------
- Postfix default settings now exclude the following deprecated or
unused ciphers (SEED, IDEA, 3DES, RC2, RC4, RC5), digest (MD5),
key exchange algorithms (DH, ECDH), and public key algorithm
(DSS).
[Feature 20210605] Overhauled the LMDB client's error handling, and
added integration tests for future-proofing. There are no visible
changes in documented behavior.
[Feature 20230108] New configuration parameter tls_ffdhe_auto_groups
for finite-field Diffie-Hellman ephemeral (FFDHE) support in TLS
1.3 with OpenSSL 3.0.
Major changes - attack resistance
---------------------------------
[Feature 20240312] the Postfix SMTP server can now aggregate
smtpd_client_*_rate and smtpd_client_*_count statistics by network
block, as specified with smtpd_client_ipv4_prefix_length (default
32, no aggregation) and smtpd_client_ipv6_prefix_length (default
84, aggregation by /84 network blocks). The latter raises the bar
for a memory exhaustion attack.
[Feature 20221023] Unconditionally disable a CPU resource attack
requesting TLS renegotiation. There's no good reason to support
this in the middle of an SMTP connection.
Major changes - bit rot
-----------------------
[Incompat 20221228] Postfix documentation and code have been converted
to use "grep -E" and "grep -F" instead of the historical forms
"egrep" and "fgrep". To build Postfix on a system that supports
only the historical forms, run the script auxiliary/fix-grep/fix-grep.sh
to revert this change.
Major changes - configuration checks
------------------------------------
[Feature 20240406] The postconf command now warns for #comment in
or after a Postfix parameter value. Postfix programs do not support
#comment after other text, and treat that as input.
Major changes - database support
--------------------------------
[Incompat 20220509] The PostgreSQL client encoding is now configurable
with the "encoding" Postfix configuration file attribute. The default
is "UTF8". Previously the encoding was hard-coded as "LATIN1".
Major changes - logging
-----------------------
[Feature 20210815] To make the maillog_file feature more useful,
the postlog(1) command is now set-gid postdrop, so that unprivileged
programs can use it to write logging through the postlogd(8) daemon.
This required hardening the postlog(1) command against privilege
escalation attacks. DO NOT turn on the set-gid bit with older
postlog(1) implementations.
[Incompat 20230308] The postfix(1) and postlog(1) commands now
produce stderr logging even when stderr is not connected to a
terminal. This eliminates an inconsistency, and makes these programs
easier to use in some automated procedures. The canonical example
is to capture output from "postmulti -p status" to figure out which
instances are or are not running.
Major changes - pcre2 support
-----------------------------
Major changes - source code organization
----------------------------------------
[Feature 20211127] Support for the pcre2 library (the legacy pcre
library is no longer maintained). The Postfix build procedure
automatically detects if the pcre2 library is installed, and if it
is unavailable, the Postfix build procedure will detect if the
legacy pcre library is installed. See PCRE_README if you need to
build Postfix with a specific library.
Visible differences: some error messages may have a different text,
and the 'X' pattern flag is no longer supported with pcre2.
Major changes - security
------------------------
[Feature 20220102] Postfix programs now randomize the initial state
of in-memory hash tables, to defend against hash collision attacks
involving a large number of attacker-chosen lookup keys. Presently,
the only known opportunity for such attacks involves remote SMTP
client IPv6 addresses in the anvil(8) service. The attack would
require making hundreds of short-lived connections per second from
thousands of different IP addresses, because the anvil(8) service
drops inactive counters after 100s. Other in-memory hash tables
with attacker-chosen lookup keys are by design limited in size. The
fix is cheap, and therefore implemented for all Postfix in-memory
hash tables. Problem reported by Pascal Junod.
[Feature 20211030] The postqueue command now sanitizes non-printable
characters (such as newlines) in strings before they are formatted
as json or as legacy output. These outputs are piped into other
programs that are run by administrative users. This closes a
hypothetical opportunity for privilege escalation.
[Feature 20210815] Updated defense against remote clients or servers
that 'trickle' SMTP or LMTP traffic, based on per-request deadlines
and minimum data rates.
Per-request deadlines:
The new {smtpd,smtp,lmtp}_per_request_deadline parameters replace
{smtpd,smtp,lmtp}_per_record_deadline, with backwards compatible
default settings. This defense is enabled by default in the Postfix
SMTP server in case of overload.
The new smtpd_per_record_deadline parameter limits the combined
time for the Postfix SMTP server to receive a request and to send
a response, while the new {smtp,lmtp}_per_record_deadline parameters
limit the combined time for the Postfix SMTP or LMTP client to send
a request and to receive a response.
Minimum data rates:
The new smtpd_min_data_rate parameter enforces a minimum plaintext
data transfer rate for DATA and BDAT requests, but only when
smtpd_per_record_deadline is enabled. After a read operation transfers
N plaintext bytes (possibly after TLS decryption), and after the
DATA or BDAT request deadline is decreased by the elapsed time of
that read operation, the DATA or BDAT request deadline is increased
by N/smtpd_min_data_rate seconds. However, the deadline is never
increased beyond the smtpd_timeout value. The default minimum data
rate is 500 (bytes/second) but is still subject to change.
The new {smtp,lmtp}_min_data_rate parameters enforce the corresponding
minimum DATA transfer rates for the Postfix SMTP and LMTP client.
Major changes - tls support
---------------------------
[Cleanup 20220121] The new tlsproxy_client_security_level parameter
replaces tlsproxy_client_level, and the new tlsproxy_client_policy_maps
parameter replaces tlsproxy_client_policy. This is for consistent
parameter naming (tlsproxy_client_xxx corresponds to smtp_tls_xxx).
This change was made with backwards-compatible default settings.
[Feature 20210926] Postfix was updated to support OpenSSL 3.0.0 API
features, and to work around OpenSSL 3.0.0 bit-rot (avoid using
deprecated API features).
Other code health
-----------------
[typos] Typo fixes by raf.
[pre-release checks] Added pre-release checks to detect a) new typos
in documentation and source-code comments, b) missing entries in
the postfix-files file (some documentation would not be installed),
c) missing rules in the postlink script (some text would not have
a hyperlink in documentation), and d) missing map-based $parameter
names in the proxy_read_maps default value (the proxymap daemon
would not automatically authorize some proxied maps).
[memory stream] Improved support for memory-based streams made it
possible to inline small cidr:, pcre:, and regexp: maps in Postfix
parameter values, and to eliminate some ad-hoc code that converted
tlsproxy(8) protocol data to or from serialized form.
[Incompat 20220507] Most global/mkmap*.[hc] files are moved to the
util directory; only global/mkmap_proxy.* remains. The old file
organization was designed before support for dynamically-loadable
databases was added, and that code suffered from complexity.

View File

@ -174,9 +174,23 @@ You can read more about the following topics:
* Cyrus SASL version 2.1.22 and newer additionally search in /etc/sasl2/.
* Some Postfix distributions are modified and look for the Cyrus SASL
configuration file in /etc/postfix/sasl/, /var/lib/sasl2/ etc. See the
distribution-specific documentation to determine the expected location.
* With Postfix 2.5 and later you can explicitly configure the search path via
the cyrus_sasl_config_path configuration parameter. Specify zero or more
colon-separated directories. If set empty (the default value) the search
path is the one compiled into the Cyrus SASL library.
* Some Postfix distributions employ a non-empty default value for
cyrus_sasl_config_path to look for the Cyrus SASL configuration file in /
etc/postfix/sasl/, /var/lib/sasl2/ etc. See the output of postconf
cyrus_sasl_config_path and/or the distribution-specific documentation to
determine the expected location.
* Some Debian-based Postfix distributions patch Postfix to hardcode a non-
default search path, making it impossible to set an alternate search path
via the "cyrus_sasl_config_path" parameter. This is likely to be the case
when the distribution documents a Postfix-specific path (e.g. /etc/postfix/
sasl/) that is different from the default value of "cyrus_sasl_config_path"
(which then is likely to be empty).
NNoottee
@ -1285,14 +1299,14 @@ To generate the necessary Makefiles, execute the following in the Postfix top-
level directory:
% mmaakkee ttiiddyy # if you have left-over files from a previous build
% mmaakkee mmaakkeeffiilleess CCCCAARRGGSS==''--DDUUSSEE__SSAASSLL__AAUUTTHH \\
--DDDDEEFF__SSEERRVVEERR__SSAASSLL__TTYYPPEE==\\""ddoovveeccoott\\""''
% mmaakkee mmaakkeeffiilleess CCCCAARRGGSS==""--DDUUSSEE__SSAASSLL__AAUUTTHH \\
--DDDDEEFF__SSEERRVVEERR__SSAASSLL__TTYYPPEE==\\\\\\""ddoovveeccoott\\\\\\""""
After this, proceed with "make" as described in the INSTALL document.
NNoottee
* The -DDEF_SERVER_SASL_TYPE=\"dovecot\" is not necessary; it just makes
* The -DDEF_SERVER_SASL_TYPE=\\\"dovecot\\\" is not necessary; it just makes
Postfix configuration a little more convenient because you don't have to
specify the SASL plug-in type in the Postfix main.cf file (but this may
cause surprises when you switch to a later Postfix version that is built
@ -1303,10 +1317,10 @@ NNoottee
LDAP_README and TLS_README for details.
% mmaakkee ttiiddyy # if you have left-over files from a previous build
% mmaakkee mmaakkeeffiilleess CCCCAARRGGSS==''--DDUUSSEE__SSAASSLL__AAUUTTHH \\
--DDDDEEFF__SSEERRVVEERR__SSAASSLL__TTYYPPEE==\\""ddoovveeccoott\\"" \\
......CCCCAARRGGSS ooppttiioonnss ffoorr LLDDAAPP oorr TTLLSS eettcc........'' \\
AAUUXXLLIIBBSS==''......AAUUXXLLIIBBSS ooppttiioonnss ffoorr LLDDAAPP oorr TTLLSS eettcc........''
% mmaakkee mmaakkeeffiilleess CCCCAARRGGSS==""--DDUUSSEE__SSAASSLL__AAUUTTHH \\
--DDDDEEFF__SSEERRVVEERR__SSAASSLL__TTYYPPEE==\\\\\\""ddoovveeccoott\\\\\\"" \\
......CCCCAARRGGSS ooppttiioonnss ffoorr LLDDAAPP oorr TTLLSS eettcc........"" \\
AAUUXXLLIIBBSS==""......AAUUXXLLIIBBSS ooppttiioonnss ffoorr LLDDAAPP oorr TTLLSS eettcc........""
BBuuiillddiinngg CCyyrruuss SSAASSLL ssuuppppoorrtt

View File

@ -85,6 +85,9 @@ a delegated SMTPD access policy request:
PPoossttffiixx vveerrssiioonn 33..22 aanndd llaatteerr::
server_address=10.3.2.1
server_port=54321
PPoossttffiixx vveerrssiioonn 33..88 aanndd llaatteerr::
compatibility_level=major.minor.patch
mail_version=3.8.0
[empty line]
Notes:
@ -164,6 +167,14 @@ Notes:
* The "policy_context" attribute provides a way to pass information that is
not available via other attributes (Postfix version 3.1 and later).
* The "compatibility_level" attribute corresponds to the compatibility_level
parameter value. It has the form major.minor.patch where minor and patch
may be absent.
* The "mail_version" attribute corresponds to the mail_version parameter
value. It has the form major.minor.patch for stable releases, and
major.minor-yyyymmdd for unstable releases.
The following is specific to SMTPD delegated policy requests:
* Protocol names are ESMTP or SMTP.

View File

@ -71,6 +71,25 @@ PPrrooss aanndd ccoonnss ooff bbeeffoorree--qquueeuuee
sender (which is usually forged anyway). Mail that is not accepted remains
the responsibility of the remote SMTP client.
* Con: The smtpd(8) service before the smtpd_proxy_filter cannot support
features that involve header or body access, or that involve queue file
manipulation (i.e., anything that involves processing by the cleanup(8)
service).
o No support for HOLD actions in Postfix smtpd access(5) restrictions.
o No support for smtpd_milters features that involve message header or
body content.
o No support for receive_override_options.
Instead, specify those features with the smtpd(8) service behind the
smtpd_proxy_filter. In some cases, it may be possible to combine a before-
filter PREPEND action that emits a unique pattern (for example containing
the MTA domain name), with an after-filter header_checks action that does
what you want, and with an smtp_header_checks IGNORE action that deletes
the prepended header from transit mail.
* Con: The remote SMTP client expects an SMTP reply within a deadline. As the
system load increases, fewer and fewer CPU cycles remain available to
answer within the deadline, and eventually you either have to stop

View File

@ -23,8 +23,8 @@ sqlite3 library, plus the name of the standard POSIX thread library (pthread).
For example:
make -f Makefile.init makefiles \
'CCARGS=-DHAS_SQLITE -I/usr/local/include' \
'AUXLIBS_SQLITE=-L/usr/local/lib -lsqlite3 -lpthread'
"CCARGS=-DHAS_SQLITE -I/usr/local/include" \
"AUXLIBS_SQLITE=-L/usr/local/lib -lsqlite3 -lpthread"
If your SQLite shared library is in a directory that the RUN-TIME linker does
not know about, add a "-Wl,-R,/path/to/directory" option after "-lsqlite3".

View File

@ -270,7 +270,7 @@ purpose of the firewall email function.
17 . . .
18
19 /etc/postfix/transport:
20 example.com smtp:[inside-gateway.example.com]
20 example.com relay:[inside-gateway.example.com]
Translation:
@ -286,7 +286,12 @@ Translation:
"@example.com x" wild-card in the relay_recipients table.
* Lines 12, 19-20: Route mail for "example.com" to the inside gateway
machine. The [] forces Postfix to do no MX lookup.
machine. The [] forces Postfix to do no MX lookup. This uses the "relay"
delivery transport (a copy of the default "smtp" delivery transport) to
forward inbound mail. This can improve performance of deliveries to
internal domains because they will compete for SMTP clients from the
"relay" delivery transport, instead of competing with other SMTP deliveries
for SMTP clients from the default "smtp" delivery transport.
Specify ddbbmm instead of hhaasshh if your system uses ddbbmm files instead of ddbb files.
To find out what lookup tables Postfix supports, use the command "ppoossttccoonnff --mm".

View File

@ -2227,7 +2227,7 @@ If you're willing to revert your settings to the defaults and switch to a
"stock" opportunistic TLS configuration, then you can: erase all the SMTP
client TLS settings and then enable client TLS:
# postconf -X `postconf -nH | egrep '^smtp(_|_enforce_|_use_)tls'`
# postconf -X `postconf -nH | grep -E '^smtp(_|_enforce_|_use_)tls'`
# postfix tls enable-client
# postfix reload
@ -2251,7 +2251,7 @@ If you're willing to revert your settings to the defaults and switch to a
"stock" server TLS configuration, then you can: erase all the SMTP server TLS
settings and then enable server TLS:
# postconf -X `postconf -nH | egrep '^smtpd(_|_enforce_|_use_)tls'`
# postconf -X `postconf -nH | grep -E '^smtpd(_|_enforce_|_use_)tls'`
# postfix tls enable-server
# postfix reload

View File

@ -1,199 +1,170 @@
This is the Postfix 3.7 (stable) release.
This is the Postfix 3.8 stable release.
The stable Postfix release is called postfix-3.7.x where 3=major
release number, 7=minor release number, x=patchlevel. The stable
The stable Postfix release is called postfix-3.8.x where 3=major
release number, 8=minor release number, x=patchlevel. The stable
release never changes except for patches that address bugs or
emergencies. Patches change the patchlevel and the release date.
New features are developed in snapshot releases. These are called
postfix-3.8-yyyymmdd where yyyymmdd is the release date (yyyy=year,
mm=month, dd=day). Patches are never issued for snapshot releases;
postfix-3.9-yyyymmdd where yyyymmdd is the release date (yyyy=year,
mm=month, dd=day). Patches are never issued for snapshot releases;
instead, a new snapshot is released.
The mail_release_date configuration parameter (format: yyyymmdd)
specifies the release date of a stable release or snapshot release.
If you upgrade from Postfix 3.5 or earlier, read RELEASE_NOTES-3.6
If you upgrade from Postfix 3.6 or earlier, please read RELEASE_NOTES-3.7
before proceeding.
License change
---------------
Dual license
------------
This software is distributed with a dual license: in addition to the
historical IBM Public License 1.0, it is now also distributed with the
more recent Eclipse Public License 2.0. Recipients can choose to take
the software under the license of their choice. Those who are more
comfortable with the IPL can continue with that license.
As of Postfix 3.2.5 this software is distributed with a dual license:
in addition to the historical IBM Public License (IPL) 1.0, it is
now also distributed with the more recent Eclipse Public License
(EPL) 2.0. Recipients can choose to take the software under the
license of their choice. Those who are more comfortable with the
IPL can continue with that license.
Major changes with Postfix 3.8.4
================================
Bugfix for messages not delivered after "warning: Unexpected record type 'X'
============================================================================
Security: the Postfix SMTP server optionally disconnects a remote
SMTP client that sends a 'bare newline' line ending in SMTP. This
prevents an SMTP smuggling attack on recipients at a Postfix server.
For background, see https://www.postfix.org/smtp-smuggling.html
Due to a bug introduced in Postfix 3.7.0, a message could falsely
be flagged as corrupt with "warning: Unexpected record type 'X'".
Sites concerned about SMTP smuggling attacks should enable this
feature in Internet-facing Postfix servers. For compatibility with
non-standard clients, Postfix by default excludes clients in
mynetworks from this countermeasure.
Such messages were moved to the "corrupt" queue directory, where
they may still be found. See below for instructions to deal with
these falsely flagged messages.
The default settings are:
This could happen for messages with 5000 or more recipients, or
with fewer recipients on a busy mail server. The problem was first
reported by Frank Brendel, reproduced by John Alex.
# Optionally disconnect remote SMTP clients that send bare newlines,
# but allow local clients with non-standard SMTP implementations
# such as netcat, fax machines, or load balancer health checks.
#
smtpd_forbid_bare_newline = no
smtpd_forbid_bare_newline_exclusions = $mynetworks
A file in the "corrupt" queue directory may be inspected with the
command "postcat /var/spool/postfix/corrupt/<filename>. If delivery
of the file is still desired, the file can be moved back to
/var/spool/postfix/incoming after updating Postfix and executing
"postfix reload".
This feature is back-ported from Postfix 3.9, with the difference
that "smtpd_forbid_bare_newline = no" by default.
Major changes - configuration
-----------------------------
Major changes with Postfix 3.8.1
================================
[Feature 20210605] Support to inline the content of small cidr:,
pcre:, and regexp: tables in Postfix parameter values.
Security: the Postfix SMTP server optionally disconnects remote
SMTP clients that violate RFC 2920 (or 5321) command pipelining
constraints. The server replies with "554 5.5.0 Error: SMTP protocol
synchronization" and logs the unexpected remote SMTP client input.
Specify "smtpd_forbid_unauth_pipelining = yes" to enable. This
feature is enabled by default in Postfix 3.9 and later.
Example:
Workaround to limit collateral damage from OS distributions that
crank up security to 11, increasing the number of plaintext email
deliveries. This introduces basic OpenSSL configuration file support,
with two new parameters "tls_config_file" and "tls_config_name".
Details are in the postconf(5) manpage under "tls_config_file" and
"tls_config_name".
smtpd_forbidden_commands =
CONNECT GET POST regexp:{{/^[^A-Z]/ Thrash}}
Major changes - documentation and code cleanup
----------------------------------------------
This is the new smtpd_forbidden_commands default value. It will
immediately disconnect a remote SMTP client when a command does not
start with a letter (a-z or A-Z).
There are numerous small fixes to Postfix documentation, and small
code-health changes that should not affect documented behavior but
may improve Postfix behavior for malformed input, or that make
Postfix easier to maintain. See the HISTORY file for details.
The basic syntax is:
Major changes - SRV support
---------------------------
/etc/postfix/main.cf:
parameter = .. map-type:{ { rule-1 }, { rule-2 } .. } ..
[Feature 20230214] Support to look up DNS SRV records in the Postfix
SMTP/LMTP client, Based on code by Tomas Korbar (Red Hat).
/etc/postfix/master.cf:
.. -o { parameter = .. map-type:{ { rule-1 }, { rule-2 } .. } .. } ..
For example, with "use_srv_lookup = submission" and "relayhost =
example.com:submission", the Postfix SMTP client will look up DNS
SRV records for _submission._tcp.example.com, and will relay email
through the hosts and ports that are specified with those records.
where map-type is one of cidr, pcre, or regexp.
See https://www.postfix.org/postconf.5.html#use_srv_lookup for more
details, including how to selectively use SRV in a configuration
that connects to multiple ISP accounts.
Postfix ignores whitespace after '{' and before '}', and writes each
rule as one text line to a nameless in-memory file:
SRV support may also be useful inside a cloud-based infrastructure
when Postfix needs to deliver mail to services that run on a
dynamically-allocated port.
in-memory file:
rule-1
rule-2
..
Major changes - TLS support
---------------------------
Postfix parses the result as if it is a file in /etc/postfix.
[Incompat 20230304] This introduces the following changes:
Note: if a rule contains $, specify $$ to keep Postfix from trying
to do $name expansion as it evaluates the parameter value.
- Postfix treats the "export" and "low" cipher grade settings as
"medium". The "export" and "low" grades are no longer supported
in OpenSSL 1.1.1, the minimum version that Postfix requires.
Major changes - lmdb support
----------------------------
- Postfix default settings now exclude the following deprecated or
unused ciphers (SEED, IDEA, 3DES, RC2, RC4, RC5), digest (MD5),
key exchange algorithms (DH, ECDH), and public key algorithm
(DSS).
[Feature 20210605] Overhauled the LMDB client's error handling, and
added integration tests for future-proofing. There are no visible
changes in documented behavior.
[Feature 20230108] New configuration parameter tls_ffdhe_auto_groups
for finite-field Diffie-Hellman ephemeral (FFDHE) support in TLS
1.3 with OpenSSL 3.0.
Major changes - attack resistance
---------------------------------
[Feature 20240312] the Postfix SMTP server can now aggregate
smtpd_client_*_rate and smtpd_client_*_count statistics by network
block, as specified with smtpd_client_ipv4_prefix_length (default
32, no aggregation) and smtpd_client_ipv6_prefix_length (default
84, aggregation by /84 network blocks). The latter raises the bar
for a memory exhaustion attack.
[Feature 20221023] Unconditionally disable a CPU resource attack
requesting TLS renegotiation. There's no good reason to support
this in the middle of an SMTP connection.
Major changes - bit rot
-----------------------
[Incompat 20221228] Postfix documentation and code have been converted
to use "grep -E" and "grep -F" instead of the historical forms
"egrep" and "fgrep". To build Postfix on a system that supports
only the historical forms, run the script auxiliary/fix-grep/fix-grep.sh
to revert this change.
Major changes - configuration checks
------------------------------------
[Feature 20240406] The postconf command now warns for #comment in
or after a Postfix parameter value. Postfix programs do not support
#comment after other text, and treat that as input.
Major changes - database support
--------------------------------
[Incompat 20220509] The PostgreSQL client encoding is now configurable
with the "encoding" Postfix configuration file attribute. The default
is "UTF8". Previously the encoding was hard-coded as "LATIN1".
Major changes - logging
-----------------------
[Feature 20210815] To make the maillog_file feature more useful,
the postlog(1) command is now set-gid postdrop, so that unprivileged
programs can use it to write logging through the postlogd(8) daemon.
This required hardening the postlog(1) command against privilege
escalation attacks. DO NOT turn on the set-gid bit with older
postlog(1) implementations.
[Incompat 20230308] The postfix(1) and postlog(1) commands now
produce stderr logging even when stderr is not connected to a
terminal. This eliminates an inconsistency, and makes these programs
easier to use in some automated procedures. The canonical example
is to capture output from "postmulti -p status" to figure out which
instances are or are not running.
Major changes - pcre2 support
-----------------------------
Major changes - source code organization
----------------------------------------
[Feature 20211127] Support for the pcre2 library (the legacy pcre
library is no longer maintained). The Postfix build procedure
automatically detects if the pcre2 library is installed, and if it
is unavailable, the Postfix build procedure will detect if the
legacy pcre library is installed. See PCRE_README if you need to
build Postfix with a specific library.
Visible differences: some error messages may have a different text,
and the 'X' pattern flag is no longer supported with pcre2.
Major changes - security
------------------------
[Feature 20220102] Postfix programs now randomize the initial state
of in-memory hash tables, to defend against hash collision attacks
involving a large number of attacker-chosen lookup keys. Presently,
the only known opportunity for such attacks involves remote SMTP
client IPv6 addresses in the anvil(8) service. The attack would
require making hundreds of short-lived connections per second from
thousands of different IP addresses, because the anvil(8) service
drops inactive counters after 100s. Other in-memory hash tables
with attacker-chosen lookup keys are by design limited in size. The
fix is cheap, and therefore implemented for all Postfix in-memory
hash tables. Problem reported by Pascal Junod.
[Feature 20211030] The postqueue command now sanitizes non-printable
characters (such as newlines) in strings before they are formatted
as json or as legacy output. These outputs are piped into other
programs that are run by administrative users. This closes a
hypothetical opportunity for privilege escalation.
[Feature 20210815] Updated defense against remote clients or servers
that 'trickle' SMTP or LMTP traffic, based on per-request deadlines
and minimum data rates.
Per-request deadlines:
The new {smtpd,smtp,lmtp}_per_request_deadline parameters replace
{smtpd,smtp,lmtp}_per_record_deadline, with backwards compatible
default settings. This defense is enabled by default in the Postfix
SMTP server in case of overload.
The new smtpd_per_record_deadline parameter limits the combined
time for the Postfix SMTP server to receive a request and to send
a response, while the new {smtp,lmtp}_per_record_deadline parameters
limit the combined time for the Postfix SMTP or LMTP client to send
a request and to receive a response.
Minimum data rates:
The new smtpd_min_data_rate parameter enforces a minimum plaintext
data transfer rate for DATA and BDAT requests, but only when
smtpd_per_record_deadline is enabled. After a read operation transfers
N plaintext bytes (possibly after TLS decryption), and after the
DATA or BDAT request deadline is decreased by the elapsed time of
that read operation, the DATA or BDAT request deadline is increased
by N/smtpd_min_data_rate seconds. However, the deadline is never
increased beyond the smtpd_timeout value. The default minimum data
rate is 500 (bytes/second) but is still subject to change.
The new {smtp,lmtp}_min_data_rate parameters enforce the corresponding
minimum DATA transfer rates for the Postfix SMTP and LMTP client.
Major changes - tls support
---------------------------
[Cleanup 20220121] The new tlsproxy_client_security_level parameter
replaces tlsproxy_client_level, and the new tlsproxy_client_policy_maps
parameter replaces tlsproxy_client_policy. This is for consistent
parameter naming (tlsproxy_client_xxx corresponds to smtp_tls_xxx).
This change was made with backwards-compatible default settings.
[Feature 20210926] Postfix was updated to support OpenSSL 3.0.0 API
features, and to work around OpenSSL 3.0.0 bit-rot (avoid using
deprecated API features).
Other code health
-----------------
[typos] Typo fixes by raf.
[pre-release checks] Added pre-release checks to detect a) new typos
in documentation and source-code comments, b) missing entries in
the postfix-files file (some documentation would not be installed),
c) missing rules in the postlink script (some text would not have
a hyperlink in documentation), and d) missing map-based $parameter
names in the proxy_read_maps default value (the proxymap daemon
would not automatically authorize some proxied maps).
[memory stream] Improved support for memory-based streams made it
possible to inline small cidr:, pcre:, and regexp: maps in Postfix
parameter values, and to eliminate some ad-hoc code that converted
tlsproxy(8) protocol data to or from serialized form.
[Incompat 20220507] Most global/mkmap*.[hc] files are moved to the
util directory; only global/mkmap_proxy.* remains. The old file
organization was designed before support for dynamically-loadable
databases was added, and that code suffered from complexity.

View File

@ -0,0 +1,179 @@
This is the Postfix 3.7 (stable) release.
The stable Postfix release is called postfix-3.7.x where 3=major
release number, 7=minor release number, x=patchlevel. The stable
release never changes except for patches that address bugs or
emergencies. Patches change the patchlevel and the release date.
New features are developed in snapshot releases. These are called
postfix-3.8-yyyymmdd where yyyymmdd is the release date (yyyy=year,
mm=month, dd=day). Patches are never issued for snapshot releases;
instead, a new snapshot is released.
The mail_release_date configuration parameter (format: yyyymmdd)
specifies the release date of a stable release or snapshot release.
If you upgrade from Postfix 3.5 or earlier, read RELEASE_NOTES-3.6
before proceeding.
License change
---------------
This software is distributed with a dual license: in addition to the
historical IBM Public License 1.0, it is now also distributed with the
more recent Eclipse Public License 2.0. Recipients can choose to take
the software under the license of their choice. Those who are more
comfortable with the IPL can continue with that license.
Major changes - configuration
-----------------------------
[Feature 20210605] Support to inline the content of small cidr:,
pcre:, and regexp: tables in Postfix parameter values.
Example:
smtpd_forbidden_commands =
CONNECT GET POST regexp:{{/^[^A-Z]/ Thrash}}
This is the new smtpd_forbidden_commands default value. It will
immediately disconnect a remote SMTP client when a command does not
start with a letter (a-z or A-Z).
The basic syntax is:
/etc/postfix/main.cf:
parameter = .. map-type:{ { rule-1 }, { rule-2 } .. } ..
/etc/postfix/master.cf:
.. -o { parameter = .. map-type:{ { rule-1 }, { rule-2 } .. } .. } ..
where map-type is one of cidr, pcre, or regexp.
Postfix ignores whitespace after '{' and before '}', and writes each
rule as one text line to a nameless in-memory file:
in-memory file:
rule-1
rule-2
..
Postfix parses the result as if it is a file in /etc/postfix.
Note: if a rule contains $, specify $$ to keep Postfix from trying
to do $name expansion as it evaluates the parameter value.
Major changes - lmdb support
----------------------------
[Feature 20210605] Overhauled the LMDB client's error handling, and
added integration tests for future-proofing. There are no visible
changes in documented behavior.
Major changes - logging
-----------------------
[Feature 20210815] To make the maillog_file feature more useful,
the postlog(1) command is now set-gid postdrop, so that unprivileged
programs can use it to write logging through the postlogd(8) daemon.
This required hardening the postlog(1) command against privilege
escalation attacks. DO NOT turn on the set-gid bit with older
postlog(1) implementations.
Major changes - pcre2 support
-----------------------------
[Feature 20211127] Support for the pcre2 library (the legacy pcre
library is no longer maintained). The Postfix build procedure
automatically detects if the pcre2 library is installed, and if it
is unavailable, the Postfix build procedure will detect if the
legacy pcre library is installed. See PCRE_README if you need to
build Postfix with a specific library.
Visible differences: some error messages may have a different text,
and the 'X' pattern flag is no longer supported with pcre2.
Major changes - security
------------------------
[Feature 20220102] Postfix programs now randomize the initial state
of in-memory hash tables, to defend against hash collision attacks
involving a large number of attacker-chosen lookup keys. Presently,
the only known opportunity for such attacks involves remote SMTP
client IPv6 addresses in the anvil(8) service. The attack would
require making hundreds of short-lived connections per second from
thousands of different IP addresses, because the anvil(8) service
drops inactive counters after 100s. Other in-memory hash tables
with attacker-chosen lookup keys are by design limited in size. The
fix is cheap, and therefore implemented for all Postfix in-memory
hash tables. Problem reported by Pascal Junod.
[Feature 20211030] The postqueue command now sanitizes non-printable
characters (such as newlines) in strings before they are formatted
as json or as legacy output. These outputs are piped into other
programs that are run by administrative users. This closes a
hypothetical opportunity for privilege escalation.
[Feature 20210815] Updated defense against remote clients or servers
that 'trickle' SMTP or LMTP traffic, based on per-request deadlines
and minimum data rates.
Per-request deadlines:
The new {smtpd,smtp,lmtp}_per_request_deadline parameters replace
{smtpd,smtp,lmtp}_per_record_deadline, with backwards compatible
default settings. This defense is enabled by default in the Postfix
SMTP server in case of overload.
The new smtpd_per_record_deadline parameter limits the combined
time for the Postfix SMTP server to receive a request and to send
a response, while the new {smtp,lmtp}_per_record_deadline parameters
limit the combined time for the Postfix SMTP or LMTP client to send
a request and to receive a response.
Minimum data rates:
The new smtpd_min_data_rate parameter enforces a minimum plaintext
data transfer rate for DATA and BDAT requests, but only when
smtpd_per_record_deadline is enabled. After a read operation transfers
N plaintext bytes (possibly after TLS decryption), and after the
DATA or BDAT request deadline is decreased by the elapsed time of
that read operation, the DATA or BDAT request deadline is increased
by N/smtpd_min_data_rate seconds. However, the deadline is never
increased beyond the smtpd_timeout value. The default minimum data
rate is 500 (bytes/second) but is still subject to change.
The new {smtp,lmtp}_min_data_rate parameters enforce the corresponding
minimum DATA transfer rates for the Postfix SMTP and LMTP client.
Major changes - tls support
---------------------------
[Cleanup 20220121] The new tlsproxy_client_security_level parameter
replaces tlsproxy_client_level, and the new tlsproxy_client_policy_maps
parameter replaces tlsproxy_client_policy. This is for consistent
parameter naming (tlsproxy_client_xxx corresponds to smtp_tls_xxx).
This change was made with backwards-compatible default settings.
[Feature 20210926] Postfix was updated to support OpenSSL 3.0.0 API
features, and to work around OpenSSL 3.0.0 bit-rot (avoid using
deprecated API features).
Other code health
-----------------
[typos] Typo fixes by raf.
[pre-release checks] Added pre-release checks to detect a) new typos
in documentation and source-code comments, b) missing entries in
the postfix-files file (some documentation would not be installed),
c) missing rules in the postlink script (some text would not have
a hyperlink in documentation), and d) missing map-based $parameter
names in the proxy_read_maps default value (the proxymap daemon
would not automatically authorize some proxied maps).
[memory stream] Improved support for memory-based streams made it
possible to inline small cidr:, pcre:, and regexp: maps in Postfix
parameter values, and to eliminate some ad-hoc code that converted
tlsproxy(8) protocol data to or from serialized form.

View File

@ -6,23 +6,110 @@ Wish list:
Disable -DSNAPSHOT and -DNONPROD in makedefs.
Alias htable(3) calls to equivalent binhash(3) calls,
and obsolete the htable(3) module.
Scan Postfix code with github.com/googleprojectzero/weggli
(depends on "rust").
Investigate clang-format compatibility as a possible migration
away from indent. This requires that the output is stable.
Check out https://github.com/milter-manager/milter-manager/
Check out https://cutter.osdn.jp/ (C/C++ unit tests).
Follow https://github.com/vdukhovni/postfix/commits/rpk
Multi-recipient support in sender/recipient_bcc_maps and
always_bcc.
Test for dns_rr_copy() + dns_rr_free().
mail_conf_xxx supprt for non-negative numbers (i.e.
numbers with a lower bound of zero).
Log anvil transgressions with their address range (in
addition to the offending IP address. We should not disclose
to random clients how we aggregate anvil event counters.
Should "postconf -f" pretty-print text inside {}?
Is there any code that calls attr_scan*() and that works
when the number of attributes received < the expected number?
If there is no such code, then we can simplify a few things.
Update TLS_README diagram, tlsmgr no longer manages cert
info.
Consider renaming local_header_rewrite_clients to
local_header_canonicalize_clients, as a more accurate name.
Optionally support "local_header_canonicalize_classes =
rewrite_addresses, add_missing_headers" (default setting).
And ditto for remote_header_rewrite_domain, whether it
should rewrite address, add missing headers, or both.
Add weight factors to randmap, for example randmap:{{result1}*99,
{result2}*1}. To parse out weights, see postscreen.
randmap already allows randmap:{{result}, ...}, to support
whitespace and comma in result values, but it should also
extract the value from {}.
Migrate masquerade_domains from ARGV to STRING_LIST, or
deprecate this feature because it breaks table-driven address
validation.
Enforce var_line_limit in util/attr_scan*c. This is needed if
we want to expose Postfix RPC protocols externally.
Can tests use LD_PRELOAD to inject fake modules such as
fake_dns(3), fake_msg(3), fake_myaddrinfo(3) and so on?
One limitation is that functions etc. in a preloaded object
always take precedence, even in code that is not being
tested.
'%l' support, similar to %D in the Dovecot LDAP driver.
Subject: Feature request: '%l' expansion for ldap_table,
Date: Tue, 5 Apr 2022. Message-ID:
<ef7c661c-d86a-2366-6a73-ec8d51d75012@dev.snart.me>
WARN_IF_REJECT like prefix that disables the error counter increment.
Consider migrating Postfix server sockets from directory
$queue_directory/public to $queue_directory/protected. The
directory $queue_directory/public can then be used for
non-Postfix listeners (one subdirectory per application).
FILTER_README needs some text on multi-instance implementations,
and existing multi-instance references need to be updated.
Fix code that still uses "long" for data_size and data_offset,
and that uses "%ld" in sscanf().
and sscanf("%ld or strtou?l()). This seems relevant for 32-bit
systems. This would use a new REC_TYPE_OFFS with a corresponding
data type of off_t, using off_cvt() for conversion from string,
and new code to convert off_t to string.
A smart query service for live Postfix tables that outputs JSON?
If the idea is to introspect on a running Postfix system, this
involves adding an RPC endpoint to specific Postfix services.
That could work for single-instance services like qmgr, verify,
postscreen.
JSON logging?
default_transport_maps? This would simplify configuration.
Add a pointer to
https://fabianlee.org/2019/10/23/docker-running-a-postfix-container-for-testing-mail-during-development/
and https://github.com/docker-mailserver/docker-mailserver
Add a pointer to
https://github.com/tarickb/sasl-xoauth2 and/or
http://mmogilvi.users.sourceforge.net/software/oauthbearer.html
in documentation or on-line howtos.
Read http://mmogilvi.users.sourceforge.net/software/oauthbearer.html
and see how we can improve on the Postfix side.
Read the above links and see how we can improve usability on
the Postfix side.
Add verp=+= to the qmgr "from=" logging. This is already
implemented but not yet integrated.
@ -264,10 +351,6 @@ Wish list:
Maybe don't whitelist a client that has maxed out its
per-MTA connection count limit.
Inline support for pcre:{/pattern/=action, ...} and ditto
support for regexp: and cidr: tables. Factor out and reuse
code that already exists in inline: and other tables.
Log command=good/bad statistics in postscreen?
smtpd_checks tests either must use a DNS dummy resolver
@ -810,22 +893,6 @@ Wish list:
Cleanup: make DNSBL query format configurable beyond the
client's reversed IP address.
With 'final delivery' in the LMTP client, need an option
to also add delivered-to and other pipe(8) features. This
requires making mail_copy() functionality available in
non-mailbox context.
Cleanup: modernize the "add missing From: header" code, to
``phrase <addr>'' form. Most likely, quote the entire phrase
if it contains any text that is special, then rfc822_externalize
the whole thing.
SMTP server: make the server_addr and server_port available
to policy server, Dovecot, and perhaps Milters.
Med: local and remote source port and IP address for smtpd
policy hook.
Maybe change maps_rbl_reject_code default to 521, and
update wording in STRESS_README.
@ -838,15 +905,6 @@ Wish list:
Plan for time_t larger than long, or wait for LP64 to
dominate the world?
Make "AUTH=<>" appendage to MAIL FROM configurable, enabled
by default.
To support ternary operator without a huge parsing effort,
consider ${value?{xxx}:{yyy}} where ${name} is existing
syntax, and where ?{text} and :{text} are new syntax that
is unlikely to break existing configurations. Or perhaps
it's just too ugly.
Write delivery rate delay example (which _README?) and auth
failure cache example (SASL_README). Then include them in
SOHO_README.

View File

@ -108,16 +108,20 @@ decode: root
# with the RFC 822 standard.
#
# /file/name
# Mail is appended to /file/name. See local(8) for
# details of delivery to file. Delivery is not lim-
# ited to regular files. For example, to dispose of
# unwanted mail, deflect it to /dev/null.
# Mail is appended to /file/name. For details on how
# a file is written see the sections "EXTERNAL FILE
# DELIVERY" and "DELIVERY RIGHTS" in the local(8)
# documentation. Delivery is not limited to regular
# files. For example, to dispose of unwanted mail,
# deflect it to /dev/null.
#
# |command
# Mail is piped into command. Commands that contain
# special characters, such as whitespace, should be
# enclosed between double quotes. See local(8) for
# details of delivery to command.
# enclosed between double quotes. For details on how
# a command is executed see "EXTERNAL COMMAND DELIV-
# ERY" and "DELIVERY RIGHTS" in the local(8) documen-
# tation.
#
# When the command fails, a limited amount of command
# output is mailed back to the sender. The file
@ -218,18 +222,17 @@ decode: root
# the recipient_delimiter is set to "-".
#
# recipient_delimiter (empty)
# The set of characters that can separate a user name
# from its extension (example: user+foo), or a .for-
# ward file name from its extension (example: .for-
# ward+foo).
# The set of characters that can separate an email
# address localpart, user name, or a .forward file
# name from its extension.
#
# Available in Postfix version 2.3 and later:
#
# frozen_delivered_to (yes)
# Update the local(8) delivery agent's idea of the
# Delivered-To: address (see prepend_deliv-
# ered_header) only once, at the start of a delivery
# attempt; do not update the Delivered-To: address
# Update the local(8) delivery agent's idea of the
# Delivered-To: address (see prepend_deliv-
# ered_header) only once, at the start of a delivery
# attempt; do not update the Delivered-To: address
# while expanding aliases or .forward files.
#
# STANDARDS
@ -242,12 +245,12 @@ decode: root
# postconf(5), configuration parameters
#
# README FILES
# Use "postconf readme_directory" or "postconf html_direc-
# Use "postconf readme_directory" or "postconf html_direc-
# tory" to locate this information.
# DATABASE_README, Postfix lookup table overview
#
# LICENSE
# The Secure Mailer license must be distributed with this
# The Secure Mailer license must be distributed with this
# software.
#
# AUTHOR(S)

View File

@ -1,4 +1,4 @@
# $NetBSD: main.cf,v 1.1.1.6 2022/10/08 16:09:01 christos Exp $
# $NetBSD: main.cf,v 1.1.1.7 2023/12/23 20:24:48 christos Exp $
#
# Global Postfix configuration file. This file lists only a subset
# of all parameters. For the syntax, and for a complete parameter
@ -33,7 +33,7 @@
#
# The level below is what should be used with new (not upgrade) installs.
#
compatibility_level = 3.7
compatibility_level = 3.8
# SOFT BOUNCE
#

View File

@ -1,4 +1,4 @@
# $NetBSD: master.cf,v 1.1.1.9 2022/10/08 16:09:01 christos Exp $
# $NetBSD: master.cf,v 1.1.1.10 2023/12/23 20:24:48 christos Exp $
#
#
# Postfix master process configuration file. For details on the format
@ -23,6 +23,7 @@ smtp inet n - n - - smtpd
# -o smtpd_tls_security_level=encrypt
# -o smtpd_sasl_auth_enable=yes
# -o smtpd_tls_auth_only=yes
# -o local_header_rewrite_clients=static:all
# -o smtpd_reject_unlisted_recipient=no
# Instead of specifying complex smtpd_<xxx>_restrictions here,
# specify "smtpd_<xxx>_restrictions=$mua_<xxx>_restrictions"
@ -40,6 +41,7 @@ smtp inet n - n - - smtpd
# -o syslog_name=postfix/submissions
# -o smtpd_tls_wrappermode=yes
# -o smtpd_sasl_auth_enable=yes
# -o local_header_rewrite_clients=static:all
# -o smtpd_reject_unlisted_recipient=no
# Instead of specifying complex smtpd_<xxx>_restrictions here,
# specify "smtpd_<xxx>_restrictions=$mua_<xxx>_restrictions"

View File

@ -1,4 +1,4 @@
# $NetBSD: postfix-files,v 1.1.1.7 2022/10/08 16:09:01 christos Exp $
# $NetBSD: postfix-files,v 1.1.1.8 2023/12/23 20:24:48 christos Exp $
#
#
# Do not edit this file.
@ -439,6 +439,7 @@ $html_directory/postfix-manuals.html:f:root:-:644
$html_directory/postfix-tls.1.html:f:root:-:644
$html_directory/postfix-wrapper.5.html:f:root:-:644
$html_directory/postfix.1.html:f:root:-:644
$html_directory/postfix-doc.css:f:root:-:644
$html_directory/postkick.1.html:f:root:-:644
$html_directory/postlock.1.html:f:root:-:644
$html_directory/postlog.1.html:f:root:-:644

View File

@ -1,5 +1,5 @@
#!/bin/sh
# $NetBSD: postfix-script,v 1.1.1.5 2020/03/18 18:59:27 christos Exp $
# $NetBSD: postfix-script,v 1.1.1.6 2023/12/23 20:24:48 christos Exp $
#
#++
@ -330,7 +330,7 @@ check-warn)
# Check Postfix mail_owner-owned directory tree owner.
find `ls -d $queue_directory/* | \
egrep '/(saved|incoming|active|defer|deferred|bounce|hold|trace|corrupt|public|private|flush)$'` \
grep -E '/(saved|incoming|active|defer|deferred|bounce|hold|trace|corrupt|public|private|flush)$'` \
! \( -type p -o -type s \) ! -user $mail_owner \
-exec $WARN not owned by $mail_owner: {} \;

View File

@ -1,5 +1,5 @@
#!/bin/sh
# $NetBSD: postfix-tls-script,v 1.1.1.3 2022/10/08 16:09:01 christos Exp $
# $NetBSD: postfix-tls-script,v 1.1.1.4 2023/12/23 20:24:48 christos Exp $
#
#++
@ -180,9 +180,7 @@
# .IP "\fBsmtp_tls_loglevel (0)\fR"
# Enable additional Postfix SMTP client logging of TLS activity.
# .IP "\fBsmtp_tls_security_level (empty)\fR"
# The default SMTP TLS security level for the Postfix SMTP client;
# when a non-empty value is specified, this overrides the obsolete
# parameters smtp_use_tls, smtp_enforce_tls, and smtp_tls_enforce_peername.
# The default SMTP TLS security level for the Postfix SMTP client.
# .IP "\fBsmtp_tls_session_cache_database (empty)\fR"
# Name of the file containing the optional Postfix SMTP client
# TLS session cache.
@ -335,7 +333,7 @@ $postconf -T compile-version | grep . >/dev/null || {
}
rsa=
ecdsa=
for _algo in `$postconf -T public-key-algorithms | egrep '^(rsa|ecdsa)$'`
for _algo in `$postconf -T public-key-algorithms | grep -E '^(rsa|ecdsa)$'`
do
eval $_algo=$_algo
done
@ -417,7 +415,7 @@ pubkey_dgst() {
for cmd in ec rsa; do
$openssl $cmd -passin "pass:umask 077" -in "$1" -pubout |
$openssl $cmd -pubin -outform DER |
hex_sha256 | egrep -v "${null256}" && return 0
hex_sha256 | grep -E -v "${null256}" && return 0
done 2>/dev/null
return 1
}
@ -431,7 +429,7 @@ cert_pubkey_dgst() {
for cmd in ec rsa; do
$openssl x509 -pubkey -noout -in "$1" |
$openssl $cmd -pubin -outform DER |
hex_sha256 | egrep -v "${null256}" && return 0
hex_sha256 | grep -E -v "${null256}" && return 0
done 2>/dev/null
return 1
}

View File

@ -14,92 +14,95 @@
# The optional virtual(5) alias table rewrites recipient
# addresses for all local, all virtual, and all remote mail
# destinations. This is unlike the aliases(5) table which
# is used only for local(8) delivery. Virtual aliasing is
# recursive, and is implemented by the Postfix cleanup(8)
# daemon before mail is queued.
# is used only for local(8) delivery. This feature is imple-
# mented in the Postfix cleanup(8) daemon before mail is
# queued.
#
# Virtual aliasing is recursive; to terminate recursion for
# a specific address, alias that address to itself.
#
# The main applications of virtual aliasing are:
#
# o To redirect mail for one address to one or more
# o To redirect mail for one address to one or more
# addresses.
#
# o To implement virtual alias domains where all
# addresses are aliased to addresses in other
# o To implement virtual alias domains where all
# addresses are aliased to addresses in other
# domains.
#
# Virtual alias domains are not to be confused with
# the virtual mailbox domains that are implemented
# with the Postfix virtual(8) mail delivery agent.
# With virtual mailbox domains, each recipient
# Virtual alias domains are not to be confused with
# the virtual mailbox domains that are implemented
# with the Postfix virtual(8) mail delivery agent.
# With virtual mailbox domains, each recipient
# address can have its own mailbox.
#
# Virtual aliasing is applied only to recipient envelope
# addresses, and does not affect message headers. Use
# canonical(5) mapping to rewrite header and envelope
# Virtual aliasing is applied only to recipient envelope
# addresses, and does not affect message headers. Use
# canonical(5) mapping to rewrite header and envelope
# addresses in general.
#
# Normally, the virtual(5) alias table is specified as a
# text file that serves as input to the postmap(1) command.
# The result, an indexed file in dbm or db format, is used
# Normally, the virtual(5) alias table is specified as a
# text file that serves as input to the postmap(1) command.
# The result, an indexed file in dbm or db format, is used
# for fast searching by the mail system. Execute the command
# "postmap /etc/postfix/virtual" to rebuild an indexed file
# "postmap /etc/postfix/virtual" to rebuild an indexed file
# after changing the corresponding text file.
#
# When the table is provided via other means such as NIS,
# LDAP or SQL, the same lookups are done as for ordinary
# When the table is provided via other means such as NIS,
# LDAP or SQL, the same lookups are done as for ordinary
# indexed files.
#
# Alternatively, the table can be provided as a regu-
# lar-expression map where patterns are given as regular
# expressions, or lookups can be directed to a TCP-based
# server. In those case, the lookups are done in a slightly
# Alternatively, the table can be provided as a regu-
# lar-expression map where patterns are given as regular
# expressions, or lookups can be directed to a TCP-based
# server. In those case, the lookups are done in a slightly
# different way as described below under "REGULAR EXPRESSION
# TABLES" or "TCP-BASED TABLES".
#
# CASE FOLDING
# The search string is folded to lowercase before database
# lookup. As of Postfix 2.3, the search string is not case
# folded with database types such as regexp: or pcre: whose
# The search string is folded to lowercase before database
# lookup. As of Postfix 2.3, the search string is not case
# folded with database types such as regexp: or pcre: whose
# lookup fields can match both upper and lower case.
#
# TABLE FORMAT
# The input format for the postmap(1) command is as follows:
#
# pattern address, address, ...
# When pattern matches a mail address, replace it by
# When pattern matches a mail address, replace it by
# the corresponding address.
#
# blank lines and comments
# Empty lines and whitespace-only lines are ignored,
# as are lines whose first non-whitespace character
# Empty lines and whitespace-only lines are ignored,
# as are lines whose first non-whitespace character
# is a `#'.
#
# multi-line text
# A logical line starts with non-whitespace text. A
# line that starts with whitespace continues a logi-
# A logical line starts with non-whitespace text. A
# line that starts with whitespace continues a logi-
# cal line.
#
# TABLE SEARCH ORDER
# With lookups from indexed files such as DB or DBM, or from
# networked tables such as NIS, LDAP or SQL, each
# networked tables such as NIS, LDAP or SQL, each
# user@domain query produces a sequence of query patterns as
# described below.
#
# Each query pattern is sent to each specified lookup table
# before trying the next query pattern, until a match is
# Each query pattern is sent to each specified lookup table
# before trying the next query pattern, until a match is
# found.
#
# user@domain address, address, ...
# Redirect mail for user@domain to address. This
# Redirect mail for user@domain to address. This
# form has the highest precedence.
#
# user address, address, ...
# Redirect mail for user@site to address when site is
# equal to $myorigin, when site is listed in $mydes-
# tination, or when it is listed in $inet_interfaces
# equal to $myorigin, when site is listed in $mydes-
# tination, or when it is listed in $inet_interfaces
# or $proxy_interfaces.
#
# This functionality overlaps with the functionality
# This functionality overlaps with the functionality
# of the local aliases(5) database. The difference is
# that virtual(5) mapping can be applied to non-local
# addresses.
@ -108,18 +111,18 @@
# Redirect mail for other users in domain to address.
# This form has the lowest precedence.
#
# Note: @domain is a wild-card. With this form, the
# Postfix SMTP server accepts mail for any recipient
# in domain, regardless of whether that recipient
# exists. This may turn your mail system into a
# backscatter source: Postfix first accepts mail for
# non-existent recipients and then tries to return
# that mail as "undeliverable" to the often forged
# Note: @domain is a wild-card. With this form, the
# Postfix SMTP server accepts mail for any recipient
# in domain, regardless of whether that recipient
# exists. This may turn your mail system into a
# backscatter source: Postfix first accepts mail for
# non-existent recipients and then tries to return
# that mail as "undeliverable" to the often forged
# sender address.
#
# To avoid backscatter with mail for a wild-card
# To avoid backscatter with mail for a wild-card
# domain, replace the wild-card mapping with explicit
# 1:1 mappings, or add a reject_unverified_recipient
# 1:1 mappings, or add a reject_unverified_recipient
# restriction for that domain:
#
# smtpd_recipient_restrictions =
@ -129,19 +132,19 @@
# inline:{example.com=reject_unverified_recipient}
# unverified_recipient_reject_code = 550
#
# In the above example, Postfix may contact a remote
# server if the recipient is aliased to a remote
# In the above example, Postfix may contact a remote
# server if the recipient is aliased to a remote
# address.
#
# RESULT ADDRESS REWRITING
# The lookup result is subject to address rewriting:
#
# o When the result has the form @otherdomain, the
# result becomes the same user in otherdomain. This
# o When the result has the form @otherdomain, the
# result becomes the same user in otherdomain. This
# works only for the first address in a multi-address
# lookup result.
#
# o When "append_at_myorigin=yes", append "@$myorigin"
# o When "append_at_myorigin=yes", append "@$myorigin"
# to addresses without "@domain".
#
# o When "append_dot_mydomain=yes", append ".$mydomain"
@ -149,29 +152,29 @@
#
# ADDRESS EXTENSION
# When a mail address localpart contains the optional recip-
# ient delimiter (e.g., user+foo@domain), the lookup order
# ient delimiter (e.g., user+foo@domain), the lookup order
# becomes: user+foo@domain, user@domain, user+foo, user, and
# @domain.
#
# The propagate_unmatched_extensions parameter controls
# whether an unmatched address extension (+foo) is propa-
# The propagate_unmatched_extensions parameter controls
# whether an unmatched address extension (+foo) is propa-
# gated to the result of a table lookup.
#
# VIRTUAL ALIAS DOMAINS
# Besides virtual aliases, the virtual alias table can also
# Besides virtual aliases, the virtual alias table can also
# be used to implement virtual alias domains. With a virtual
# alias domain, all recipient addresses are aliased to
# alias domain, all recipient addresses are aliased to
# addresses in other domains.
#
# Virtual alias domains are not to be confused with the vir-
# tual mailbox domains that are implemented with the Postfix
# virtual(8) mail delivery agent. With virtual mailbox
# domains, each recipient address can have its own mailbox.
# domains, each recipient address can have its own mailbox.
#
# With a virtual alias domain, the virtual domain has its
# own user name space. Local (i.e. non-virtual) usernames
# are not visible in a virtual alias domain. In particular,
# local aliases(5) and local mailing lists are not visible
# With a virtual alias domain, the virtual domain has its
# own user name space. Local (i.e. non-virtual) usernames
# are not visible in a virtual alias domain. In particular,
# local aliases(5) and local mailing lists are not visible
# as localname@virtual-alias.domain.
#
# Support for a virtual alias domain looks like:
@ -180,7 +183,7 @@
# virtual_alias_maps = hash:/etc/postfix/virtual
#
# Note: some systems use dbm databases instead of hash. See
# the output from "postconf -m" for available database
# the output from "postconf -m" for available database
# types.
#
# /etc/postfix/virtual:
@ -189,81 +192,81 @@
# user1@virtual-alias.domain address1
# user2@virtual-alias.domain address2, address3
#
# The virtual-alias.domain anything entry is required for a
# The virtual-alias.domain anything entry is required for a
# virtual alias domain. Without this entry, mail is rejected
# with "relay access denied", or bounces with "mail loops
# with "relay access denied", or bounces with "mail loops
# back to myself".
#
# Do not specify virtual alias domain names in the main.cf
# Do not specify virtual alias domain names in the main.cf
# mydestination or relay_domains configuration parameters.
#
# With a virtual alias domain, the Postfix SMTP server
# accepts mail for known-user@virtual-alias.domain, and
# rejects mail for unknown-user@virtual-alias.domain as
# With a virtual alias domain, the Postfix SMTP server
# accepts mail for known-user@virtual-alias.domain, and
# rejects mail for unknown-user@virtual-alias.domain as
# undeliverable.
#
# Instead of specifying the virtual alias domain name via
# the virtual_alias_maps table, you may also specify it via
# Instead of specifying the virtual alias domain name via
# the virtual_alias_maps table, you may also specify it via
# the main.cf virtual_alias_domains configuration parameter.
# This latter parameter uses the same syntax as the main.cf
# This latter parameter uses the same syntax as the main.cf
# mydestination configuration parameter.
#
# REGULAR EXPRESSION TABLES
# This section describes how the table lookups change when
# This section describes how the table lookups change when
# the table is given in the form of regular expressions. For
# a description of regular expression lookup table syntax,
# a description of regular expression lookup table syntax,
# see regexp_table(5) or pcre_table(5).
#
# Each pattern is a regular expression that is applied to
# Each pattern is a regular expression that is applied to
# the entire address being looked up. Thus, user@domain mail
# addresses are not broken up into their user and @domain
# addresses are not broken up into their user and @domain
# constituent parts, nor is user+foo broken up into user and
# foo.
#
# Patterns are applied in the order as specified in the ta-
# ble, until a pattern is found that matches the search
# Patterns are applied in the order as specified in the ta-
# ble, until a pattern is found that matches the search
# string.
#
# Results are the same as with indexed file lookups, with
# the additional feature that parenthesized substrings from
# Results are the same as with indexed file lookups, with
# the additional feature that parenthesized substrings from
# the pattern can be interpolated as $1, $2 and so on.
#
# TCP-BASED TABLES
# This section describes how the table lookups change when
# This section describes how the table lookups change when
# lookups are directed to a TCP-based server. For a descrip-
# tion of the TCP client/server lookup protocol, see tcp_ta-
# ble(5). This feature is available in Postfix 2.5 and
# ble(5). This feature is available in Postfix 2.5 and
# later.
#
# Each lookup operation uses the entire address once. Thus,
# user@domain mail addresses are not broken up into their
# user@domain mail addresses are not broken up into their
# user and @domain constituent parts, nor is user+foo broken
# up into user and foo.
#
# Results are the same as with indexed file lookups.
#
# BUGS
# The table format does not understand quoting conventions.
# The table format does not understand quoting conventions.
#
# CONFIGURATION PARAMETERS
# The following main.cf parameters are especially relevant
# to this topic. See the Postfix main.cf file for syntax
# details and for default values. Use the "postfix reload"
# The following main.cf parameters are especially relevant
# to this topic. See the Postfix main.cf file for syntax
# details and for default values. Use the "postfix reload"
# command after a configuration change.
#
# virtual_alias_maps ($virtual_maps)
# Optional lookup tables that alias specific mail
# addresses or domains to other local or remote
# Optional lookup tables that alias specific mail
# addresses or domains to other local or remote
# addresses.
#
# virtual_alias_domains ($virtual_alias_maps)
# Postfix is the final destination for the specified
# Postfix is the final destination for the specified
# list of virtual alias domains, that is, domains for
# which all addresses are aliased to addresses in
# which all addresses are aliased to addresses in
# other local or remote domains.
#
# propagate_unmatched_extensions (canonical, virtual)
# What address lookup tables copy an address exten-
# What address lookup tables copy an address exten-
# sion from the lookup key to the lookup result.
#
# Other parameters of interest:
@ -274,23 +277,23 @@
#
# mydestination ($myhostname, localhost.$mydomain, local-
# host)
# The list of domains that are delivered via the
# The list of domains that are delivered via the
# $local_transport mail delivery transport.
#
# myorigin ($myhostname)
# The domain name that locally-posted mail appears to
# come from, and that locally posted mail is deliv-
# come from, and that locally posted mail is deliv-
# ered to.
#
# owner_request_special (yes)
# Enable special treatment for owner-listname entries
# in the aliases(5) file, and don't split owner-list-
# name and listname-request address localparts when
# name and listname-request address localparts when
# the recipient_delimiter is set to "-".
#
# proxy_interfaces (empty)
# The network interface addresses that this mail sys-
# tem receives mail on by way of a proxy or network
# tem receives mail on by way of a proxy or network
# address translation unit.
#
# SEE ALSO
@ -300,14 +303,14 @@
# canonical(5), canonical address mapping
#
# README FILES
# Use "postconf readme_directory" or "postconf html_direc-
# Use "postconf readme_directory" or "postconf html_direc-
# tory" to locate this information.
# ADDRESS_REWRITING_README, address rewriting guide
# DATABASE_README, Postfix lookup table overview
# VIRTUAL_README, domain hosting guide
#
# LICENSE
# The Secure Mailer license must be distributed with this
# The Secure Mailer license must be distributed with this
# software.
#
# AUTHOR(S)

View File

@ -8,6 +8,7 @@
<title>Postfix Address Classes </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>
@ -50,10 +51,11 @@ address classes are very important for the operation of Postfix. </p>
<ul>
<li> <p> The list of domains that are a member of the class: for
example, all <a href="ADDRESS_CLASS_README.html#local_domain_class">local domains</a>, or all <a href="ADDRESS_CLASS_README.html#relay_domain_class">relay domains</a>. </p>
<li> <p> The list of domains that are a member of that address
class: for example, all <a href="ADDRESS_CLASS_README.html#local_domain_class">local domains</a>, or all <a href="ADDRESS_CLASS_README.html#relay_domain_class">relay domains</a>. </p>
<li> <p> The default delivery transport. For example, the local,
<li> <p> The default delivery transport for that address class. For
example, the local,
virtual or relay delivery transport (delivery transports are defined
in <a href="master.5.html">master.cf</a>). This helps to keep Postfix configurations simple,
by avoiding the need for explicit routing information in transport
@ -80,7 +82,8 @@ are. </p>
<li> <p> Purpose: final delivery for traditional UNIX system accounts
and traditional Sendmail-style aliases. This is typically used for
the <a href="VIRTUAL_README.html#canonical">canonical domains</a> of the machine. For a discussion of the
the <a href="VIRTUAL_README.html#canonical">canonical domains</a> of the machine (for example, $<a href="postconf.5.html#myhostname">myhostname</a>,
$<a href="postconf.5.html#mydomain">mydomain</a>). For a discussion of the
difference between <a href="VIRTUAL_README.html#canonical">canonical domains</a>, <a href="VIRTUAL_README.html#canonical">hosted domains</a> and other
domains, see the <a href="VIRTUAL_README.html">VIRTUAL_README</a> file. </p>
@ -108,7 +111,8 @@ class. </p>
<ul>
<li> <p> Purpose: <a href="VIRTUAL_README.html#canonical">hosted domains</a> where each recipient address is
aliased to a local UNIX system account or to a remote address. A
aliased to an address in a different domain, for example, a local
UNIX system account or a remote address. A
<a href="VIRTUAL_README.html#virtual_alias">virtual alias example</a> is given in the <a href="VIRTUAL_README.html">VIRTUAL_README</a> file. </p>
<li> <p> Domain names are listed in <a href="postconf.5.html#virtual_alias_domains">virtual_alias_domains</a>. The
@ -121,7 +125,7 @@ parameter. The Postfix SMTP server rejects invalid recipients with
$<a href="postconf.5.html#virtual_maps">virtual_maps</a> for Postfix 1.1 compatibility. </p>
<li> <p> There is no mail delivery transport parameter. Every
address must be aliased to some other address. </p>
address must be aliased to an address in some other domain. </p>
</ul>
@ -223,9 +227,9 @@ is needed to keep undeliverable mail (and bounced undeliverable
mail) out of the mail queue. This is controlled by the
<a href="postconf.5.html#smtpd_reject_unlisted_recipient">smtpd_reject_unlisted_recipient</a> configuration parameter. </p>
<li> <p> As of Postfix version 2.1, the SMTP server also rejects
<li> <p> As of Postfix version 2.1, the SMTP server can also reject
unknown sender addresses (i.e. addresses that it would reject as
unknown recipient addresses). Sender "egress filtering" can help
an unknown recipient addresses). Sender "egress filtering" can help
to slow down an email worm explosion. This is controlled by the
<a href="postconf.5.html#smtpd_reject_unlisted_sender">smtpd_reject_unlisted_sender</a> configuration parameter. </p>

View File

@ -8,6 +8,7 @@
<title>Postfix Address Rewriting </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix Address Verification </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix Backscatter Howto</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title> Postfix Basic Configuration </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>
@ -523,7 +524,7 @@ idea to run every night before the syslog files are rotated: </p>
<blockquote>
<pre>
# postfix check
# egrep '(reject|warning|error|fatal|panic):' /some/log/file
# grep -E '(reject|warning|error|fatal|panic):' /some/log/file
</pre>
</blockquote>

View File

@ -8,6 +8,7 @@
<title>Postfix BDAT (CHUNKING) support</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix Built-in Content Inspection</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix CDB Howto</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix Backwards-Compatibility Safety Net</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix Connection Cache </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix Content Inspection </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix Lookup Table Overview</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix Berkeley DB Howto</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title> Postfix Debugging Howto </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>
@ -92,7 +93,7 @@ properly: </p>
<blockquote>
<pre>
% <b>egrep '(warning|error|fatal|panic):' /some/log/file | more</b>
% <b>grep -E '(warning|error|fatal|panic):' /some/log/file | more</b>
</pre>
</blockquote>

View File

@ -8,6 +8,7 @@
<title>Postfix DSN Support </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix ETRN Howto</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix After-Queue Content Filter </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>TLS Forward Secrecy in Postfix</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>
@ -112,10 +113,7 @@ sends a random "pre-master secret" to the server encrypted with the
server's RSA public key. The server decrypts this with its private
key, and uses it together with other data exchanged in the clear
to generate the session key. An attacker with access to the server's
private key can perform the same computation at any later time.
The TLS library in Windows XP and Windows Server 2003 only supported
cipher suites of this type, and Exchange 2003 servers largely do
not support forward secrecy. </p>
private key can perform the same computation at any later time. </p>
<p> Later revisions to the TLS protocol introduced forward-secrecy
cipher suites in which the client and server implement a key exchange
@ -130,35 +128,26 @@ Presently, there are two flavors of "groups" that work with PFS: </p>
<ul>
<li> <p> <b> Prime-field groups (EDH):</b> The server needs to be
configured with a suitably-large prime and a corresponding "generator".
The acronym for forward secrecy over prime fields is EDH for Ephemeral
Diffie-Hellman (also abbreviated as DHE).
</p>
<li> <p> <b>FFDHE:</b> Finite-field Diffie-Hellman ephemeral key
exchange groups (also EDH or DHE). The server needs to be configured
with a suitably-large prime and a corresponding "generator". Standard
choices of the prime and generator are specified in <a href="https://tools.ietf.org/html/rfc7919">RFC7919</a>, and can be
used in the TLS 1.3 protocol with the server and client negotiating a
mutually supported choice. In earlier versions of TLS (1.0 through
1.2), when FFDHE key exchange is performed, the server chooses the prime
and generator unilaterally. </p>
<li> <p> <b> Elliptic-curve groups (EECDH): </b> The server needs
to be configured with a "named curve". These offer better security
at lower computational cost than prime field groups, but are not
as widely implemented. The acronym for the elliptic curve version
is EECDH which is short for Ephemeral Elliptic Curve Diffie-Hellman
(also abbreviated as ECDHE). </p>
<li> <p> <b>EECDH:</b> This is short for Ephemeral Elliptic Curve
Diffie-Hellman (also abbreviated as ECDHE). EECDH offers better
security at lower computational cost than FFDHE. Elliptic curves used
in cryptography are typically identified by a "name" that stands for a
set of well-known parameter values, and it is these "named curves" (or,
in certificates, associated ASN.1 object identifiers) that are used in
the TLS protocol. When EECDH key exchange is used, a mutually supported
named curve is negotiated as part of the TLS handshake. </p>
</ul>
<p> It is not essential to know what these are, but one does need
to know that OpenSSL supports EECDH with version 1.0.0 or later.
Thus the configuration parameters related to Elliptic-Curve forward
secrecy are available when Postfix is linked with OpenSSL &ge; 1.0.0
(provided EC support has not been disabled by the vendor, as in
some versions of RedHat Linux). </p>
<p> Elliptic curves used in cryptography are typically identified
by a "name" that stands for a set of well-known parameter values,
and it is these "names" (or associated ASN.1 object identifiers)
that are used in the TLS protocol. On the other hand, with TLS there
are no specially designated prime field groups, so each server is
free to select its own suitably-strong prime and generator. </p>
<h2><a name="server_fs">Forward Secrecy in the Postfix SMTP Server</a></h2>
<p> The Postfix &ge; 2.2 SMTP server supports forward secrecy in
@ -167,108 +156,52 @@ suites with forward secrecy, then the traffic between the server
and client will resist decryption even if the server's long-term
authentication keys are <i>later</i> compromised. </p>
<p> Some remote SMTP clients may support forward secrecy, but prefer
cipher suites <i>without</i> forward secrecy. In that case, Postfix
&ge; 2.8 could be configured to ignore the client's preference with
the <a href="postconf.5.html">main.cf</a> setting "<a href="postconf.5.html#tls_preempt_cipherlist">tls_preempt_cipherlist</a> = yes". However, this
will likely cause interoperability issues with older Exchange servers
and is not recommended for now. </p>
<p> Most remote SMTP clients now support forward secrecy (the only
choice as of TLS 1.3), but some may prefer cipher suites <i>without</i>
forward secrecy. Postfix &ge; 2.8 servers can be configured to override
the client's preference by setting "<a href="postconf.5.html#tls_preempt_cipherlist">tls_preempt_cipherlist</a> = yes". </p>
<h3> EDH Server support </h3>
<h3> FFDHE Server support </h3>
<p> Postfix &ge; 2.2 supports 1024-bit-prime EDH out of the box,
with no additional configuration, but you may want to override the
default prime to be 2048 bits long, and you may want to regenerate
your primes periodically. See the <a href="#quick-start">quick-start</a>
section for details. With Postfix &ge; 3.1 the out of the box
(compiled-in) EDH prime size is 2048 bits. </p>
<p> Postfix &ge; 3.1 supports 2048-bit-prime FFDHE out of the box, with
no additional configuration. You can also generate your own FFDHE
parameters, but this is not necessary and no longer recommended. See
the <a href="#quick-start">quick-start</a> section for details. </p>
<p> With prime-field EDH, OpenSSL wants the server to provide
two explicitly-selected (prime, generator) combinations. One for
the now long-obsolete "export" cipher suites, and another for
non-export cipher suites. Postfix has two such default combinations
compiled in, but also supports explicitly-configured overrides.
</p>
<ul>
<li> <p> The "export" EDH parameters are used only with the obsolete
"export" ciphers. To use a non-default prime, generate a 512-bit
DH parameter file and set <a href="postconf.5.html#smtpd_tls_dh512_param_file">smtpd_tls_dh512_param_file</a> to the filename
(see the <a href="#quick-start">quick-start</a> section for details).
With Postfix releases after the middle of 2015 the default opportunistic
TLS cipher grade (<a href="postconf.5.html#smtpd_tls_ciphers">smtpd_tls_ciphers</a>) is "medium" or stronger, and
export ciphers are no longer used. </p>
<li> <p> The non-export EDH parameters are used for all other EDH
cipher suites. To use a non-default prime, generate a 1024-bit or
2048-bit DH parameter file and set <a href="postconf.5.html#smtpd_tls_dh1024_param_file">smtpd_tls_dh1024_param_file</a> to
the filename. Despite the name this is simply the non-export
parameter file and the prime need not actually be 1024 bits long
(see the <a href="#quick-start">quick-start</a> section for details).
</p>
</ul>
<p> As of mid-2015, SMTP clients are starting to reject TLS
handshakes with primes smaller than 2048 bits. Each site needs to
determine which prime size works best for the majority of its
clients. See the <a href="#quick-start">quick-start</a> section
for the recommended configuration to work around this issue. </p>
<p> Postfix &ge; 3.8 supports the finite-field Diffie-Hellman ephemeral
(FFDHE) key exchange group negotiation API of OpenSSL &ge; 3.0. FFDHE
groups are explicitly negotiated between client and server starting with
TLS 1.3. In earlier TLS versions, the server chooses the group
unilaterally. The list of candidate FFDHE groups can be configured via
"<a href="postconf.5.html#tls_ffdhe_auto_groups">tls_ffdhe_auto_groups</a>", which can be used to select a prioritized list
of supported groups (most preferred first) on both the server and
client. The default list is suitable for most users. Either, but not
both of "<a href="postconf.5.html#tls_eecdh_auto_curves">tls_eecdh_auto_curves</a>" and "<a href="postconf.5.html#tls_ffdhe_auto_groups">tls_ffdhe_auto_groups</a>" may be set
empty, disabling either EC or FFDHE key exchange in OpenSSL 3.0 with TLS
1.3. That said, interoperability will be poor if the EC curves are
all disabled or don't include the most widely used curves. </p>
<h3> EECDH Server support </h3>
<p> Postfix &ge; 2.6 supports NIST P-256 EECDH when built with OpenSSL
&ge; 1.0.0. When the remote SMTP client also supports EECDH and
implements the P-256 curve, forward secrecy just works. </p>
<blockquote> <p> Note: With Postfix 2.6 and 2.7, enable EECDH by
setting the <a href="postconf.5.html">main.cf</a> parameter <a href="postconf.5.html#smtpd_tls_eecdh_grade">smtpd_tls_eecdh_grade</a> to "strong".
</p> </blockquote>
<p> The elliptic curve standards are evolving, with new curves
introduced in <a href="https://tools.ietf.org/html/rfc8031">RFC 8031</a> to augment or replace the NIST curves tarnished
by the Snowden revelations. Fortunately, TLS clients advertise
their list of supported curves to the server so that servers can
choose newer stronger curves when mutually supported. OpenSSL 1.0.2
released in January 2015 was the first release to implement negotiation
of supported curves in TLS servers. In older OpenSSL releases, the
server is limited to selecting a single widely supported curve. </p>
<p> With Postfix prior to 3.2 or OpenSSL prior to 1.0.2, only a
single server-side curve can be configured, by specifying a suitable
EECDH "grade": </p>
<blockquote>
<pre>
<a href="postconf.5.html#smtpd_tls_eecdh_grade">smtpd_tls_eecdh_grade</a> = strong | ultra
# Underlying curves, best not changed:
# <a href="postconf.5.html#tls_eecdh_strong_curve">tls_eecdh_strong_curve</a> = prime256v1
# <a href="postconf.5.html#tls_eecdh_ultra_curve">tls_eecdh_ultra_curve</a> = secp384r1
</pre>
</blockquote>
<p> Postfix &ge; 3.2 supports the curve negotiation API of OpenSSL
&ge; 1.0.2. When using this software combination, the default setting
of "<a href="postconf.5.html#smtpd_tls_eecdh_grade">smtpd_tls_eecdh_grade</a>" changes to "auto", which selects a curve
that is supported by both the server and client. The list of
candidate curves can be configured via "<a href="postconf.5.html#tls_eecdh_auto_curves">tls_eecdh_auto_curves</a>",
which can be used to configure a prioritized list of supported
curves (most preferred first) on both the server and client.
The default list is suitable for most users. </p>
<p> As of Postfix 3.2 and OpenSSL 1.0.2, a range of supported EECDH
curves is enabled in the server and client, and a suitable mutually
supported curve is negotiated as part of the TLS handshake. The list of
supported curves is configurable via the "<a href="postconf.5.html#tls_eecdh_auto_curves">tls_eecdh_auto_curves</a>"
parameter. With TLS 1.2 the server needs to leave its setting of
"<a href="postconf.5.html#smtpd_tls_eecdh_grade">smtpd_tls_eecdh_grade</a>" at the default value of "auto" (earlier choices
of an explicit single curve grade are deprecated). With TLS 1.3, the
"<a href="postconf.5.html#smtpd_tls_eecdh_grade">smtpd_tls_eecdh_grade</a>" parameter is not used, and curve selection is
unconditionally negotiated. </p>
<h2> <a name="client_fs">Forward Secrecy in the Postfix SMTP Client</a> </h2>
<p> The Postfix &ge; 2.2 SMTP client supports forward secrecy in
its default configuration. All supported OpenSSL releases support
EDH key exchange. OpenSSL releases &ge; 1.0.0 also support EECDH
key exchange (provided elliptic-curve support has not been disabled
by the vendor as in some versions of RedHat Linux). If the
remote SMTP server supports cipher suites with forward secrecy (and
does not override the SMTP client's cipher preference), then the
traffic between the server and client will resist decryption even
if the server's long-term authentication keys are <i>later</i>
compromised. </p>
<p> The Postfix &ge; 2.2 SMTP client supports forward secrecy in its
default configuration. All supported OpenSSL releases support both
FFDHE and EECDH key exchange. If the remote SMTP server supports cipher
suites with forward secrecy (and does not override the SMTP client's
cipher preference), then the traffic between the server and client will
resist decryption even if the server's long-term authentication keys are
<i>later</i> compromised. Forward secrecy is always on in TLS 1.3. </p>
<p> Postfix &ge; 3.2 supports the curve negotiation API of OpenSSL
&ge; 1.0.2. The list of candidate curves can be changed via the
@ -277,23 +210,21 @@ to select a prioritized list of supported curves (most preferred
first) on both the Postfix SMTP server and SMTP client. The default
list is suitable for most users. </p>
<p> The default Postfix SMTP client cipher lists are correctly
ordered to prefer EECDH and EDH cipher suites ahead of similar
cipher suites that don't implement forward secrecy. Administrators
are strongly discouraged from changing the cipher list definitions. </p>
<p> Postfix &ge; 3.8 supports the finite-field Diffie-Hellman ephemeral
(FFDHE) key exchange group negotiation API of OpenSSL &ge; 3.0.
The list of candidate FFDHE groups can be configured via
"<a href="postconf.5.html#tls_ffdhe_auto_groups">tls_ffdhe_auto_groups</a>", which can be used to select a prioritized list
of supported groups (most preferred first) on both the server and
client. The default list is suitable for most users. </p>
<p> The default minimum cipher grade for opportunistic TLS is
"medium" for Postfix releases after the middle of 2015, "export"
for older releases. Changing the minimum cipher grade does not
change the cipher preference order. Note that cipher grades higher
than "medium" exclude Exchange 2003 and likely other MTAs, thus a
"high" cipher grade should be chosen only on a case-by-case basis
via the <a href="TLS_README.html#client_tls_policy">TLS policy</a>
table. </p>
<p> The default Postfix SMTP client cipher lists are correctly ordered
to prefer EECDH and FFDHE cipher suites ahead of similar cipher suites
that don't implement forward secrecy. Administrators are strongly
discouraged from changing the cipher list definitions. </p>
<h2><a name="quick-start">Getting started, quick and dirty</a></h2>
<h3> EECDH Client support (Postfix &ge; 2.2 with OpenSSL &ge; 1.0.0) </h3>
<h3> EECDH Client support (Postfix &ge; 3.2 with OpenSSL &ge; 1.1.1) </h3>
<p> This works "out of the box" with no need for additional
configuration. </p>
@ -305,96 +236,52 @@ to select a prioritized list of supported curves (most preferred
first) on both the Postfix SMTP server and SMTP client. The default
list is suitable for most users. </p>
<h3> EECDH Server support (Postfix &ge; 2.6 with OpenSSL &ge; 1.0.0) </h3>
<h3> EECDH Server support (Postfix &ge; 3.2 with OpenSSL &ge; 1.1.1) </h3>
<p> With Postfix 2.6 and 2.7, enable elliptic-curve support in the
Postfix SMTP server. This is the default with Postfix
&ge; 2.8. Note, however, that elliptic-curve support may be disabled
by the vendor, as in some versions of RedHat Linux. </p>
<p> This works "out of the box" with no need for additional
configuration. </p>
<blockquote>
<pre>
/etc/postfix/<a href="postconf.5.html">main.cf</a>:
# Postfix 2.6 &amp; 2.7 only. EECDH is on by default with Postfix &ge; 2.8.
# The default grade is "auto" with Postfix &ge; 3.2.
<a href="postconf.5.html#smtpd_tls_eecdh_grade">smtpd_tls_eecdh_grade</a> = strong
</pre>
</blockquote>
<p> Postfix &ge; 3.2 supports the curve negotiation API of OpenSSL
&ge; 1.0.2. The list of candidate curves can be changed via the
"<a href="postconf.5.html#tls_eecdh_auto_curves">tls_eecdh_auto_curves</a>" configuration parameter, which can be used
to select a prioritized list of supported curves (most preferred
first) on both the Postfix SMTP server and SMTP client. The default
list is suitable for most users. </p>
<h3> EDH Client support (Postfix &ge; 2.2, all supported OpenSSL
<h3> FFDHE Client support (Postfix &ge; 3.2, OpenSSL &ge; 1.1.1) </h3>
<p> In Postfix &lt; 3.8, or OpenSSL prior to 3.0, FFDHE for TLS 1.2 or
below works "out of the box", no additional configuration is necessary.
The most one can do is (not advisable) disable all "kDHE" ciphers, which
would then disable FFDHE key exchange in TLS 1.2 and below. </p>
<p> With OpenSSL 1.1.1, FFDHE is not supported for TLS 1.3, which uses
only EECDH key exchange. Support for FFDHE with TLS 1.3 was added in
OpenSSL 3.0. With OpenSSL 3.0 and Postfix 3.8 the list of supported TLS
1.3 FFDHE groups becomes configurable via the "<a href="postconf.5.html#tls_ffdhe_auto_groups">tls_ffdhe_auto_groups</a>"
parameter, which can be set empty to disable FFDHE in TLS 1.3, or
conversely expanded to support more groups. The default should work
well for most users. </p>
<h3> FFDHE Server support (Postfix &ge; 2.2, all supported OpenSSL
versions) </h3>
<p> This works "out of the box" without additional configuration. </p>
<p> In Postfix &lt; 3.8, or OpenSSL prior to 3.0, FFDHE for TLS 1.2 or
below works "out of the box", no additional configuration is necessary.
One can of course (not advisable) disable all "kDHE" ciphers, which
would then disable FFDHE key exchange in TLS 1.2 and below. </p>
<h3> EDH Server support (Postfix &ge; 2.2, all supported OpenSSL
versions) </h3>
<p> The built-in default Postfix FFDHE group is a 2048-bit group as of
Postfix 3.1. You can optionally generate non-default Postfix SMTP
server FFDHE parameters for possibly improved security against
pre-computation attacks, but this is not necessary or recommended. Just
leave "<a href="postconf.5.html#smtpd_tls_dh1024_param_file">smtpd_tls_dh1024_param_file</a>" at its default empty value. </p>
<p> Optionally generate non-default Postfix SMTP server EDH parameters
for improved security against pre-computation attacks and for
compatibility with Debian-patched Exim SMTP clients that require a
&ge; 2048-bit length for the non-export prime. </p>
<p> With Postfix &ge; 3.7 built against OpenSSL version is 3.0.0 or later, when
the value of <a href="postconf.5.html#smtpd_tls_dh1024_param_file">smtpd_tls_dh1024_param_file</a> is either empty or "<b>auto</b>", the
EDH parameter selection is delegated to the OpenSSL library, which selects
appropriate parameters based on the TLS handshake. This choice is likely to be
the most interoperable with SMTP clients using various TLS libraries, and
custom local parameters are no longer recommended when using Postfix &ge; 3.7
built against OpenSSL 3.0.0. Just leave <a href="postconf.5.html#smtpd_tls_dh1024_param_file">smtpd_tls_dh1024_param_file</a> at its
default value (both in <a href="postconf.5.html">main.cf</a>(5) and any <a href="master.5.html">master.cf</a>(5) overrides, and let
OpenSSL do the work. </p>
<p> Otherwise, execute as root (prime group generation can take a
few seconds to a few minutes): </p>
<blockquote>
<pre>
# cd /etc/postfix
# umask 022
# openssl dhparam -out dh512.tmp 512 &amp;&amp; mv dh512.tmp dh512.pem
# openssl dhparam -out dh1024.tmp 1024 &amp;&amp; mv dh1024.tmp dh1024.pem
# openssl dhparam -out dh2048.tmp 2048 &amp;&amp; mv dh2048.tmp dh2048.pem
# chmod 644 dh512.pem dh1024.pem dh2048.pem
</pre>
</blockquote>
<p> The Postfix SMTP server EDH parameter files are not secret,
after all these parameters are sent to all remote SMTP clients in
the clear. Mode 0644 is appropriate. </p>
<p> You can improve security against pre-computation attacks further
by regenerating the Postfix SMTP server EDH parameters periodically
(an hourly or daily cron job running the above commands as root can
automate this task). </p>
<p> Once the parameters are in place, update <a href="postconf.5.html">main.cf</a> as follows: </p>
<blockquote>
<pre>
/etc/postfix/<a href="postconf.5.html">main.cf</a>:
<a href="postconf.5.html#smtpd_tls_dh1024_param_file">smtpd_tls_dh1024_param_file</a> = ${<a href="postconf.5.html#config_directory">config_directory</a>}/dh2048.pem
<a href="postconf.5.html#smtpd_tls_dh512_param_file">smtpd_tls_dh512_param_file</a> = ${<a href="postconf.5.html#config_directory">config_directory</a>}/dh512.pem
</pre>
</blockquote>
<p> If some of your MSA clients don't support 2048-bit EDH, you may
need to adjust the submission entry in <a href="master.5.html">master.cf</a> accordingly: </p>
<blockquote>
<pre>
/etc/postfix/<a href="master.5.html">master.cf</a>:
submission inet n - n - - smtpd
# Some submission clients may not yet do 2048-bit EDH, if such
# clients use your MSA, configure 1024-bit EDH instead. However,
# as of mid-2015, many submission clients no longer accept primes
# with less than 2048-bits. Each site needs to determine which
# type of client is more important to support.
-o <a href="postconf.5.html#smtpd_tls_dh1024_param_file">smtpd_tls_dh1024_param_file</a>=${<a href="postconf.5.html#config_directory">config_directory</a>}/dh1024.pem
-o <a href="postconf.5.html#smtpd_tls_security_level">smtpd_tls_security_level</a>=encrypt
-o <a href="postconf.5.html#smtpd_sasl_auth_enable">smtpd_sasl_auth_enable</a>=yes
...
</pre>
</blockquote>
<p> The set of FFDHE groups enabled for use with TLS 1.3 becomes
configurable with Postfix &ge; 3.8 and OpenSSL &ge; 3.0. The default
setting of "<a href="postconf.5.html#tls_ffdhe_auto_groups">tls_ffdhe_auto_groups</a>" enables the <a href="https://tools.ietf.org/html/rfc7919">RFC7919</a> 2048 and 3072-bit
groups. If you need more security, you should probably be using EECDH.
</p>
<h2><a name="test">How can I see that a connection has forward
secrecy? </a> </h2>

View File

@ -8,6 +8,7 @@
<title>Postfix Installation From Source Code </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>
@ -710,7 +711,7 @@ use: </p>
<blockquote>
<pre>
$ make makefiles CCARGS='-DDEF_CONFIG_DIR=\"/some/where\"'
$ make makefiles CCARGS="-DDEF_CONFIG_DIR=\\\"/some/where\\\""
$ make
</pre>
</blockquote>
@ -837,7 +838,7 @@ unreachable code. </td> </tr>
<tr> <td> </td> <td> -DNO_IPV6 </td> <td> Do not build with IPv6
support. By default, IPv6 support is compiled in on platforms that
are known to have IPv6 support. Note: this directive is for debugging
And testing only. It is not guaranteed to work on all platforms.
and testing only. It is not guaranteed to work on all platforms.
If you don't want IPv6 support, set "<a href="postconf.5.html#inet_protocols">inet_protocols</a> = ipv4" in
<a href="postconf.5.html">main.cf</a>.
</td> </tr>
@ -1185,7 +1186,7 @@ file. </p>
<blockquote>
<pre>
$ egrep '(reject|warning|error|fatal|panic):' /some/log/file
$ grep -E '(reject|warning|error|fatal|panic):' /some/log/file
</pre>
</blockquote>
@ -1266,7 +1267,7 @@ file. </p>
<blockquote>
<pre>
$ egrep '(reject|warning|error|fatal|panic):' /some/log/file
$ grep -E '(reject|warning|error|fatal|panic):' /some/log/file
</pre>
</blockquote>
@ -1331,7 +1332,7 @@ file. </p>
<blockquote>
<pre>
$ egrep '(reject|warning|error|fatal|panic):' /some/log/file
$ grep -E '(reject|warning|error|fatal|panic):' /some/log/file
</pre>
</blockquote>
@ -1650,7 +1651,7 @@ idea to run every night before the syslog files are rotated: </p>
<blockquote>
<pre>
# postfix check
# egrep '(reject|warning|error|fatal|panic):' /some/log/file
# grep -E '(reject|warning|error|fatal|panic):' /some/log/file
</pre>
</blockquote>

View File

@ -8,6 +8,7 @@
<title>Postfix IPv6 Support</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>
@ -78,8 +79,8 @@ platforms: </p>
<p> On other platforms Postfix will simply use IPv4 as it has always
done. </p>
<p> See <a href="#porting">below</a> for tips how to port Postfix
IPv6 support to other environments. </p>
<p> See "<a href="#porting">IPv6 Support for unsupported platforms</a>"
for tips to port Postfix IPv6 support to other environments. </p>
<h2><a name="configuration">Configuration</a></h2>
@ -128,6 +129,9 @@ on a software distribution with IPv6 support, "ipv4" otherwise. </p>
"<a href="postconf.5.html#inet_protocols">inet_protocols</a> = ipv6" will not prevent Postfix from
accepting IPv4 connections. </p>
<p> For an unsupported test option to build Postfix without IPv6
support, see the NO_IPV6 option in the <a href="INSTALL.html">INSTALL</a> document. </p>
<li> <p> The other new parameter is <a href="postconf.5.html#smtp_bind_address6">smtp_bind_address6</a>.
This sets the local interface address for outgoing IPv6 SMTP
connections, just like the <a href="postconf.5.html#smtp_bind_address">smtp_bind_address</a> parameter

View File

@ -8,6 +8,7 @@
<title>Postfix LDAP Howto</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix and Linux</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix OpenLDAP LMDB Howto</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Rejecting Unknown Local Recipients with Postfix</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix + Maildrop Howto</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix logging to file or stdout</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>
@ -20,7 +21,7 @@ logging to file or stdout</h1>
<h2>Overview </h2>
<p> Postfix supports it own logging system as an alternative to
<p> Postfix supports its own logging system as an alternative to
syslog (which remains the default). This is available with Postfix
version 3.4 or later. </p>
@ -174,7 +175,8 @@ to $<a href="postconf.5.html#maillog_file">maillog_file</a> (also, logging to st
operation of some of these programs). These programs can log to
<a href="postlogd.8.html">postlogd(8)</a> if they are run by the super-user, or if their executable
file has set-gid permission. Do not set this permission on programs
other than <a href="postdrop.1.html">postdrop(1)</a> and <a href="postqueue.1.html">postqueue(1)</a>.
other than <a href="postdrop.1.html">postdrop(1)</a>, <a href="postqueue.1.html">postqueue(1)</a>, and (Postfix &ge; 3.7)
<a href="postlog.1.html">postlog(1)</a>.
</ul>

View File

@ -8,6 +8,7 @@
<title>Postfix memcache client Howto</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix before-queue Milter support </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>
@ -48,6 +49,9 @@ document for differences between Postfix and Sendmail implementations.
<li><a href="#plumbing">How Milter applications plug into Postfix </a>
<li><a href="#when-inspect">When Postfix and Milters inspect an
SMTP session </a>
<li><a href="#building">Building Milter applications</a>
<li><a href="#running">Running Milter applications</a>
@ -192,10 +196,59 @@ href="QSHAPE_README.html#incoming_queue"> incoming </a> </td>
</blockquote>
<h2><a name="when-inspect">When Postfix and Milters inspect an SMTP
session </a></h2>
<p> Generally, Postfix inspects information first, then the first
configured Milter, the second configured Milter, and so on. </p>
<ul>
<li><p> With most SMTP commands: Postfix reviews one SMTP command,
and if Postfix does not reject it, Postfix passes the command to
the first configured Milter. If the first Milter does not reject
the command, Postfix passes it to the second configured Milter, and
so on. This includes commands with an envelope sender (MAIL FROM)
or envelope recipient (RCPT TO). Postfix stores the same envelope
records in a queue file as when no Milters are configured, including
rewritten envelope addresses, expanded virtual aliases, BCC addresses
from sender/recipient_bcc_maps, and so on. </p>
<li><p> With header/body content: Postfix may rewrite or reject
header/body content before it stores that content in the queue file;
Postfix stores the same header/body content as when no Milters are
configured. If Postfix does not reject the header/body content,
Postfix passes it to the first configured Milter which may modify
or reject that content or may modify the stored envelope. If the
first Milter does not reject the header/body content, Postfix passes
it to the second configured Milter, and so on. </p>
</ul>
<p> Details: </p>
<ul>
<li><p> Postfix hides its own Postfix-prepended Received: header, for
compatibility with Sendmail. Postfix does not hide other headers that
Postfix or Milters added or modified. </p>
<li><p> When the Postfix SMTP server receives a sequence of one or
more valid BDAT commands, it generates one DATA command for the
Milters. </p>
<li><p> The Milter API does not support inspection of SMTP commands
such as QUIT, NOOP, or VRFY; the API supports only commands that are
needed for email delivery. <p>
</ul>
<h2><a name="building">Building Milter applications</a></h2>
<p> Milter applications have been written in C, JAVA and Perl, but
this document deals with C applications only. For these, you need
<p> Milter applications have been written in C, Haskell, Java, Perl,
Python, Rust, and more, but
this document covers C applications only. For these, you need
an object library that implements the Sendmail 8 Milter protocol.
Postfix currently does not provide such a library, but Sendmail
does. </p>
@ -286,10 +339,10 @@ information. </blockquote>
<p> You specify SMTP-only Milter applications (there can be more
than one) with the <a href="postconf.5.html#smtpd_milters">smtpd_milters</a> parameter. Each Milter application
is identified by the name of its listening socket; other Milter
configuration options will be discussed in later sections. Milter
applications are applied in the order as specified, and the first
Milter application that rejects a command will override the responses
from other Milter applications. </p>
configuration options will be discussed in later sections. Postfix
sends commands to each Milter application in the order as configured
with <a href="postconf.5.html#smtpd_milters">smtpd_milters</a>. When a Milter application rejects a command,
that will override responses from other Milter applications. </p>
<blockquote>
<pre>
@ -348,10 +401,10 @@ information. </p>
<p> You specify non-SMTP Milter applications with the <a href="postconf.5.html#non_smtpd_milters">non_smtpd_milters</a>
parameter. This parameter uses the same syntax as the <a href="postconf.5.html#smtpd_milters">smtpd_milters</a>
parameter in the previous section. As with the SMTP-only filters,
you can specify more than one Milter application; they are applied
in the order as specified, and the first Milter application that
rejects a command will override the responses from the other
applications. </p>
you can specify more than one Milter application. Postfix sends
commands to each Milter application in the order as configured with
<a href="postconf.5.html#non_smtpd_milters">non_smtpd_milters</a>. When a Milter application rejects a command,
that will override responses from other Milter applications. </p>
<blockquote>
<pre>
@ -705,10 +758,9 @@ With rejected recipient: "error" </td> </tr>
<h3><a name="send-macros">What macros will Postfix send to Milters?</a></h3>
<p> Postfix sends specific sets of macros at different Milter protocol
stages. The sets are configured with the parameters as shown in the
table below (EOH = end of headers; EOM = end of message). The
protocol version is a number that Postfix sends at the beginning
of the Milter protocol handshake. </p>
stages. The names of these macros are configured with the parameters
shown in the table below (EOH = end of headers; EOM = end of message).
Some lists require a minimum Milter protocol version. </p>
<p> As of Sendmail 8.14.0, Milter applications can specify what
macros they want to receive at different Milter protocol stages.
@ -941,9 +993,8 @@ st_optionneg[134563840]: 0x3d does not fulfill action requirements 0x1e
<p> The solution is to use Postfix version 2.4 or later. </p>
<li> <p> Most Milter configuration options are global. Future Postfix
versions may support per-Milter timeouts, per-Milter error handling,
etc. </p>
<li> <p> Postfix versions before 3.0 did not support per-Milter
timeouts, per-Milter error handling, etc. </p>
</ul>

View File

@ -8,6 +8,7 @@
<title>Managing multiple Postfix instances on a single host</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix MySQL Howto</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>
@ -56,8 +57,8 @@ the mysqlclient library (and libm) to <a href="MYSQL_README.html">AUXLIBS_MYSQL<
<blockquote>
<pre>
make -f Makefile.init makefiles \
'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include' \
'<a href="MYSQL_README.html">AUXLIBS_MYSQL</a>=-L/usr/local/mysql/lib -lmysqlclient -lz -lm'
"CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include" \
"<a href="MYSQL_README.html">AUXLIBS_MYSQL</a>=-L/usr/local/mysql/lib -lmysqlclient -lz -lm"
</pre>
</blockquote>
@ -85,9 +86,9 @@ what dynamic database client loading was meant to avoid. </p>
<blockquote>
<pre>
make -f Makefile.init makefiles \
'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include' \
'<a href="MYSQL_README.html">AUXLIBS_MYSQL</a>=-L/usr/local/mysql/lib -R/usr/local/mysql/lib \
-lmysqlclient -lz -lm'
"CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include" \
"<a href="MYSQL_README.html">AUXLIBS_MYSQL</a>=-L/usr/local/mysql/lib -R/usr/local/mysql/lib \
-lmysqlclient -lz -lm"
</pre>
</blockquote>

View File

@ -8,6 +8,7 @@
<title>Postfix and NFS</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix Architecture Overview </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Guidelines for Package Builders</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix PCRE Support</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix PostgreSQL Howto</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>
@ -52,8 +53,8 @@ the location of the libpq library file. </p>
<pre>
% make tidy
% make -f Makefile.init makefiles \
'CCARGS=-DHAS_PGSQL -I/usr/local/include/pgsql' \
'<a href="PGSQL_README.html">AUXLIBS_PGSQL</a>=-L/usr/local/lib -lpq'
"CCARGS=-DHAS_PGSQL -I/usr/local/include/pgsql" \
"<a href="PGSQL_README.html">AUXLIBS_PGSQL</a>=-L/usr/local/lib -lpq"
</pre>
</blockquote>

View File

@ -6,6 +6,7 @@
<title>Postfix Postscreen Howto (Postfix 2.8 - 3.5)</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -6,6 +6,7 @@
<title>Postfix Postscreen Howto</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix Bottleneck Analysis</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>
@ -187,13 +188,13 @@ question. </p>
# Find deliveries to example.com
#
$ tail -10000 /var/log/maillog |
egrep -i ': to=&lt;.*@example\.com&gt;,' |
grep -E -i ': to=&lt;.*@example\.com&gt;,' |
less
# Find messages from example.com
#
$ tail -10000 /var/log/maillog |
egrep -i ': from=&lt;.*@example\.com&gt;,' |
grep -E -i ': from=&lt;.*@example\.com&gt;,' |
less
</pre>
</blockquote>
@ -204,7 +205,7 @@ $ tail -10000 /var/log/maillog |
<pre>
# Find all messages for a specific queue id.
#
$ tail -10000 /var/log/maillog | egrep ': 2B2173FF68: '
$ tail -10000 /var/log/maillog | grep -E ': 2B2173FF68: '
</pre>
</blockquote>
@ -213,7 +214,7 @@ warnings can suggest strategies to reduce congestion. </p>
<blockquote>
<pre>
$ egrep 'qmgr.*(panic|fatal|error|warning):' /var/log/maillog
$ grep -E 'qmgr.*(panic|fatal|error|warning):' /var/log/maillog
</pre>
</blockquote>

View File

@ -8,6 +8,7 @@
<title>Postfix Per-Client/User/etc. Access Control</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -6,6 +6,7 @@
<title>Postfix SASL Howto</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>
@ -267,11 +268,27 @@ in <code>/usr/lib/sasl2/</code>. </p> </li>
<li> <p> Cyrus SASL version 2.1.22 and newer additionally search
in <code>/etc/sasl2/</code>. </p> </li>
<li> <p> Some Postfix distributions are modified and look for the
Cyrus SASL configuration file in <code>/etc/postfix/sasl/</code>,
<code>/var/lib/sasl2/</code> etc. See the distribution-specific
<li> <p> With Postfix 2.5 and later you can explicitly configure the
search path via the <code><a href="postconf.5.html#cyrus_sasl_config_path">cyrus_sasl_config_path</a></code> configuration
parameter. Specify zero or more colon-separated directories. If
set empty (the default value) the search path is the one compiled
into the Cyrus SASL library. </p> </li>
<li> <p> Some Postfix distributions employ a non-empty default value
for <code><a href="postconf.5.html#cyrus_sasl_config_path">cyrus_sasl_config_path</a></code> to look for the Cyrus SASL
configuration file in <code>/etc/postfix/sasl/</code>,
<code>/var/lib/sasl2/</code> etc. See the output of <code>postconf
<a href="postconf.5.html#cyrus_sasl_config_path">cyrus_sasl_config_path</a></code> and/or the distribution-specific
documentation to determine the expected location. </p> </li>
<li> <p> Some Debian-based Postfix distributions patch Postfix to
hardcode a non-default search path, making it impossible to set an
alternate search path via the "<a href="postconf.5.html#cyrus_sasl_config_path">cyrus_sasl_config_path</a>" parameter. This
is likely to be the case when the distribution documents a
Postfix-specific path (e.g. <code>/etc/postfix/sasl/</code>) that is
different from the default value of "<a href="postconf.5.html#cyrus_sasl_config_path">cyrus_sasl_config_path</a>" (which
then is likely to be empty). </p> </li>
</ul>
<blockquote>
@ -2028,8 +2045,8 @@ the Postfix top-level directory: </p>
<blockquote>
<pre>
% <strong>make tidy</strong> # if you have left-over files from a previous build
% <strong>make makefiles CCARGS='-DUSE_SASL_AUTH \
-DDEF_SERVER_SASL_TYPE=\"dovecot\"'</strong>
% <strong>make makefiles CCARGS="-DUSE_SASL_AUTH \
-DDEF_SERVER_SASL_TYPE=\\\"dovecot\\\""</strong>
</pre>
</blockquote>
@ -2042,7 +2059,7 @@ the <a href="INSTALL.html">INSTALL</a> document. </p>
<li>
<p> The <code>-DDEF_SERVER_SASL_TYPE=\"dovecot\"</code> is not
<p> The <code>-DDEF_SERVER_SASL_TYPE=\\\"dovecot\\\"</code> is not
necessary; it just makes Postfix configuration a little more
convenient because you don't have to specify the SASL plug-in type
in the Postfix <a href="postconf.5.html">main.cf</a> file (but this may cause surprises when you
@ -2061,10 +2078,10 @@ options into the above command line; see the <a href="LDAP_README.html">LDAP_REA
<blockquote>
<pre>
% <strong>make tidy</strong> # if you have left-over files from a previous build
% <strong>make makefiles CCARGS='-DUSE_SASL_AUTH \
-DDEF_SERVER_SASL_TYPE=\"dovecot\" \
...<i>CCARGS options for LDAP or TLS etc.</i>...' \
AUXLIBS='...<i>AUXLIBS options for LDAP or TLS etc.</i>...'</strong>
% <strong>make makefiles CCARGS="-DUSE_SASL_AUTH \
-DDEF_SERVER_SASL_TYPE=\\\"dovecot\\\" \
...<i>CCARGS options for LDAP or TLS etc.</i>..." \
AUXLIBS="...<i>AUXLIBS options for LDAP or TLS etc.</i>..."</strong>
</pre>
</blockquote>

View File

@ -8,6 +8,7 @@
<title>Postfix Queue Scheduler</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix SMTP relay and access control </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix SMTP Access Policy Delegation </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>
@ -116,6 +117,9 @@ policy_context=submission
<b>Postfix version 3.2 and later:</b>
server_address=10.3.2.1
server_port=54321
<b>Postfix version 3.8 and later:</b>
<a href="postconf.5.html#compatibility_level">compatibility_level</a>=<i>major</i>.<i>minor</i>.<i>patch</i>
<a href="postconf.5.html#mail_version">mail_version</a>=3.8.0
[empty line]
</pre>
</blockquote>
@ -213,6 +217,17 @@ server_port=54321
information that is not available via other attributes (Postfix
version 3.1 and later). </p>
<li> <p> The "<a href="postconf.5.html#compatibility_level">compatibility_level</a>" attribute corresponds to the
<a href="postconf.5.html#compatibility_level">compatibility_level</a> parameter value. It has the form
<i>major</i>.<i>minor</i>.<i>patch</i> where <i>minor</i> and
<i>patch</i> may be absent. </p>
<li> <p> The "<a href="postconf.5.html#mail_version">mail_version</a>" attribute corresponds to the
<a href="postconf.5.html#mail_version">mail_version</a> parameter value. It has the form
<i>major</i>.<i>minor</i>.<i>patch</i> for stable releases, and
<i>major</i>.<i>minor</i>-<i>yyyymmdd</i> for unstable releases.
</p>
</ul>
<p> The following is specific to SMTPD delegated policy requests:

View File

@ -8,6 +8,7 @@
<title>Postfix Before-Queue Content Filter </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>
@ -158,6 +159,31 @@ mail back to the sender (which is usually forged anyway). Mail
that is not accepted remains the responsibility of the remote SMTP
client. </p>
<li> <p> Con: The <a href="smtpd.8.html">smtpd(8)</a> service before the <a href="postconf.5.html#smtpd_proxy_filter">smtpd_proxy_filter</a>
cannot support features that involve header or body access, or that
involve queue file manipulation (i.e., anything that involves
processing by the <a href="cleanup.8.html">cleanup(8)</a> service). </p>
<ul>
<li> <p> No support for HOLD actions in Postfix smtpd <a href="access.5.html">access(5)</a>
restrictions. </p>
<li> <p> No support for <a href="postconf.5.html#smtpd_milters">smtpd_milters</a> features that involve message
header or body content. </p>
<li> <p> No support for <a href="postconf.5.html#receive_override_options">receive_override_options</a>.
</ul>
<p> Instead, specify those features with the <a href="smtpd.8.html">smtpd(8)</a> service behind
the <a href="postconf.5.html#smtpd_proxy_filter">smtpd_proxy_filter</a>. In some cases, it may be possible to combine
a before-filter PREPEND action that emits a unique pattern (for
example containing the MTA domain name), with an after-filter
<a href="postconf.5.html#header_checks">header_checks</a> action that does what you want, and with an
<a href="postconf.5.html#smtp_header_checks">smtp_header_checks</a> IGNORE action that deletes the prepended header
from transit mail. </p>
<li> <p> Con: The remote SMTP client expects an SMTP reply within
a deadline. As the system load increases, fewer and fewer CPU
cycles remain available to answer within the deadline, and eventually

View File

@ -8,6 +8,7 @@
<title>Postfix SMTPUTF8 support</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix Small/Home Office Hints and Tips</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix SQLite Howto</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>
@ -43,8 +44,8 @@ name of the standard POSIX thread library (pthread). For example:
<blockquote>
<pre>
make -f Makefile.init makefiles \
'CCARGS=-DHAS_SQLITE -I/usr/local/include' \
'<a href="SQLITE_README.html">AUXLIBS_SQLITE</a>=-L/usr/local/lib -lsqlite3 -lpthread'
"CCARGS=-DHAS_SQLITE -I/usr/local/include" \
"<a href="SQLITE_README.html">AUXLIBS_SQLITE</a>=-L/usr/local/lib -lsqlite3 -lpthread"
</pre>
</blockquote>

View File

@ -8,6 +8,7 @@
<title>Postfix Standard Configuration Examples</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>
@ -377,7 +378,7 @@ is the real purpose of the firewall email function. </p>
17 . . .
18
19 /etc/postfix/transport:
20 example.com <a href="smtp.8.html">smtp</a>:[inside-gateway.example.com]
20 example.com relay:[inside-gateway.example.com]
</pre>
</blockquote>
@ -399,7 +400,12 @@ wild-card in the relay_recipients table. </p>
<li> <p> Lines 12, 19-20: Route mail for "example.com" to the inside
gateway machine. The <tt>[]</tt> forces Postfix to do no MX lookup.
</p>
This uses the "relay" delivery transport (a copy of the default
"smtp" delivery transport) to forward inbound mail. This can improve
performance of deliveries to internal domains because they will
compete for SMTP clients from the "relay" delivery transport, instead
of competing with other SMTP deliveries for SMTP clients from the
default "smtp" delivery transport. </p>
</ul>

View File

@ -8,6 +8,7 @@
<title>Postfix Stress-Dependent Configuration</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix legacy TLS Support </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix TLS Support </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>
@ -2908,7 +2909,7 @@ erase all the SMTP client TLS settings and then enable client TLS: </p>
<blockquote>
<pre>
# postconf -X `postconf -nH | egrep '^smtp(_|_enforce_|_use_)tls'`
# postconf -X `postconf -nH | grep -E '^smtp(_|_enforce_|_use_)tls'`
# <a href="postfix-tls.1.html">postfix tls</a> enable-client
# postfix reload
</pre>
@ -2941,7 +2942,7 @@ all the SMTP server TLS settings and then enable server TLS: </p>
<blockquote>
<pre>
# postconf -X `postconf -nH | egrep '^smtpd(_|_enforce_|_use_)tls'`
# postconf -X `postconf -nH | grep -E '^smtpd(_|_enforce_|_use_)tls'`
# <a href="postfix-tls.1.html">postfix tls</a> enable-server
# postfix reload
</pre>

View File

@ -8,6 +8,7 @@
<title>Postfix Performance Tuning</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix and UUCP </title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix VERP Howto</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix Virtual Domain Hosting Howto</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix XCLIENT Howto</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -8,6 +8,7 @@
<title>Postfix XFORWARD Howto</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
</head>

View File

@ -2,6 +2,7 @@
"http://www.w3.org/TR/html4/loose.dtd">
<html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
<title> Postfix manual - access(5) </title>
</head> <body> <pre>
ACCESS(5) ACCESS(5)

View File

@ -2,6 +2,7 @@
"http://www.w3.org/TR/html4/loose.dtd">
<html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
<title> Postfix manual - aliases(5) </title>
</head> <body> <pre>
ALIASES(5) ALIASES(5)
@ -67,38 +68,41 @@ ALIASES(5) ALIASES(5)
<a href="https://tools.ietf.org/html/rfc822">822</a> standard.
<i>/file/name</i>
Mail is appended to <i>/file/name</i>. See <a href="local.8.html"><b>local</b>(8)</a> for details of
delivery to file. Delivery is not limited to regular files.
For example, to dispose of unwanted mail, deflect it to
<b>/dev/null</b>.
Mail is appended to <i>/file/name</i>. For details on how a file is
written see the sections "EXTERNAL FILE DELIVERY" and "DELIVERY
RIGHTS" in the <a href="local.8.html"><b>local</b>(8)</a> documentation. Delivery is not limited
to regular files. For example, to dispose of unwanted mail,
deflect it to <b>/dev/null</b>.
|<i>command</i>
Mail is piped into <i>command</i>. Commands that contain special char-
acters, such as whitespace, should be enclosed between double
quotes. See <a href="local.8.html"><b>local</b>(8)</a> for details of delivery to command.
Mail is piped into <i>command</i>. Commands that contain special char-
acters, such as whitespace, should be enclosed between double
quotes. For details on how a command is executed see "EXTERNAL
COMMAND DELIVERY" and "DELIVERY RIGHTS" in the <a href="local.8.html"><b>local</b>(8)</a> documen-
tation.
When the command fails, a limited amount of command output is
mailed back to the sender. The file <b>/usr/include/sysexits.h</b>
defines the expected exit status codes. For example, use <b>"|exit</b>
<b>67"</b> to simulate a "user unknown" error, and <b>"|exit 0"</b> to imple-
When the command fails, a limited amount of command output is
mailed back to the sender. The file <b>/usr/include/sysexits.h</b>
defines the expected exit status codes. For example, use <b>"|exit</b>
<b>67"</b> to simulate a "user unknown" error, and <b>"|exit 0"</b> to imple-
ment an expensive black hole.
<b>:include:</b><i>/file/name</i>
Mail is sent to the destinations listed in the named file.
Lines in <b>:include:</b> files have the same syntax as the right-hand
Mail is sent to the destinations listed in the named file.
Lines in <b>:include:</b> files have the same syntax as the right-hand
side of alias entries.
A destination can be any destination that is described in this
manual page. However, delivery to "|<i>command</i>" and <i>/file/name</i> is
disallowed by default. To enable, edit the <b><a href="postconf.5.html#allow_mail_to_commands">allow_mail_to_com</a>-</b>
A destination can be any destination that is described in this
manual page. However, delivery to "|<i>command</i>" and <i>/file/name</i> is
disallowed by default. To enable, edit the <b><a href="postconf.5.html#allow_mail_to_commands">allow_mail_to_com</a>-</b>
<b><a href="postconf.5.html#allow_mail_to_commands">mands</a></b> and <b><a href="postconf.5.html#allow_mail_to_files">allow_mail_to_files</a></b> configuration parameters.
<b>ADDRESS EXTENSION</b>
When alias database search fails, and the recipient localpart contains
the optional recipient delimiter (e.g., <i>user+foo</i>), the search is
When alias database search fails, and the recipient localpart contains
the optional recipient delimiter (e.g., <i>user+foo</i>), the search is
repeated for the unextended address (e.g., <i>user</i>).
The <b><a href="postconf.5.html#propagate_unmatched_extensions">propagate_unmatched_extensions</a></b> parameter controls whether an
The <b><a href="postconf.5.html#propagate_unmatched_extensions">propagate_unmatched_extensions</a></b> parameter controls whether an
unmatched address extension (<i>+foo</i>) is propagated to the result of table
lookup.
@ -107,9 +111,9 @@ ALIASES(5) ALIASES(5)
before database lookup.
<b>REGULAR EXPRESSION TABLES</b>
This section describes how the table lookups change when the table is
given in the form of regular expressions. For a description of regular
expression lookup table syntax, see <a href="regexp_table.5.html"><b>regexp_table</b>(5)</a> or <a href="pcre_table.5.html"><b>pcre_table</b>(5)</a>.
This section describes how the table lookups change when the table is
given in the form of regular expressions. For a description of regular
expression lookup table syntax, see <a href="regexp_table.5.html"><b>regexp_table</b>(5)</a> or <a href="pcre_table.5.html"><b>pcre_table</b>(5)</a>.
NOTE: these formats do not use ":" at the end of a pattern.
Each regular expression is applied to the entire search string. Thus, a
@ -122,21 +126,21 @@ ALIASES(5) ALIASES(5)
reasons there is no support for <b>$1</b>, <b>$2</b> etc. substring interpolation.
<b>SECURITY</b>
The <a href="local.8.html"><b>local</b>(8)</a> delivery agent disallows regular expression substitution
The <a href="local.8.html"><b>local</b>(8)</a> delivery agent disallows regular expression substitution
of $1 etc. in <b><a href="postconf.5.html#alias_maps">alias_maps</a></b>, because that would open a security hole.
The <a href="local.8.html"><b>local</b>(8)</a> delivery agent will silently ignore requests to use the
<a href="proxymap.8.html"><b>proxymap</b>(8)</a> server within <b><a href="postconf.5.html#alias_maps">alias_maps</a></b>. Instead it will open the table
The <a href="local.8.html"><b>local</b>(8)</a> delivery agent will silently ignore requests to use the
<a href="proxymap.8.html"><b>proxymap</b>(8)</a> server within <b><a href="postconf.5.html#alias_maps">alias_maps</a></b>. Instead it will open the table
directly. Before Postfix version 2.2, the <a href="local.8.html"><b>local</b>(8)</a> delivery agent will
terminate with a fatal error.
<b>CONFIGURATION PARAMETERS</b>
The following <a href="postconf.5.html"><b>main.cf</b></a> parameters are especially relevant. The text
below provides only a parameter summary. See <a href="postconf.5.html"><b>postconf</b>(5)</a> for more
The following <a href="postconf.5.html"><b>main.cf</b></a> parameters are especially relevant. The text
below provides only a parameter summary. See <a href="postconf.5.html"><b>postconf</b>(5)</a> for more
details including examples.
<b><a href="postconf.5.html#alias_database">alias_database</a> (see 'postconf -d' output)</b>
The alias databases for <a href="local.8.html"><b>local</b>(8)</a> delivery that are updated with
The alias databases for <a href="local.8.html"><b>local</b>(8)</a> delivery that are updated with
"<b>newaliases</b>" or with "<b>sendmail -bi</b>".
<b><a href="postconf.5.html#alias_maps">alias_maps</a> (see 'postconf -d' output)</b>
@ -149,30 +153,30 @@ ALIASES(5) ALIASES(5)
Restrict <a href="local.8.html"><b>local</b>(8)</a> mail delivery to external files.
<b><a href="postconf.5.html#expand_owner_alias">expand_owner_alias</a> (no)</b>
When delivering to an alias "<i>aliasname</i>" that has an
When delivering to an alias "<i>aliasname</i>" that has an
"owner-<i>aliasname</i>" companion alias, set the envelope sender
address to the expansion of the "owner-<i>aliasname</i>" alias.
<b><a href="postconf.5.html#propagate_unmatched_extensions">propagate_unmatched_extensions</a> (canonical, virtual)</b>
What address lookup tables copy an address extension from the
What address lookup tables copy an address extension from the
lookup key to the lookup result.
<b><a href="postconf.5.html#owner_request_special">owner_request_special</a> (yes)</b>
Enable special treatment for owner-<i>listname</i> entries in the
Enable special treatment for owner-<i>listname</i> entries in the
<a href="aliases.5.html"><b>aliases</b>(5)</a> file, and don't split owner-<i>listname</i> and <i>list-</i>
<i>name</i>-request address localparts when the <a href="postconf.5.html#recipient_delimiter">recipient_delimiter</a> is
<i>name</i>-request address localparts when the <a href="postconf.5.html#recipient_delimiter">recipient_delimiter</a> is
set to "-".
<b><a href="postconf.5.html#recipient_delimiter">recipient_delimiter</a> (empty)</b>
The set of characters that can separate an email address local-
The set of characters that can separate an email address local-
part, user name, or a .forward file name from its extension.
Available in Postfix version 2.3 and later:
<b><a href="postconf.5.html#frozen_delivered_to">frozen_delivered_to</a> (yes)</b>
Update the <a href="local.8.html"><b>local</b>(8)</a> delivery agent's idea of the Delivered-To:
address (see <a href="postconf.5.html#prepend_delivered_header">prepend_delivered_header</a>) only once, at the start
of a delivery attempt; do not update the Delivered-To: address
Update the <a href="local.8.html"><b>local</b>(8)</a> delivery agent's idea of the Delivered-To:
address (see <a href="postconf.5.html#prepend_delivered_header">prepend_delivered_header</a>) only once, at the start
of a delivery attempt; do not update the Delivered-To: address
while expanding aliases or .forward files.
<b>STANDARDS</b>

View File

@ -2,6 +2,7 @@
"http://www.w3.org/TR/html4/loose.dtd">
<html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
<title> Postfix manual - anvil(8) </title>
</head> <body> <pre>
ANVIL(8) ANVIL(8)

View File

@ -2,6 +2,7 @@
"http://www.w3.org/TR/html4/loose.dtd">
<html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
<title> Postfix manual - bounce(5) </title>
</head> <body> <pre>
BOUNCE(5) BOUNCE(5)

View File

@ -2,6 +2,7 @@
"http://www.w3.org/TR/html4/loose.dtd">
<html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
<title> Postfix manual - bounce(8) </title>
</head> <body> <pre>
BOUNCE(8) BOUNCE(8)

View File

@ -2,6 +2,7 @@
"http://www.w3.org/TR/html4/loose.dtd">
<html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
<title> Postfix manual - canonical(5) </title>
</head> <body> <pre>
CANONICAL(5) CANONICAL(5)

View File

@ -2,6 +2,7 @@
"http://www.w3.org/TR/html4/loose.dtd">
<html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
<title> Postfix manual - cidr_table(5) </title>
</head> <body> <pre>
CIDR_TABLE(5) CIDR_TABLE(5)
@ -99,8 +100,8 @@ CIDR_TABLE(5) CIDR_TABLE(5)
not required.
<b>INLINE SPECIFICATION</b>
The contents of a table may be specified in the table name. The basic
syntax is:
The contents of a table may be specified in the table name (Postfix 3.7
and later). The basic syntax is:
<a href="postconf.5.html">main.cf</a>:
<i>parameter</i> <b>= .. <a href="cidr_table.5.html">cidr</a>:{ {</b> <i>rule-1</i> <b>}, {</b> <i>rule-2</i> <b>} .. } ..</b>

View File

@ -2,6 +2,7 @@
"http://www.w3.org/TR/html4/loose.dtd">
<html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
<title> Postfix manual - cleanup(8) </title>
</head> <body> <pre>
CLEANUP(8) CLEANUP(8)

View File

@ -2,6 +2,7 @@
"http://www.w3.org/TR/html4/loose.dtd">
<html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
<title> Postfix manual - bounce(8) </title>
</head> <body> <pre>
BOUNCE(8) BOUNCE(8)

View File

@ -2,6 +2,7 @@
"http://www.w3.org/TR/html4/loose.dtd">
<html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
<title> Postfix manual - discard(8) </title>
</head> <body> <pre>
DISCARD(8) DISCARD(8)

View File

@ -2,6 +2,7 @@
"http://www.w3.org/TR/html4/loose.dtd">
<html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
<title> Postfix manual - dnsblog(8) </title>
</head> <body> <pre>
DNSBLOG(8) DNSBLOG(8)

View File

@ -2,6 +2,7 @@
"http://www.w3.org/TR/html4/loose.dtd">
<html> <head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel='stylesheet' type='text/css' href='postfix-doc.css'>
<title> Postfix manual - error(8) </title>
</head> <body> <pre>
ERROR(8) ERROR(8)

Some files were not shown because too many files have changed in this diff Show More