]> git.ipfire.org Git - thirdparty/postfix.git/commitdiff
postfix-3.3-20171227
authorWietse Venema <wietse@porcupine.org>
Wed, 27 Dec 2017 05:00:00 +0000 (00:00 -0500)
committerViktor Dukhovni <postfix-users@dukhovni.org>
Mon, 1 Jan 2018 21:57:07 +0000 (16:57 -0500)
13 files changed:
postfix/HISTORY
postfix/README_FILES/MILTER_README
postfix/html/FORWARD_SECRECY_README.html
postfix/html/MILTER_README.html
postfix/html/SMTPD_ACCESS_README.html
postfix/html/pgsql_table.5.html
postfix/man/man5/pgsql_table.5
postfix/proto/FORWARD_SECRECY_README.html
postfix/proto/MILTER_README.html
postfix/proto/SMTPD_ACCESS_README.html
postfix/proto/pgsql_table
postfix/src/global/dict_pgsql.c
postfix/src/global/mail_version.h

index 2d6887de9976a0be6d1c141e4d5dff2f6e902eb1..accbaa63f774508275dbb33512a2dafa7902ed3a 100644 (file)
@@ -23215,7 +23215,7 @@ Apologies for any names omitted.
 20171223
 
        Feature: Milters can now send RET and ENVID arguments in
-       SMFI_CHGFROM requests. Files: cleanup/Makefile.in,
+       SMFIR_CHGFROM requests. Files: cleanup/Makefile.in,
        cleanup/cleanup.h, cleanup/cleanup_envelope.c,
        cleanup/cleanup_milter.c, cleanup/cleanup_milter.in13h,
        cleanup/cleanup_milter.in13i, cleanup/cleanup_milter.ref13c,
@@ -23224,3 +23224,14 @@ Apologies for any names omitted.
        cleanup/cleanup_milter.ref13i, cleanup/cleanup_state.c,
        cleanup/test-queue-file13h, cleanup/test-queue-file13i,
        oqmgr/qmgr_message.c, qmgr/qmgr_message.c.
+
+20171226
+
+       Documentation patches by Sven Neuhaus. Files:
+       proto/FORWARD_SECRECY_README.html, proto/MILTER_README.html,
+       proto/SMTPD_ACCESS_README.html.
+
+20171227
+
+       Feature: postgresql:// URI support by Magosányi Árpád.
+       Files: global/dict_pgsql.c, proto/pgsql_table.
index a1b68b68d47cb2f1c26ead07873ba356c2c84427..6cdea837ddac0753ab9f166714d69fb6ae614c19 100644 (file)
@@ -1,8 +1,8 @@
-Postfix before-queue Milter support
+P\bPo\bos\bst\btf\bfi\bix\bx b\bbe\bef\bfo\bor\bre\be-\b-q\bqu\bue\beu\bue\be M\bMi\bil\blt\bte\ber\br s\bsu\bup\bpp\bpo\bor\brt\bt
 
 -------------------------------------------------------------------------------
 
-Introduction
+I\bIn\bnt\btr\bro\bod\bdu\buc\bct\bti\bio\bon\bn
 
 Postfix implements support for the Sendmail version 8 Milter (mail filter)
 protocol. This protocol is used by applications that run outside the MTA to
@@ -30,7 +30,7 @@ This document provides information on the following topics:
   * Workarounds
   * Limitations
 
-How Milter applications plug into Postfix
+H\bHo\bow\bw M\bMi\bil\blt\bte\ber\br a\bap\bpp\bpl\bli\bic\bca\bat\bti\bio\bon\bns\bs p\bpl\blu\bug\bg i\bin\bnt\bto\bo P\bPo\bos\bst\btf\bfi\bix\bx
 
 The Postfix Milter implementation uses two different lists of mail filters: one
 list of filters for SMTP mail only, and one list of filters for non-SMTP mail.
@@ -80,7 +80,7 @@ Postfix architecture).
 
     Local   -> sendmail(1)
 
-Building Milter applications
+B\bBu\bui\bil\bld\bdi\bin\bng\bg M\bMi\bil\blt\bte\ber\br a\bap\bpp\bpl\bli\bic\bca\bat\bti\bio\bon\bns\bs
 
 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
@@ -94,25 +94,25 @@ some Linux systems).
 Once libmilter is installed, applications such as OpenDKIM and OpenDMARC build
 out of the box without requiring any tinkering:
 
-    $ gzcat opendkim-x.y.z.tar.gz | tar xf -
-    $ cd opendkim-x.y.z
-    $ ./configure ...options...
-    $ make
+    $ g\bgz\bzc\bca\bat\bt o\bop\bpe\ben\bnd\bdk\bki\bim\bm-\b-x\bx.\b.y\by.\b.z\bz.\b.t\bta\bar\br.\b.g\bgz\bz |\b| t\bta\bar\br x\bxf\bf -\b-
+    $ c\bcd\bd o\bop\bpe\ben\bnd\bdk\bki\bim\bm-\b-x\bx.\b.y\by.\b.z\bz
+    $ .\b./\b/c\bco\bon\bnf\bfi\big\bgu\bur\bre\be .\b..\b..\b.o\bop\bpt\bti\bio\bon\bns\bs.\b..\b..\b.
+    $ m\bma\bak\bke\be
     [...lots of output omitted...]
-    $ make install
+    $ m\bma\bak\bke\be i\bin\bns\bst\bta\bal\bll\bl
 
-Running Milter applications
+R\bRu\bun\bnn\bni\bin\bng\bg M\bMi\bil\blt\bte\ber\br a\bap\bpp\bpl\bli\bic\bca\bat\bti\bio\bon\bns\bs
 
 To run a Milter application, see the documentation of the filter for options. A
 typical command looks like this:
 
