The stable Postfix release is called postfix-2.9.x where 2=major
release number, 9=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-2.10-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 2.7 or earlier, read RELEASE_NOTES-2.8
before proceeding.

Major changes with Postfix 2.9.6
--------------------------------

Thanks to OpenSSL documentation, the Postfix 2.9.0..2.9.5 SMTP
client and server computed incorrect TLS certificate PUBLIC-KEY
fingerprints.  Support for certificate PUBLIC-KEY finger prints
was introduced with Postfix 2.9; there is no known problem with the
certificate fingerprint algorithms available since Postfix 2.2.

Certificate PUBLIC-KEY finger prints may be used in the Postfix
SMTP server (with "check_ccert_access") and in the Postfix SMTP
client (with the "fingerprint" security level).  

Specify "tls_legacy_public_key_fingerprints = yes" temporarily, 
pending a migration from configuration files with incorrect Postfix
2.9.0..2.9.5 certificate PUBLIC-KEY finger prints, to the correct
fingerprints used by Postfix 2.9.6 and later.

To compute the correct PUBLIC-KEY finger prints:

# OpenSSL 1.0 with all certificates and SHA-1 fingerprints.
$ openssl x509 -in cert.pem -noout -pubkey | \
    openssl pkey -pubin -outform DER | \
    openssl dgst -sha1 -c

# OpenSSL 0.9.8 with RSA certificates and MD5 fingerprints.
$ openssl x509 -in cert.pem -noout -pubkey | \
    openssl rsa -pubin -outform DER | \
    openssl dgst -md5 -c

Major changes with Postfix 2.9.2
--------------------------------

This release adds support to turn off the TLSv1.1 and TLSv1.2
protocols.  Introduced with OpenSSL version 1.0.1, these are known
to cause inter-operability problems with for example hotmail.

The radical workaround is to temporarily turn off problematic
protocols globally:

/etc/postfix/main.cf:
    smtp_tls_protocols = !SSLv2, !TLSv1.1, !TLSv1.2
    smtp_tls_mandatory_protocols = !SSLv2, !TLSv1.1, !TLSv1.2

    smtpd_tls_protocols = !SSLv2, !TLSv1.1, !TLSv1.2
    smtpd_tls_mandatory_protocols = !SSLv2, !TLSv1.1, !TLSv1.2

However, it may be better to temporarily turn off problematic
protocols for broken sites only:

/etc/postfix/main.cf:
    smtp_tls_policy_maps = hash:/etc/postfix/tls_policy

/etc/postfix/tls_policy:
    example.com         may protocols=!SSLv2:!TLSv1.1:!TLSv1.2

Important:

- Note the use of ":" instead of comma or space. Also, note that
  there is NO space around the "=" in "protocols=".

- The smtp_tls_policy_maps lookup key must match the "next-hop"
  destination that is given to the Postfix SMTP client. If you
  override the next-hop destination with transport_maps, relayhost,
  sender_dependent_relayhost_maps, or otherwise, you need to specify
  the same destination for the smtp_tls_policy_maps lookup key.

Major changes - critical
------------------------

[Incompat 20110321] You need to "postfix reload" after upgrade from
snapshot 20110320 or earlier.  The hash_queue_names algorithm was
changed to provide better performance with long queue IDs.

[Incompat 20110313] Use "postfix reload" after "make upgrade" on a
running Postfix system. This is needed because the protocol between
postscreen(8) and dnsblog(8) has changed.

Major changes - library API
---------------------------

[Incompat 20110130] The VSTREAM error flags are now split into
separate read and write error flags. As a result of this change,
all programs that use Postfix VSTREAMs MUST be recompiled.

Major changes - compatibility
-----------------------------

[Incompat 20111012] For consistency with the SMTP standard, the
(client-side) smtp_line_length_limit default value was increased
from 990 characters to 999 (i.e. 1000 characters including <CR><LF>).
Specify "smtp_line_length_limit = 990" to restore historical Postfix
behavior.

