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. Incompatible change with Postfix 2.9.14 --------------------------------------- As of the middle of 2015, all supported Postfix releases no longer enable "export" grade ciphers for opportunistic TLS, and no longer use the deprecated SSLv2 and SSLv3 protocols for mandatory or opportunistic TLS. These changes are very unlikely to cause problems with server-to-server communication over the Internet, but they may result in interoperability problems with ancient client or server implementations on internal networks. To address this problem, you can revert the changes with: Postfix SMTP client settings: lmtp_tls_ciphers = export smtp_tls_ciphers = export lmtp_tls_protocols = !SSLv2 smtp_tls_protocols = !SSLv2 lmtp_tls_mandatory_protocols = !SSLv2 smtp_tls_mandatory_protocols = !SSLv2 Postfix SMTP server settings: smtpd_tls_ciphers = export smtpd_tls_protocols = smtpd_tls_mandatory_protocols = !SSLv2 These settings, if put in main.cf, affect all Postfix SMTP client or server communication, which may be undesirable. To be more selective, use "-o name=value" parameter overrides on specific services in master.cf. Execute the command "postfix reload" to make the changes effective. Debian Exim before 4.80-3 interoperability workaround ----------------------------------------------------- Debian Exim versions before 4.80-3 may fail to communicate with Postfix and possibly other MTAs, with the following Exim SMTP client error message: TLS error on connection to server-name [server-address] (gnutls_handshake): The Diffie-Hellman prime sent by the server is not acceptable (not long enough) This problem may affect Debian Exim versions before 4.80-3 that use TLS with EDH (Ephemeral Diffie-Hellman) key exchanges. For details see http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=676563 To restore Postfix SMTP server interoperability with affected Exim SMTP clients, configure the Postfix SMTP server to use a 2048-bit prime number instead of 1024: # cd /etc/postfix # openssl dhparam -out dh2048.pem 2048 # postconf -e 'smtpd_tls_dh1024_param_file = ${config_directory}/dh2048.pem' This change increases the CPU cost of EDH key exchanges (rarely a problem for SMTP servers) and is unlikely to cause problems with other SMTP client implementations. This problem should not affect EECDH (Ephemeral Elliptic Curve Diffie-Hellman) key exchanges. 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 ). 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 into UNIX format (lines ending in ). Specify "sendmail_fix_line_endings = strict" to restore historical Postfix behavior (i.e. convert all input lines ending in only if the first line ends in ). [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.