-    # /some/where/opendkim -l -u userid -p inet:portnumber@localhost ...other
-    options...
+    # /\b/s\bso\bom\bme\be/\b/w\bwh\bhe\ber\bre\be/\b/o\bop\bpe\ben\bnd\bdk\bki\bim\bm -\b-l\bl -\b-u\bu u\bus\bse\ber\bri\bid\bd -\b-p\bp i\bin\bne\bet\bt:\b:p\bpo\bor\brt\btn\bnu\bum\bmb\bbe\ber\br@\b@l\blo\boc\bca\bal\blh\bho\bos\bst\bt .\b..\b..\b.o\bot\bth\bhe\ber\br
+    o\bop\bpt\bti\bio\bon\bns\bs.\b..\b..\b.
 
 Please specify a userid value that isn't used for other applications (not
 "postfix", not "www", etc.).
 
-Configuring Postfix
+C\bCo\bon\bnf\bfi\big\bgu\bur\bri\bin\bng\bg P\bPo\bos\bst\btf\bfi\bix\bx
 
 Like Sendmail, Postfix has a lot of configuration options that control how it
 talks to Milter applications. Besides global options that apply to all Milter
@@ -131,7 +131,7 @@ Information in this section:
   * Sendmail macro emulation
   * What macros will Postfix send to Milters?
 
-SMTP-Only Milter applications
+S\bSM\bMT\bTP\bP-\b-O\bOn\bnl\bly\by M\bMi\bil\blt\bte\ber\br a\bap\bpp\bpl\bli\bic\bca\bat\bti\bio\bon\bns\bs
 
 The SMTP-only Milter applications handle mail that arrives via the Postfix
 smtpd(8) server. They are typically used to filter unwanted mail, and to sign
@@ -159,23 +159,23 @@ from other Milter applications.
 
 The general syntax for listening sockets is as follows:
 
-    unix:pathname
+    u\bun\bni\bix\bx:\b:pathname
         Connect to the local UNIX-domain server that is bound to the specified
         pathname. If the smtpd(8) or cleanup(8) process runs chrooted, an
         absolute pathname is interpreted relative to the Postfix queue
         directory.
 
-    inet:host:port
+    i\bin\bne\bet\bt:\b:host:\b:port
         Connect to the specified TCP port on the specified local or remote
         host. The host and port can be specified in numeric or symbolic form.
 
         NOTE: Postfix syntax differs from Milter syntax which has the form
-        inet:port@host.
+        i\bin\bne\bet\bt:\b:port@\b@host.
 
 For advanced configuration see "Different settings for different SMTP clients"
 and "Different settings for different Milter applications".
 
-Non-SMTP Milter applications
+N\bNo\bon\bn-\b-S\bSM\bMT\bTP\bP M\bMi\bil\blt\bte\ber\br a\bap\bpp\bpl\bli\bic\bca\bat\bti\bio\bon\bns\bs
 
 The non-SMTP Milter applications handle mail that arrives via the Postfix
 sendmail(1) command-line or via the Postfix qmqpd(8) server. They are typically
@@ -226,7 +226,7 @@ must not REJECT or TEMPFAIL simulated RCPT TO commands. When a
 non_smtpd_milters application REJECTs or TEMPFAILs a recipient, Postfix will
 report a configuration error, and mail will stay in the queue.
 
-Signing internally-generated bounce messages
+S\bSi\big\bgn\bni\bin\bng\bg i\bin\bnt\bte\ber\brn\bna\bal\bll\bly\by-\b-g\bge\ben\bne\ber\bra\bat\bte\bed\bd b\bbo\bou\bun\bnc\bce\be m\bme\bes\bss\bsa\bag\bge\bes\bs
 
 Postfix normally does not apply content filters to mail that is generated
 internally such as bounces or Postmaster notifications. Filtering internally-
@@ -243,7 +243,7 @@ non_smtpd_milters, header_checks or body_checks (lines 3-5 below).
     4     header_checks = don't reject internally-generated bounces
     5     body_checks = don't reject internally-generated bounces
 
-Milter error handling
+M\bMi\bil\blt\bte\ber\br e\ber\brr\bro\bor\br h\bha\ban\bnd\bdl\bli\bin\bng\bg
 
 The milter_default_action parameter specifies how Postfix handles Milter
 application errors. The default action is to respond with a temporary error
@@ -260,16 +260,16 @@ the message in the "hold" queue, and is available with Postfix 2.6 or later.
 See "Different settings for different Milter applications" for advanced
 configuration options.
 
-Milter protocol version
+M\bMi\bil\blt\bte\ber\br p\bpr\bro\bot\bto\boc\bco\bol\bl v\bve\ber\brs\bsi\bio\bon\bn
 
 As Postfix is not built with the Sendmail libmilter library, you may need to
 configure the Milter protocol version that Postfix should use. The default
 version is 6 (before Postfix 2.6 the default version is 2).
 
     /etc/postfix/main.cf:
-        # Postfix  2.6
+        # Postfix >= 2.6
         milter_protocol = 6
-        # 2.3 ≤ Postfix ≤ 2.5
+        # 2.3 <= Postfix <= 2.5
         milter_protocol = 2
 
 If the Postfix milter_protocol setting specifies a too low version, the
@@ -298,21 +298,21 @@ libmilter library does not expect.
 See "Different settings for different Milter applications" for advanced
 configuration options.
 
-Milter protocol timeouts
+M\bMi\bil\blt\bte\ber\br p\bpr\bro\bot\bto\boc\bco\bol\bl t\bti\bim\bme\beo\bou\but\bts\bs
 
 Postfix uses different time limits at different Milter protocol stages. The
 table shows the timeout settings and the corresponding protocol stages (EOH =
 end of headers; EOM = end of message).
 