[Incompat 20111012] To simplify integration with third-party
applications, the Postfix sendmail command now always transforms
all input lines ending in <CR><LF> into UNIX format (lines ending
in <LF>). Specify "sendmail_fix_line_endings = strict" to restore
historical Postfix behavior (i.e. convert all input lines ending
in <CR><LF> only if the first line ends in <CR><LF>).

[Incompat 20111106] To work around broken remote SMTP servers, the
Postfix SMTP client by default no longer appends the "AUTH=<>"
option to the MAIL FROM command.  Specify "smtp_send_dummy_mail_auth
= yes" to restore the old behavior.

Major changes - gradual degradation
-----------------------------------

[Incompat 20120114] Logfile-based alerting systems may need to be
updated to look for "error" messages in addition to "fatal" messages.
Specify "daemon_table_open_error_is_fatal = yes" to get the historical
behavior (immediate termination with "fatal" message).

[Feature 20120114] Instead of terminating immediately with a "fatal"
message when a database file can't be opened, a Postfix daemon
program now logs an "error" message, and continues execution with
reduced functionality.  For the sake of sanity, the number of
"errors" over the life of a process is limited to 13.

Features that don't depend on the unavailable table will continue
to work; attempts to use features that depend on the table will
fail, and will be logged with a "warning" message.

[Feature 20120108] Instead of terminating with a fatal error, the
LDAP, *SQL and memcache clients now handle table lookup errors in
the "domain" feature, instead of terminating with a fatal error.

[Feature 20120102] Degrade gradually when some or all network
protocols specified with inet_protocols are unavailable, instead
of terminating with a fatal error. This eliminates build errors on
non-standard systems where opening an IPv4 socket results in an
error, and on non-standard systems where opening an IPv6 socket
results in an error. In the worst case, the master daemon will log
a message that it disables all type "inet" services. This will still
allow local submission and local delivery.

[Feature 20111222] Instead of terminating with a fatal error, the
Postfix SMTP server now handles errors with database lookups in
mynetworks, TLS client certificate tables, debug_peer_list,
smtpd_client_event_limit_exceptions, permit_mx_backup_networks and
local_header_rewrite_clients, and reports "server local data error"
or "temporary lookup error".

[Feature 20111229] Instead of terminating with a fatal error, the
trivial-rewrite server now handles errors with database lookups in
virtual_alias_domains, relay_domains, virtual_mailbox_domains.  This
means fewer occasions where trivial-rewrite clients (such as the
SMTP server) will appear to hang.

Major changes - long queue IDs
------------------------------

Postfix 2.9 introduces support for non-repeating queue IDs (also
used as queue file names). These names are encoded in a mix of upper
case, lower case and decimal digit characters.  Long queue IDs are
disabled by default to avoid breaking tools that parse logfiles and
that expect queue IDs with the smaller [A-F0-9] character set.

[Incompat 20110320] If you enable support for long queue file names,
you need to be aware that these file names are not compatible with
Postfix <= 2.8.  If you must migrate back to Postfix <= 2.8, you
must first convert all long queue file names into short names,
otherwise the old Postfix version will complain.

The conversion procedure before migration to Postfix <= 2.8 is:

    # postfix stop
    # postconf enable_long_queue_ids=no
    # postsuper

Run the postsuper command repeatedly until it no longer reports
queue file name changes.