-     _________________________________________________________________
-    |Postfix parameter     |Time limit|Milter protocol stage          |
-    |______________________|__________|_______________________________|
+     _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b 
+    |P\bPo\bos\bst\btf\bfi\bix\bx p\bpa\bar\bra\bam\bme\bet\bte\ber\br     |T\bTi\bim\bme\be l\bli\bim\bmi\bit\bt|M\bMi\bil\blt\bte\ber\br p\bpr\bro\bot\bto\boc\bco\bol\bl s\bst\bta\bag\bge\be          |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
     |milter_connect_timeout|30s       |CONNECT                        |
-    |______________________|__________|_______________________________|
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
     |milter_command_timeout|30s       |HELO, MAIL, RCPT, DATA, UNKNOWN|
-    |______________________|__________|_______________________________|
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
     |milter_content_timeout|300s      |HEADER, EOH, BODY, EOM         |
-    |______________________|__________|_______________________________|
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
 
 Beware: 30s may be too short for Milter applications that do lots of DNS
 lookups. However, if you increase the above timeouts too much, remote SMTP
@@ -322,7 +322,7 @@ inherent problem with before-queue filtering.
 See "Different settings for different Milter applications" for advanced
 configuration options.
 
-Different settings for different Milter applications
+D\bDi\bif\bff\bfe\ber\bre\ben\bnt\bt s\bse\bet\btt\bti\bin\bng\bgs\bs f\bfo\bor\br d\bdi\bif\bff\bfe\ber\bre\ben\bnt\bt M\bMi\bil\blt\bte\ber\br a\bap\bpp\bpl\bli\bic\bca\bat\bti\bio\bon\bns\bs
 
 The previous sections list a number of Postfix main.cf parameters that control
 time limits and other settings for all Postfix Milter clients. This is
@@ -349,11 +349,11 @@ Instead of a server endpoint, we now have a list enclosed in {}.
     content_timeout, default_action, and protocol.
 
 Inside the list, syntax is similar to what we already know from main.cf: items
-separated by space or comma. There is one difference: you must enclose a
-setting in parentheses, as in "{ name = value }", if you want to have space or
-comma within a value or around "=".
+separated by space or comma. There is one difference: y\byo\bou\bu m\bmu\bus\bst\bt e\ben\bnc\bcl\blo\bos\bse\be a\ba
+s\bse\bet\btt\bti\bin\bng\bg i\bin\bn p\bpa\bar\bre\ben\bnt\bth\bhe\bes\bse\bes\bs,\b, a\bas\bs i\bin\bn "\b"{\b{ n\bna\bam\bme\be =\b= v\bva\bal\blu\bue\be }\b}"\b",\b, i\bif\bf y\byo\bou\bu w\bwa\ban\bnt\bt t\bto\bo h\bha\bav\bve\be s\bsp\bpa\bac\bce\be o\bor\br
+c\bco\bom\bmm\bma\ba w\bwi\bit\bth\bhi\bin\bn a\ba v\bva\bal\blu\bue\be o\bor\br a\bar\bro\bou\bun\bnd\bd "\b"=\b="\b".
 
-Different settings for different SMTP clients
+D\bDi\bif\bff\bfe\ber\bre\ben\bnt\bt s\bse\bet\btt\bti\bin\bng\bgs\bs f\bfo\bor\br d\bdi\bif\bff\bfe\ber\bre\ben\bnt\bt S\bSM\bMT\bTP\bP c\bcl\bli\bie\ben\bnt\bts\bs
 
 The smtpd_milter_maps feature supports different Milter settings for different
 client IP addresses. Lookup results override the the global smtpd_milters
@@ -373,7 +373,7 @@ local address ranges:
 
 This feature is available with Postfix 3.2 and later.
 
-Sendmail macro emulation
+S\bSe\ben\bnd\bdm\bma\bai\bil\bl m\bma\bac\bcr\bro\bo e\bem\bmu\bul\bla\bat\bti\bio\bon\bn
 
 Postfix emulates a limited number of Sendmail macros, as shown in the table.
 Some macro values depend on whether a recipient is rejected (rejected
@@ -382,70 +382,92 @@ macros are available at different Milter protocol stages (EOH = end-of-header,
 EOM = end-of-message); their availability is not always the same as in
 Sendmail. See the workarounds section below for solutions.
 
-     _________________________________________________________________________________________________________________________________________
-    |Sendmail macro      |Milter protocol stage                          |Description                                                         |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |i                   |DATA, EOH, EOM                                 |Queue ID, also Postfix queue file name                              |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |j                   |Always                                         |Value of myhostname                                                 |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |_                   |Always                                         |The validated client name and address                               |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |{auth_authen}       |MAIL, DATA, EOH, EOM                           |SASL login name                                                     |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |{auth_author}       |MAIL, DATA, EOH, EOM                           |SASL sender                                                         |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |{auth_type}         |MAIL, DATA, EOH, EOM                           |SASL login method                                                   |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |{client_addr}       |Always                                         |Remote client IP address                                            |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |{client_connections}|CONNECT                                        |Connection concurrency for this client (zero if the client is       |
-    |                    |                                               |excluded from all smtpd_client_* limits).                           |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |                    |                                               |Remote client hostname                                              |
-    |{client_name}       |Always                                         |When address → name lookup or name → address verification fails:|
-    |                    |                                               |"unknown"                                                           |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |{client_port}       |Always (Postfix ≥2.5)                        |Remote client TCP port                                              |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |{client_ptr}        |CONNECT, HELO, MAIL, DATA                      |Client name from address → name lookup                            |
-    |                    |                                               |When address → name lookup fails: "unknown"                       |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |{cert_issuer}       |HELO, MAIL, DATA, EOH, EOM                     |TLS client certificate issuer                                       |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |{cert_subject}      |HELO, MAIL, DATA, EOH, EOM                     |TLS client certificate subject                                      |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |{cipher_bits}       |HELO, MAIL, DATA, EOH, EOM                     |TLS session key size                                                |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |{cipher}            |HELO, MAIL, DATA, EOH, EOM                     |TLS cipher                                                          |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |{daemon_addr}       |Always (Postfix ≥3.2)                        |Local server IP address                                             |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |{daemon_name}       |Always                                         |value of milter_macro_daemon_name                                   |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |{daemon_port}       |Always (Postfix ≥3.2)                        |Local server TCP port                                               |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |{mail_addr}         |MAIL                                           |Sender address                                                      |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |{mail_host}         |MAIL (Postfix ≥ 2.6, only with smtpd_milters)|Sender next-hop destination                                         |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |{mail_mailer}       |MAIL (Postfix ≥ 2.6, only with smtpd_milters)|Sender mail delivery transport                                      |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |{rcpt_addr}         |RCPT                                           |Recipient address                                                   |
-    |                    |                                               |With rejected recipient: descriptive text                           |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |{rcpt_host}         |RCPT (Postfix ≥ 2.6, only with smtpd_milters)|Recipient next-hop destination                                      |
-    |                    |                                               |With rejected recipient: enhanced status code                       |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |{rcpt_mailer}       |RCPT (Postfix ≥ 2.6, only with smtpd_milters)|Recipient mail delivery transport                                   |
-    |                    |                                               |With rejected recipient: "error"                                    |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |{tls_version}       |HELO, MAIL, DATA, EOH, EOM                     |TLS protocol version                                                |
-    |____________________|_______________________________________________|____________________________________________________________________|
-    |v                   |Always                                         |value of milter_macro_v                                             |
-    |____________________|_______________________________________________|____________________________________________________________________|
-
-What macros will Postfix send to Milters?
+     _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b 
+    |S\bSe\ben\bnd\bdm\bma\bai\bil\bl m\bma\bac\bcr\bro\bo      |M\bMi\bil\blt\bte\ber\br p\bpr\bro\bot\bto\boc\bco\bol\bl s\bst\bta\bag\bge\be    |D\bDe\bes\bsc\bcr\bri\bip\bpt\bti\bio\bon\bn               |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |i                   |DATA, EOH, EOM           |Queue ID, also Postfix    |
+    |                    |                         |queue file name           |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |j                   |Always                   |Value of myhostname       |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |_                   |Always                   |The validated client name |
+    |                    |                         |and address               |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |{auth_authen}       |MAIL, DATA, EOH, EOM     |SASL login name           |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |{auth_author}       |MAIL, DATA, EOH, EOM     |SASL sender               |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |{auth_type}         |MAIL, DATA, EOH, EOM     |SASL login method         |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |{client_addr}       |Always                   |Remote client IP address  |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |                    |                         |Connection concurrency for|
+    |                    |                         |this client (zero if the  |
+    |{client_connections}|CONNECT                  |client is excluded from   |
+    |                    |                         |all smtpd_client_*        |
+    |                    |                         |limits).                  |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |                    |                         |Remote client hostname    |
+    |                    |                         |When address -> name      |
+    |{client_name}       |Always                   |lookup or name -> address |
+    |                    |                         |verification fails:       |
+    |                    |                         |"unknown"                 |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |{client_port}       |Always (Postfix >=2.5)   |Remote client TCP port    |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |                    |                         |Client name from address -|
+    |{client_ptr}        |CONNECT, HELO, MAIL, DATA|> name lookup             |
+    |                    |                         |When address -> name      |
+    |                    |                         |lookup fails: "unknown"   |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |{cert_issuer}       |HELO, MAIL, DATA, EOH,   |TLS client certificate    |
+    |                    |EOM                      |issuer                    |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |{cert_subject}      |HELO, MAIL, DATA, EOH,   |TLS client certificate    |
+    |                    |EOM                      |subject                   |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |{cipher_bits}       |HELO, MAIL, DATA, EOH,   |TLS session key size      |
+    |                    |EOM                      |                          |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |{cipher}            |HELO, MAIL, DATA, EOH,   |TLS cipher                |
+    |                    |EOM                      |                          |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |{daemon_addr}       |Always (Postfix >=3.2)   |Local server IP address   |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |{daemon_name}       |Always                   |value of                  |
+    |                    |                         |milter_macro_daemon_name  |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |{daemon_port}       |Always (Postfix >=3.2)   |Local server TCP port     |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |{mail_addr}         |MAIL                     |Sender address            |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |{mail_host}         |MAIL (Postfix >= 2.6,    |Sender next-hop           |
+    |                    |only with smtpd_milters) |destination               |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |{mail_mailer}       |MAIL (Postfix >= 2.6,    |Sender mail delivery      |
+    |                    |only with smtpd_milters) |transport                 |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |                    |                         |Recipient address         |
+    |{rcpt_addr}         |RCPT                     |With rejected recipient:  |
+    |                    |                         |descriptive text          |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |                    |                         |Recipient next-hop        |
+    |{rcpt_host}         |RCPT (Postfix >= 2.6,    |destination               |
+    |                    |only with smtpd_milters) |With rejected recipient:  |
+    |                    |                         |enhanced status code      |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |                    |                         |Recipient mail delivery   |
+    |{rcpt_mailer}       |RCPT (Postfix >= 2.6,    |transport                 |
+    |                    |only with smtpd_milters) |With rejected recipient:  |
+    |                    |                         |"error"                   |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |{tls_version}       |HELO, MAIL, DATA, EOH,   |TLS protocol version      |
+    |                    |EOM                      |                          |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+    |v                   |Always                   |value of milter_macro_v   |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
+
+W\bWh\bha\bat\bt m\bma\bac\bcr\bro\bos\bs w\bwi\bil\bll\bl P\bPo\bos\bst\btf\bfi\bix\bx s\bse\ben\bnd\bd t\bto\bo M\bMi\bil\blt\bte\ber\brs\bs?\b?
 
 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
@@ -456,26 +478,26 @@ 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
 takes precedence over a Postfix-specified list.
 
-     ___________________________________________________________________
-    |Postfix parameter            |Milter protocol|Milter protocol stage|
-    |                             |version        |                     |
-    |_____________________________|_______________|_____________________|
+     _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b 
+    |P\bPo\bos\bst\btf\bfi\bix\bx p\bpa\bar\bra\bam\bme\bet\bte\ber\br            |M\bMi\bil\blt\bte\ber\br p\bpr\bro\bot\bto\boc\bco\bol\bl|M\bMi\bil\blt\bte\ber\br p\bpr\bro\bot\bto\boc\bco\bol\bl s\bst\bta\bag\bge\be|
+    |                             |v\bve\ber\brs\bsi\bio\bon\bn        |                     |
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
     |milter_connect_macros        |2 or higher    |CONNECT              |
-    |_____________________________|_______________|_____________________|
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
     |milter_helo_macros           |2 or higher    |HELO/EHLO            |
-    |_____________________________|_______________|_____________________|
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
     |milter_mail_macros           |2 or higher    |MAIL FROM            |
-    |_____________________________|_______________|_____________________|
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
     |milter_rcpt_macros           |2 or higher    |RCPT TO              |
-    |_____________________________|_______________|_____________________|
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
     |milter_data_macros           |4 or higher    |DATA                 |
-    |_____________________________|_______________|_____________________|
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
     |milter_end_of_header_macros  |6 or higher    |EOH                  |
-    |_____________________________|_______________|_____________________|
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
     |milter_end_of_data_macros    |2 or higher    |EOM                  |
-    |_____________________________|_______________|_____________________|
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
     |milter_unknown_command_macros|3 or higher    |unknown command      |
-    |_____________________________|_______________|_____________________|
+    |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
 
 By default, Postfix will send only macros whose values have been updated with
 information from main.cf or master.cf, from an SMTP session (for example; SASL
@@ -487,7 +509,7 @@ specify macro default values with the milter_macro_defaults parameter. Specify
 zero or more name=value pairs separated by comma or whitespace; you may even
 specify macro names that Postfix does know about!
 
-Workarounds
+W\bWo\bor\brk\bka\bar\bro\bou\bun\bnd\bds\bs
 
   * To avoid breaking DKIM etc. signatures with an SMTP-based content filter,
     update the before-filter SMTP client in master.cf, and add a line with "-
@@ -506,7 +528,7 @@ Workarounds
 
   * Some Milter applications use the "{if_addr}" macro to recognize local mail;
     this macro does not exist in Postfix. Workaround: use the "{daemon_addr}"
-    (Postfix  3.2) or "{client_addr}" macro instead.
+    (Postfix >= 3.2) or "{client_addr}" macro instead.
 
   * Some Milter applications log a warning that looks like this:
 
@@ -535,19 +557,19 @@ Workarounds
       o Edit the filter source file (typically named xxx-filter/xxx-filter.c or
         similar).
 
-      o Look up the mlfi_eom() function and add code near the top shown as bold
+      o Look up the mlfi_eom() function and add code near the top shown as b\bbo\bol\bld\bd
         text below:
 
         dfc = cc->cctx_msg;
         assert(dfc != NULL);
 
-        /* Determine the job ID for logging. */
-        if (dfc->mctx_jobid == 0 || strcmp(dfc->mctx_jobid, JOBIDUNKNOWN) == 0)
-        {
-                char *jobid = smfi_getsymval(ctx, "i");
-                if (jobid != 0)
-                        dfc->mctx_jobid = jobid;
-        }
+        /\b/*\b* D\bDe\bet\bte\ber\brm\bmi\bin\bne\be t\bth\bhe\be j\bjo\bob\bb I\bID\bD f\bfo\bor\br l\blo\bog\bgg\bgi\bin\bng\bg.\b. *\b*/\b/
+        i\bif\bf (\b(d\bdf\bfc\bc-\b->\b>m\bmc\bct\btx\bx_\b_j\bjo\bob\bbi\bid\bd =\b==\b= 0\b0 |\b||\b| s\bst\btr\brc\bcm\bmp\bp(\b(d\bdf\bfc\bc-\b->\b>m\bmc\bct\btx\bx_\b_j\bjo\bob\bbi\bid\bd,\b, J\bJO\bOB\bBI\bID\bDU\bUN\bNK\bKN\bNO\bOW\bWN\bN)\b) =\b==\b= 0\b0)\b)
+        {\b{
+                c\bch\bha\bar\br *\b*j\bjo\bob\bbi\bid\bd =\b= s\bsm\bmf\bfi\bi_\b_g\bge\bet\bts\bsy\bym\bmv\bva\bal\bl(\b(c\bct\btx\bx,\b, "\b"i\bi"\b")\b);\b;
+                i\bif\bf (\b(j\bjo\bob\bbi\bid\bd !\b!=\b= 0\b0)\b)
+                        d\bdf\bfc\bc-\b->\b>m\bmc\bct\btx\bx_\b_j\bjo\bob\bbi\bid\bd =\b= j\bjo\bob\bbi\bid\bd;\b;
+        }\b}
 
     NOTES:
 
@@ -559,7 +581,7 @@ Workarounds
       o This change fixes only the ugly message header, but not the WARNING
         message. Fortunately, many Milters log that message only once.
 
-Limitations
+L\bLi\bim\bmi\bit\bta\bat\bti\bio\bon\bns\bs
 
 This section lists limitations of the Postfix Milter implementation. Some
 limitations will be removed as the implementation is extended over time. Of
@@ -569,22 +591,22 @@ the CONTENT_INSPECTION_README document for a discussion.
   * The Milter protocol has evolved over time. Therefore, different Postfix
     versions implement different feature sets.
 
-     ________________________________________________________________________
-    |Postfix|Supported Milter requests                                       |
-    |_______|________________________________________________________________|
+     _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b 
+    |P\bPo\bos\bst\btf\bfi\bix\bx|S\bSu\bup\bpp\bpo\bor\brt\bte\bed\bd M\bMi\bil\blt\bte\ber\br r\bre\beq\bqu\bue\bes\bst\bts\bs                                       |
+    |_\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
     |   2.6 |All Milter requests of Sendmail 8.14.0 (see notes below).       |
-    |_______|________________________________________________________________|
+    |_\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
     |       |All Milter requests of Sendmail 8.14.0, except:                 |
     |       |SMFIP_RCPT_REJ (report rejected recipients to the mail filter), |
     |   2.5 |SMFIR_CHGFROM (replace sender, with optional ESMTP parameters), |
     |       |SMFIR_ADDRCPT_PAR (add recipient, with optional ESMTP           |
     |       |parameters).                                                    |
-    |_______|________________________________________________________________|
+    |_\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
     |   2.4 |All Milter requests of Sendmail 8.13.0.                         |
-    |_______|________________________________________________________________|
+    |_\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
     |   2.3 |All Milter requests of Sendmail 8.13.0, except:                 |
     |       |SMFIR_REPLBODY (replace message body).                          |
-    |_______|________________________________________________________________|
+    |_\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
 
   * For Milter applications that are written in C, you need to use the Sendmail
     libmilter library.
index e8416c47e47b4858600e1a32a1f323b4bf488398..b18d892d5b86c8f84c02c7d6a865475bb4b2824c 100644 (file)
@@ -341,9 +341,9 @@ few seconds to a few minutes): </p>
 <pre>
 # 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
+# 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>
index 99af63a12e63c88d2eebf58b132b9e554bed27e8..537ebbe8c4471028f658348c6da677193798aa3c 100644 (file)
@@ -785,7 +785,7 @@ example. </p>
 
 <li> <p> Some Milter applications use the "<tt>{if_addr}</tt>" macro
 to recognize local mail; this macro does not exist in Postfix.
-Workaround: use the "<tt>{daemon_addr}</tt>" (Postfix &ge 3.2) or
+Workaround: use the "<tt>{daemon_addr}</tt>" (Postfix &ge; 3.2) or
 "<tt>{client_addr}</tt>" macro instead. </p>
 
 <li> <p> Some Milter applications log a warning that looks like
index 411440c7af5a9eb94a5f9fcbe72f8ed82063c847..83235574a890a89e7055cb495dce83af4ba590c5 100644 (file)
@@ -251,7 +251,7 @@ Reject MAIL FROM information </td> </tr>
 relay policy</td>
 <td rowspan="2"> Reject RCPT TO information </td> </tr>
 
-<tr> <td> &lt 2.10</td> <td> Not available </td> 
+<tr> <td> &lt; 2.10</td> <td> Not available </td> 
 </tr>
 
 <tr> <td rowspan="2"> <a href="postconf.5.html#smtpd_recipient_restrictions">smtpd_recipient_restrictions</a> </td> <td> &ge;
@@ -259,7 +259,7 @@ relay policy</td>
 relay policy</td>
 <td rowspan="2"> Reject RCPT TO information </td> </tr>
 
-<tr> <td> &lt 2.10</td> <td> Required </td> </tr>
+<tr> <td> &lt; 2.10</td> <td> Required </td> </tr>
 
 <tr> <td> <a href="postconf.5.html#smtpd_data_restrictions">smtpd_data_restrictions</a> </td> <td> &ge; 2.0 </td> <td>
 Optional </td> <td>
index 17d887c98e94053f96f075cde2dfff0f7e45ee14..49c4476e977903055138a5dcb4b207dc5a45eb6c 100644 (file)
@@ -42,21 +42,18 @@ PGSQL_TABLE(5)                                                  PGSQL_TABLE(5)
 
 <b>PGSQL PARAMETERS</b>
        <b>hosts</b>  The hosts that Postfix will try to connect to  and  query  from.
-              Specify <i>unix:</i> for UNIX-domain sockets, <i>inet:</i> for TCP connections
-              (default).  Example:
+              Besides  a  <b>postgresql://</b>  connection URI, this setting supports
+              the historical forms <b>unix:/</b><i>pathname</i> for UNIX-domain sockets  and
+              <b>inet:</b><i>host:port</i>  for  TCP  connections, where the <b>unix:</b> and <b>inet:</b>
+              prefixes are accepted and ignored for  backwards  compatibility.
+              Examples:
+                  hosts = postgresql://username@example.com/tablename?sslmode=require
                   hosts = host1.some.domain host2.some.domain:port
                   hosts = unix:/file/name
 
-              The hosts are tried in random order, with all  connections  over
-              UNIX domain sockets being tried before those over TCP.  The con-
-              nections are automatically closed after being idle for  about  1
-              minute, and are re-opened as necessary.
-
-              NOTE:  the  <i>unix:</i>  and <i>inet:</i> prefixes are accepted for backwards
-              compatibility reasons, but are actually ignored.  The PostgreSQL
-              client  library  will always try to connect to an UNIX socket if
-              the name starts with a slash, and will try a TCP connection oth-
-              erwise.
+              The  hosts  are tried in random order. The connections are auto-
+              matically closed after being idle for about 1  minute,  and  are
+              re-opened as necessary.
 
        <b>user, password</b>
               The  user name and password to log into the pgsql server.  Exam-
index 2e6f587d66bdbde80fd9aa43e52158879c63370d..a55f2db31c3579bf7207b5ab76203aee107d1d98 100644 (file)
@@ -54,24 +54,22 @@ return the key itself or a constant value.
 .ad
 .fi
 .IP "\fBhosts\fR"
-The hosts that Postfix will try to connect to and query from.
-Specify \fIunix:\fR for UNIX\-domain sockets, \fIinet:\fR for TCP
-connections (default).  Example:
+The hosts that Postfix will try to connect to and query
+from. Besides a \fBpostgresql://\fR connection URI, this
+setting supports the historical forms \fBunix:/\fIpathname\fR
+for UNIX\-domain sockets and \fBinet:\fIhost:port\fR for TCP
+connections, where the \fBunix:\fR and \fBinet:\fR prefixes
+are accepted and ignored for backwards compatibility.
+Examples:
 .nf
+    hosts = postgresql://username@example.com/tablename?sslmode=require
     hosts = host1.some.domain host2.some.domain:port
     hosts = unix:/file/name
 .fi
 
-The hosts are tried in random order, with all connections over
-UNIX domain sockets being tried before those over TCP.  The
-connections are automatically closed after being idle for about
-1 minute, and are re\-opened as necessary.
-
-NOTE: the \fIunix:\fR and \fIinet:\fR prefixes are accepted for
-backwards compatibility reasons, but are actually ignored.
-The PostgreSQL client library will always try to connect to an
-UNIX socket if the name starts with a slash, and will try a TCP
-connection otherwise.
+The hosts are tried in random order. The connections are
+automatically closed after being idle for about 1 minute,
+and are re\-opened as necessary.
 .IP "\fBuser, password\fR"
 The user name and password to log into the pgsql server.
 Example:
index 7ff46579688971946b162e1f36dfffd4b5b4b53d..62593d2919b362dcd81faf272b75fc5df8007477 100644 (file)
@@ -341,9 +341,9 @@ few seconds to a few minutes): </p>
 <pre>
 # 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