[Feature 20110320] Support for long, non-repeating, queue IDs (queue
file names).  The benefit of non-repeating names is simpler logfile
analysis, and easier queue migration (if you don't merge different
queues, there is no need to run "postsuper" to change queue file
names that don't match their message file inode number).

Specify "enable_long_queue_ids = yes" to enable the feature. This
does not change the names of existing queue files. See postconf(5)
or postconf.5.html#enable_long_queue_ids for a detailed description
of the differences with the old short queue IDs.

This changes new Postfix queue IDs from the short form 0FCEE9247A9
into the longer form 3Ps0FS1Zhtz1PFjb, and changes new Message-ID
header values from YYMMDDHHMMSS.queueid@myhostname into the shorter
form queueid@myhostname.

Major changes - memcache
------------------------

[Feature 20111209] memcache lookup and update support. This provides
a way to share postscreen(8) or verify(8) caches between Postfix
instances.  See MEMCACHE_README and memcache_table(5) for details
and limitations.

[Feature 20111213] Support for a persistent backup database in the
memcache client.  The memcache client updates the memcache whenever
it looks up or modifies information in the persistent database.

Major changes - postconf
------------------------

The postconf command was restructured - it now warns about unused
parameter name=value settings in main.cf or master.cf (likely to
be mistakes), it now understands "dynamic" parameter names such as
parameters whose name depends on the name of a master.cf entry, and
it can display main.cf and master.cf in a more user-friendly format.

[Feature 20120117] support for legacy database parameter names
(main.cf parameter names that are generated by prepending a suffix
to the database name).

[Feature 20111118] The "postconf -M" (display master.cf) command
now supports filtering.  For example, specify "postconf -M inet"
to display only services that listen on the network.

[Feature 20111113] postconf support to warn about unused "name=value"
entries in main.cf, and about unused "-o name=value" entries in
master.cf.  This should help to eliminate common errors with mis-typed
names.

[Feature 20111108] postconf support for parameter names that are
generated automatically from master.cf entries (delivery agents,
spawn services), and for parameter names that are defined with
main.cf smtpd_restriction_classes.

[Feature 20111106] "postconf -M" support to print master.cf entries,
and "postconf -f" support to fold long main.cf or master.cf lines
for human readability.

Major changes - trickle defense
-------------------------------

[Feature 20110212] Support for per-record deadlines.  These change
the behavior of Postfix timeout parameters, from a time limit per
read or write system call, to a time limit to send or receive a
complete record (an SMTP command line, SMTP response line, SMTP
message content line, or TLS protocol message).  This limits the
impact from hostile peers that trickle data one byte at a time.

The new configuration parameters and their default settings are:
smtpd_per_record_deadline (normal: no, overload: yes),
smtp_per_record_deadline (no), and lmtp_per_record_deadline (no).

Note: when per-record deadlines are enabled, a short time limit may
cause problems with TLS over very slow network connections.  The
reason is that a TLS protocol message can be up to 16 kbytes long
(with TLSv1), and that an entire TLS protocol message must be sent
or received within the per-record deadline.

Per-record deadlines were introduced with postscreen(8) in Postfix
2.8. This program does not receive mail, and therefore it has no
problems with TLS over slow connections.

Major changes - postscreen
--------------------------

[Feature 20111211] The proxymap(8) server can now be used to share
postscreen(8) or verify(8) caches between Postfix instances.  Support
for proxymap-over-TCP, to share a Postfix database between hosts,
is expected to be completed in the Postfix 2.10 development cycle.

[Feature 20111209] memcache lookup and update support. This provides
a way to share postscreen(8) or verify(8) caches between Postfix
instances.  

[Feature 20110228] postscreen(8) support to force remote SMTP clients
to implement proper MX lookup policy.  By listening on both primary
and backup MX addresses, postscreen(8) can deny the temporary
whitelist status to clients that connect only to backup MX hosts,
and prevent them from talking to a Postfix SMTP server process.

Example: when 1.2.3.4 is a local backup IP address, specify
"postscreen_whitelist_interfaces = !1.2.3.4 static:all".

Major changes - tls
-------------------

[Incompat 20111205] Postfix now logs the result of successful TLS
negotiation with TLS logging levels of 0. See the smtp_tls_loglevel
and smtpd_tls_loglevel descriptions in the postconf(5) manpage for
other minor differences.

[Feature 20111205] Support for TLS public key fingerprint matching
in the Postfix SMTP client (in smtp_tls_policy_maps) and server (in
check_ccert access maps).  Public key fingerprints are inherently
more specific than fingerprints over the entire certificate.

[Feature 20111205] Revision of Postfix TLS logging. The main
difference is that Postfix now logs the result of successful TLS
negotiation with TLS logging levels of 0.  See the smtp_tls_loglevel
and smtpd_tls_loglevel descriptions in the postconf(5) manpage for
other minor differences.

Major changes - sasl authentication
-----------------------------------

[Incompat 20111218] To support external SASL authentication, e.g.,
in an NGINX proxy daemon, the Postfix SMTP server now always checks
the smtpd_sender_login_maps table, even without having
"smtpd_sasl_auth_enable = yes" in main.cf.

[Feature 20111218] Support for external SASL authentication via the
XCLIENT command.  This is used to accept SASL authentication from
an SMTP proxy such as NGINX. This support works even without having
to specify "smtpd_sasl_auth_enable = yes" in main.cf.

[Incompat 20111106] To work around broken remote SMTP servers, the
Postfix SMTP client by default no longer appends the "AUTH=<>"
option to the MAIL FROM command.  Specify "smtp_send_dummy_mail_auth
= yes" to restore the old behavior.

Major changes - large file support
----------------------------------

[Feature 20110219] Postfix now uses long integers for message_size_limit,
mailbox_size_limit and virtual_mailbox_limit. On LP64 systems (64-bit
long and pointer, but 32-bit integer), these limits can now exceed
2GB.

Major changes - ipv6
--------------------

[Incompat 20110918] The following changes were made in default
settings, in preparation for general availability of IPv6:

- The default inet_protocols value is now "all" instead of "ipv4",
  meaning use both IPv4 and IPv6.  

  To avoid an unexpected loss of performance for sites without
  global IPv6 connectivity, the commands "make upgrade" and "postfix
  upgrade-configuration" now append "inet_protocols = ipv4" to
  main.cf when no explicit inet_protocols setting is already present.
  This workaround will be removed in a future release.

- The default smtp_address_preference value is now "any" instead
  of "ipv6", meaning choose randomly between IPv6 and IPv4. With
  this the Postfix SMTP client will have more success delivering
  mail to sites that have problematic IPv6 configurations.

Major changes - address verification
------------------------------------

[Feature 20111211] The proxymap(8) server can now be used to share
postscreen(8) or verify(8) caches between Postfix instances.  Support
for proxymap-over-TCP, to share a Postfix database between hosts,
is expected to be completed in the Postfix 2.10 development cycle.

[Feature 20111209] memcache lookup and update support. This provides
a way to share postscreen(8) or verify(8) caches between Postfix
instances.  

[Feature 20111203] Support for time-dependent sender addresses
of address verification probes. The default address, double-bounce,
may end up on spammer blacklists. Although Postfix discards mail
for this address, such mail still uses up network bandwidth and
server resources. Specify an address_verify_sender_ttl value of
several hours or more to frustrate address harvesting.

Major changes - session transcript notification
-----------------------------------------------

[Incompat 20120114] By default the Postfix SMTP server no longer
reports transcripts of sessions where a client command is rejected
because a lookup table is unavailable. Postfix now implements gradual
degradation, for example, the SMTP server keeps running instead of
terminating with a fatal error. This change in error handling would
result in a very large number of "transcript of session" email
notifications when an LDAP or *SQL server goes down).

To receive such reports, add the new "data" class to the notify_classes
parameter value. The reports will be sent to the error_notice_recipient
address as before.  This class is also used by the Postfix SMTP
client to report about sessions that fail because a table is
unavailable.

Major changes - logging
----------------------------------------

[Incompat 20120114] Logfile-based alerting systems may need to be
updated to look for "error" messages in addition to "fatal" messages.
Specify "daemon_table_open_error_is_fatal = yes" to get the historical
behavior (immediate termination with "fatal" message).

[Incompat 20111214] Logfile-based analysis tools may need to be
updated. The submission and smtps examples in the sample master.cf
file were updated to make their logging easier to distinguish.

See the source file pflogsumm_quickfix.txt for a "quick fix".

[Incompat 20111205] Postfix now logs the result of successful TLS
negotiation with TLS logging levels of 0. See the smtp_tls_loglevel
and smtpd_tls_loglevel descriptions in the postconf(5) manpage for
other minor differences.

[Incompat 20110219] The Postfix SMTP and QMQP servers now log
"hostname X does not resolve to address Y", when a "reverse hostname"
lookup result does not resolve to the client IP address. Until now
these servers logged "Y: hostname X verification failed" or "Y:
address not listed for hostname X" which people found confusing.