+# 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>
index 6ccc8a6dfc5350c04108860c3f8a7e5d57a58532..886299f4f75502840c06cfe0fa3dc672c1cb15d7 100644 (file)
@@ -785,7 +785,7 @@ example. </p>
 
 <li> <p> Some Milter applications use the "<tt>{if_addr}</tt>" macro
 to recognize local mail; this macro does not exist in Postfix.
-Workaround: use the "<tt>{daemon_addr}</tt>" (Postfix &ge 3.2) or
+Workaround: use the "<tt>{daemon_addr}</tt>" (Postfix &ge; 3.2) or
 "<tt>{client_addr}</tt>" macro instead. </p>
 
 <li> <p> Some Milter applications log a warning that looks like
index ef45e1dd412351d67c29aa1d3a8451fefde5a722..5952bb278e1e8d3b23974cf023668cecac0e221c 100644 (file)
@@ -251,7 +251,7 @@ Reject MAIL FROM information </td> </tr>
 relay policy</td>
 <td rowspan="2"> Reject RCPT TO information </td> </tr>
 
-<tr> <td> &lt 2.10</td> <td> Not available </td> 
+<tr> <td> &lt; 2.10</td> <td> Not available </td> 
 </tr>
 
 <tr> <td rowspan="2"> smtpd_recipient_restrictions </td> <td> &ge;
@@ -259,7 +259,7 @@ relay policy</td>
 relay policy</td>
 <td rowspan="2"> Reject RCPT TO information </td> </tr>
 
-<tr> <td> &lt 2.10</td> <td> Required </td> </tr>
+<tr> <td> &lt; 2.10</td> <td> Required </td> </tr>
 
 <tr> <td> smtpd_data_restrictions </td> <td> &ge; 2.0 </td> <td>
 Optional </td> <td>
index bf9b3c837c9e2f4c7040823eecf7c6c77225aec6..fefc7a830ef09922bc5f8788140984184a12dfc2 100644 (file)
 # .ad
 # .fi
 # .IP "\fBhosts\fR"
-#      The hosts that Postfix will try to connect to and query from.
-#      Specify \fIunix:\fR for UNIX-domain sockets, \fIinet:\fR for TCP
-#      connections (default).  Example:
+#      The hosts that Postfix will try to connect to and query
+#      from. Besides a \fBpostgresql://\fR connection URI, this
+#      setting supports the historical forms \fBunix:/\fIpathname\fR
+#      for UNIX-domain sockets and \fBinet:\fIhost:port\fR for TCP
+#      connections, where the \fBunix:\fR and \fBinet:\fR prefixes
+#      are accepted and ignored for backwards compatibility.
+#      Examples:
 # .nf
+#          hosts = postgresql://username@example.com/tablename?sslmode=require
 #          hosts = host1.some.domain host2.some.domain:port
 #          hosts = unix:/file/name
 # .fi
 #
-#      The hosts are tried in random order, with all connections over
-#      UNIX domain sockets being tried before those over TCP.  The
-#      connections are automatically closed after being idle for about
-#      1 minute, and are re-opened as necessary.
-#
-#      NOTE: the \fIunix:\fR and \fIinet:\fR prefixes are accepted for
-#      backwards compatibility reasons, but are actually ignored.
-#      The PostgreSQL client library will always try to connect to an
-#      UNIX socket if the name starts with a slash, and will try a TCP
-#      connection otherwise.
+#      The hosts are tried in random order. The connections are
+#      automatically closed after being idle for about 1 minute,
+#      and are re-opened as necessary.
 # .IP "\fBuser, password\fR"
 #      The user name and password to log into the pgsql server.
 #      Example:
index e3e6d30274013ec48d97b37be57c3f90b7fd53d4..0ffc755863412cd74e39c7f7bb0e9b0502c997bf 100644 (file)
 #include "argv.h"
 #include "vstring.h"
 #include "split_at.h"
-#include "find_inet.h"
 #include "myrand.h"
 #include "events.h"
 #include "stringops.h"
 
 #define TYPEUNIX                       (1<<0)
 #define TYPEINET                       (1<<1)
+#define TYPECONNSTRING                 (1<<2)
 
 #define RETRY_CONN_MAX                 100
 #define RETRY_CONN_INTV                        60      /* 1 minute */
@@ -190,7 +190,7 @@ typedef struct {
     char   *hostname;
     char   *name;
     char   *port;
-    unsigned type;                     /* TYPEUNIX | TYPEINET */
+    unsigned type;                     /* TYPEUNIX | TYPEINET | TYPECONNSTRING*/
     unsigned stat;                     /* STATUNTRIED | STATFAIL | STATCUR */
     time_t  ts;                                /* used for attempting reconnection */
 } HOST;
@@ -469,7 +469,8 @@ static HOST *dict_pgsql_get_active(PLPGSQL *PLDB, char *dbname,
 
     /* try the active connections first; prefer the ones to UNIX sockets */
     if ((host = dict_pgsql_find_host(PLDB, STATACTIVE, TYPEUNIX)) != NULL ||
-       (host = dict_pgsql_find_host(PLDB, STATACTIVE, TYPEINET)) != NULL) {
+       (host = dict_pgsql_find_host(PLDB, STATACTIVE, TYPEINET)) != NULL ||
+       (host = dict_pgsql_find_host(PLDB, STATACTIVE, TYPECONNSTRING)) != NULL) {
        if (msg_verbose)
            msg_info("%s: found active connection to host %s", myname,
                     host->hostname);
@@ -485,7 +486,9 @@ static HOST *dict_pgsql_get_active(PLPGSQL *PLDB, char *dbname,
           ((host = dict_pgsql_find_host(PLDB, STATUNTRIED | STATFAIL,
                                         TYPEUNIX)) != NULL ||
            (host = dict_pgsql_find_host(PLDB, STATUNTRIED | STATFAIL,
-                                        TYPEINET)) != NULL)) {
+                                        TYPEINET)) != NULL ||
+           (host = dict_pgsql_find_host(PLDB, STATUNTRIED | STATFAIL,
+                                        TYPECONNSTRING)) != NULL)) {
        if (msg_verbose)
            msg_info("%s: attempting to connect to host %s", myname,
                     host->hostname);
@@ -624,9 +627,13 @@ static PGSQL_RES *plpgsql_query(DICT_PGSQL *dict_pgsql,
  */
 static void plpgsql_connect_single(HOST *host, char *dbname, char *username, char *password)
 {
-    if ((host->db = PQsetdbLogin(host->name, host->port, NULL, NULL,
-                                dbname, username, password)) == NULL
-       || PQstatus(host->db) != CONNECTION_OK) {
+    if (host->type == TYPECONNSTRING) {
+       host->db = PQconnectdb(host->name);
+    } else {
+       host->db = PQsetdbLogin(host->name, host->port, NULL, NULL,
+                               dbname, username, password);
+    }
+    if (host->db == NULL || PQstatus(host->db) != CONNECTION_OK) {
        msg_warn("connect to pgsql server %s: %s",
                 host->hostname, PQerrorMessage(host->db));
        plpgsql_down_host(host);
@@ -814,24 +821,37 @@ static HOST *host_init(const char *hostname)
     host->ts = 0;
 
     /*
-     * Ad-hoc parsing code. Expect "unix:pathname" or "inet:host:port", where
-     * both "inet:" and ":port" are optional.
+     * Modern syntax: "postgresql://connection-info".
      */
-    if (strncmp(d, "unix:", 5) == 0 || strncmp(d, "inet:", 5) == 0)
-       d += 5;
-    host->name = mystrdup(d);
-    host->port = split_at_right(host->name, ':');
-
-    /* This is how PgSQL distinguishes between UNIX and INET: */
-    if (host->name[0] && host->name[0] != '/')
-       host->type = TYPEINET;
-    else
-       host->type = TYPEUNIX;
+    if (strncmp(d, "postgresql:", 11) == 0) {
+       host->type = TYPECONNSTRING;
+       host->name = mystrdup(d);
+       host->port = 0;
+    }
 
+    /*
+     * Historical syntax: "unix:/pathname" and "inet:host:port". Strip the
+     * "unix:" and "inet:" prefixes. Look at the first character, which is
+     * how PgSQL historically distinguishes between UNIX and INET.
+     */
+    else {
+       if (strncmp(d, "unix:", 5) == 0 || strncmp(d, "inet:", 5) == 0)
+           d += 5;
+       host->name = mystrdup(d);
+       if (host->name[0] && host->name[0] != '/') {
+           host->type = TYPEINET;
+           host->port = split_at_right(host->name, ':');
+       } else {
+           host->type = TYPEUNIX;
+           host->port = 0;
+       }
+    }
     if (msg_verbose > 1)
        msg_info("%s: host=%s, port=%s, type=%s", myname, host->name,
                 host->port ? host->port : "",
-                host->type == TYPEUNIX ? "unix" : "inet");
+                host->type == TYPEUNIX ? "unix" :
+                host->type == TYPEINET ? "inet" :
+                "uri");
     return host;
 }
 
index 6d0e3198d59d50d08c3aa87ef395b9cd24b12ec3..ac1f0df5a0e385c9a019de88c893d80169ff214f 100644 (file)
@@ -20,7 +20,7 @@
   * Patches change both the patchlevel and the release date. Snapshots have no
   * patchlevel; they change the release date only.
   */
-#define MAIL_RELEASE_DATE      "20171223"
+#define MAIL_RELEASE_DATE      "20171227"
 #define MAIL_VERSION_NUMBER    "3.3"
 
 #ifdef SNAPSHOT