Sync usage with man page.
[netbsd-mini2440.git] / external / ibm-public / postfix / dist / README_FILES / MILTER_README
blob5dceb11e6c3e164df35a523a2d13f696f19166fb
1 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
3 -------------------------------------------------------------------------------
5 I\bIn\bnt\btr\bro\bod\bdu\buc\bct\bti\bio\bon\bn
7 Postfix implements support for the Sendmail version 8 Milter (mail filter)
8 protocol. This protocol is used by applications that run outside the MTA to
9 inspect SMTP events (CONNECT, DISCONNECT), SMTP commands (HELO, MAIL FROM,
10 etc.) as well as mail content (headers and body). All this happens before mail
11 is queued.
13 The reason for adding Milter support to Postfix is that there exists a large
14 collection of applications, not only to block unwanted mail, but also to verify
15 authenticity (examples: DomainKeys Identified Mail (DKIM), SenderID+SPF and
16 DomainKeys) or to digitally sign mail (examples: DomainKeys Identified Mail
17 (DKIM), DomainKeys). Having yet another Postfix-specific version of all that
18 software is a poor use of human and system resources.
20 The Milter protocol has evolved over time, and different Postfix versions
21 implement different feature sets. See the workarounds and limitations sections
22 at the end of this document for differences between Postfix and Sendmail
23 implementations.
25 This document provides information on the following topics:
27   * How Milter applications plug into Postfix
28   * Building Milter applications
29   * Running Milter applications
30   * Configuring Postfix
31   * Workarounds
32   * Limitations
34 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
36 The Postfix Milter implementation uses two different lists of mail filters: one
37 list of filters for SMTP mail only, and one list of filters for non-SMTP mail.
38 The two lists have different capabilities, which is unfortunate. Avoiding this
39 would require major restructuring of Postfix.
41   * The SMTP-only filters handle mail that arrives via the Postfix smtpd(8)
42     server. They are typically used to filter unwanted mail and to sign mail
43     from authorized SMTP clients. You specify SMTP-only Milter applications
44     with the smtpd_milters parameter as described in a later section. Mail that
45     arrives via the Postfix smtpd(8) server is not filtered by the non-SMTP
46     filters that are described next.
48   * The non-SMTP filters handle mail that arrives via the Postfix sendmail(1)
49     command-line or via the Postfix qmqpd(8) server. They are typically used to
50     digitally sign mail only. Although non-SMTP filters can be used to filter
51     unwanted mail, they have limitations compared to the SMTP-only filters. You
52     specify non-SMTP Milter applications with the non_smtpd_milters parameter
53     as described in a later section.
55 For those who are familiar with the Postfix architecture, the figure below
56 shows how Milter applications plug into Postfix. Names followed by a number are
57 Postfix commands or server programs, while unnumbered names inside shaded areas
58 represent Postfix queues. To avoid clutter, the path for local submission is
59 simplified (the OVERVIEW document has a more complete description of the
60 Postfix architecture).
62                SMTP-only      non-SMTP
63                  filters       filters
65                      ^ |
66                      | v
67                                    ^ |
68                                    | |
69     Network ->   smtpd(8)          | |
70                                    | v
72                            \
74     Network ->   qmqpd(8)  -> cleanup(8) -> incoming
76                            /
78                 pickup(8)
80                       :
82     Local   -> sendmail(1)
84 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
86 Milter applications have been written in C, JAVA and Perl, but this document
87 deals with C applications only. For these, you need an object library that
88 implements the Sendmail 8 Milter protocol. Postfix currently does not provide
89 such a library, but Sendmail does.
91   * The first option is to use a pre-compiled library. Some systems install the
92     Sendmail libmilter library by default. With other systems, libmilter may be
93     provided by a package (called "sendmail-devel" on some Linux systems).
95     Once libmilter is installed, applications such as dkim-milter and sid-
96     milter build out of the box without requiring any tinkering:
98         $ g\bgz\bzc\bca\bat\bt d\bdk\bki\bim\bm-\b-m\bmi\bil\blt\bte\ber\br-\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-
99         $ c\bcd\bd d\bdk\bki\bim\bm-\b-m\bmi\bil\blt\bte\ber\br-\b-x\bx.\b.y\by.\b.z\bz
100         $ m\bma\bak\bke\be
101         [...lots of output omitted...]
103   * The other option is to build the libmilter library from Sendmail source
104     code:
106         $ g\bgz\bzc\bca\bat\bt s\bse\ben\bnd\bdm\bma\bai\bil\bl-\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-
107         $ c\bcd\bd s\bse\ben\bnd\bdm\bma\bai\bil\bl-\b-x\bx.\b.y\by.\b.z\bz/\b/l\bli\bib\bbm\bmi\bil\blt\bte\ber\br
108         $ m\bma\bak\bke\be
109         [...lots of output omitted...]
111     After building your own libmilter library, follow the installation
112     instructions in the Milter application source distribution to specify the
113     location of the libmilter include files and object library. Typically,
114     these settings are configured in a file named sid-filter/Makefile.m4 or
115     similar:
117         APPENDDEF(`confINCDIRS', `-I/some/where/sendmail-x.y.z/include')
118         APPENDDEF(`confLIBDIRS', `-L/some/where/sendmail-x.y.z/obj.systemtype/
119         libmilter')
121     Then build the Milter application.
123 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
125 To run a Milter application, see the documentation of the filter for options. A
126 typical command looks like this:
128     # /\b/s\bso\bom\bme\be/\b/w\bwh\bhe\ber\bre\be/\b/d\bdk\bki\bim\bm-\b-f\bfi\bil\blt\bte\ber\br -\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
129     o\bop\bpt\bti\bio\bon\bns\bs.\b..\b..\b.
131 Please specify a userid value that isn't used for other applications (not
132 "postfix", not "www", etc.).
134 C\bCo\bon\bnf\bfi\big\bgu\bur\bri\bin\bng\bg P\bPo\bos\bst\btf\bfi\bix\bx
136 Like Sendmail, Postfix has a lot of configuration options that control how it
137 talks to Milter applications. With the initial Postfix Milter protocol
138 implementation, many options are global, that is, they apply to all Milter
139 applications. Future Postfix versions may support per-Milter timeouts, per-
140 Milter error handling, etc.
142 Information in this section:
144   * SMTP-Only Milter applications
145   * Non-SMTP Milter applications
146   * Milter error handling
147   * Milter protocol version
148   * Milter protocol timeouts
149   * Sendmail macro emulation
151 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
153 The SMTP-only Milter applications handle mail that arrives via the Postfix
154 smtpd(8) server. They are typically used to filter unwanted mail, and to sign
155 mail from authorized SMTP clients. Mail that arrives via the Postfix smtpd(8)
156 server is not filtered by the non-SMTP filters that are described in the next
157 section.
159 NOTE: Do not use the header_checks(5) IGNORE action to remove Postfix's own
160 Received: message header. This causes problems with mail signing filters.
161 Instead, keep Postfix's own Received: message header and use the header_checks
162 (5) REPLACE action to sanitize information.
164 You specify SMTP-only Milter applications (there can be more than one) with the
165 smtpd_milters parameter. Each Milter application is identified by the name of
166 its listening socket; other Milter configuration options will be discussed in
167 later sections. Milter applications are applied in the order as specified, and
168 the first Milter application that rejects a command will override the responses
169 from other Milter applications.
171     /etc/postfix/main.cf:
172         # Milters for mail that arrives via the smtpd(8) server.
173         # See below for socket address syntax.
174         smtpd_milters = inet:localhost:portnumber ...other filters...
176 The general syntax for listening sockets is as follows:
178     u\bun\bni\bix\bx:\b:pathname
179         Connect to the local UNIX-domain server that is bound to the specified
180         pathname. If the smtpd(8) or cleanup(8) process runs chrooted, an
181         absolute pathname is interpreted relative to the Postfix queue
182         directory.
184     i\bin\bne\bet\bt:\b:host:\b:port
185         Connect to the specified TCP port on the specified local or remote
186         host. The host and port can be specified in numeric or symbolic form.
188         NOTE: Postfix syntax differs from Milter syntax which has the form
189         i\bin\bne\bet\bt:\b:port@\b@host.
191 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
193 The non-SMTP Milter applications handle mail that arrives via the Postfix
194 sendmail(1) command-line or via the Postfix qmqpd(8) server. They are typically
195 used to digitally sign mail. Although non-SMTP filters can be used to filter
196 unwanted mail, there are limitations as discussed later in this section. Mail
197 that arrives via the Postfix smtpd(8) server is not filtered by the non-SMTP
198 filters.
200 NOTE: Do not use the header_checks(5) IGNORE action to remove Postfix's own
201 Received: message header. This causes problems with mail signing filters.
202 Instead, keep Postfix's own Received: message header and use the header_checks
203 (5) REPLACE action to sanitize information.
205 You specify non-SMTP Milter applications with the non_smtpd_milters parameter.
206 This parameter uses the same syntax as the smtpd_milters parameter in the
207 previous section. As with the SMTP-only filters, you can specify more than one
208 Milter application; they are applied in the order as specified, and the first
209 Milter application that rejects a command will override the responses from the
210 other applications.
212     /etc/postfix/main.cf:
213         # Milters for non-SMTP mail.
214         # See below for socket address syntax.
215         non_smtpd_milters = inet:localhost:portnumber ...other filters...
217 There's one small complication when using Milter applications for non-SMTP
218 mail: there is no SMTP session. To keep Milter applications happy, the Postfix
219 cleanup(8) server actually has to simulate the SMTP client CONNECT and
220 DISCONNECT events, and the SMTP client EHLO, MAIL FROM, RCPT TO and DATA
221 commands.
223   * When new mail arrives via the sendmail(1) command line, the Postfix cleanup
224     (8) server pretends that the mail arrives with ESMTP from "localhost" with
225     IP address "127.0.0.1". The result is very similar to what happens with
226     command line submissions in Sendmail version 8.12 and later, although
227     Sendmail uses a different mechanism to achieve this result.
229   * When new mail arrives via the qmqpd(8) server, the Postfix cleanup(8)
230     server pretends that the mail arrives with ESMTP, and uses the QMQPD client
231     hostname and IP address.
233   * When old mail is re-injected into the queue with "postsuper -r", the
234     Postfix cleanup(8) server uses the same client information that was used
235     when the mail arrived as new mail.
237 This generally works as expected, with only one exception: non-SMTP filters
238 must not REJECT or TEMPFAIL simulated RCPT TO commands. When a
239 non_smtpd_milters application REJECTs or TEMPFAILs a recipient, Postfix will
240 report a configuration error, and mail will stay in the queue.
242 None of this is a problem for mail filters that digitally sign mail.
244 M\bMi\bil\blt\bte\ber\br e\ber\brr\bro\bor\br h\bha\ban\bnd\bdl\bli\bin\bng\bg
246 The milter_default_action parameter specifies how Postfix handles Milter
247 application errors. The default action is to respond with a temporary error
248 status, so that the client will try again later. Specify "accept" if you want
249 to receive mail as if the filter does not exist, and "reject" to reject mail
250 with a permanent status. The "quarantine" action is like "accept" but freezes
251 the message in the "hold" queue, and is available with Postfix 2.6 or later.
253     /etc/postfix/main.cf:
254         # What to do in case of errors? Specify accept, reject, tempfail,
255         # or quarantine (Postfix 2.6 or later).
256         milter_default_action = tempfail
258 M\bMi\bil\blt\bte\ber\br p\bpr\bro\bot\bto\boc\bco\bol\bl v\bve\ber\brs\bsi\bio\bon\bn
260 As Postfix is not built with the Sendmail libmilter library, you may need to
261 configure the Milter protocol version that Postfix should use. The default
262 version is 6 (before Postfix 2.6 the default version is 2).
264     /etc/postfix/main.cf:
265         # Postfix >= 2.6
266         milter_protocol = 6
267         # 2.3 <= Postfix <= 2.5
268         milter_protocol = 2
270 If the Postfix milter_protocol setting specifies a too low version, the
271 libmilter library will log an error message like this:
273     application name: st_optionneg[xxxxx]: 0xyy does not fulfill action
274     requirements 0xzz
276 The remedy is to increase the Postfix milter_protocol version number. See,
277 however, the limitations section below for features that aren't supported by
278 Postfix.
280 If the Postfix milter_protocol setting specifies a too high version, the
281 libmilter library simply hangs up without logging a warning, and you see a
282 Postfix warning message like one of the following:
284     warning: milter inet:host:port: can't read packet header: Unknown error : 0
285     warning: milter inet:host:port: can't read packet header: Success
286     warning: milter inet:host:port: can't read SMFIC_DATA reply packet header:
287     No such file or directory
289 The remedy is to lower the Postfix milter_protocol version number.
291 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
293 Postfix uses different time limits at different Milter protocol stages. The
294 table shows the timeout settings and the corresponding protocol stages (EOH =
295 end of headers; EOM = end of message).
297      _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b 
298     |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          |
299     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
300     |milter_connect_timeout|30s       |CONNECT                        |
301     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
302     |milter_command_timeout|30s       |HELO, MAIL, RCPT, DATA, UNKNOWN|
303     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
304     |milter_content_timeout|300s      |HEADER, EOH, BODY, EOM         |
305     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
307 Beware: 30s may be too short for Milter applications that do lots of DNS
308 lookups. However, if you increase the above timeouts too much, remote SMTP
309 clients may hang up and mail may be delivered multiple times. This is an
310 inherent problem with before-queue filtering.
312 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
314 Postfix emulates a limited number of Sendmail macros, as shown in the table.
315 Some macro values depend on whether a recipient is rejected (rejected
316 recipients are available on request by the Milter application). Different
317 macros are available at different Milter protocol stages (EOH = end-of-header,
318 EOM = end-of-message); their availability is not always the same as in
319 Sendmail. See the workarounds section below for solutions.
321      _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b 
322     |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               |
323     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
324     |i                   |DATA, EOH, EOM           |Queue ID, also Postfix    |
325     |                    |                         |queue file name           |
326     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
327     |j                   |Always                   |Value of myhostname       |
328     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
329     |_                   |Always                   |The validated client name |
330     |                    |                         |and address               |
331     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
332     |{auth_authen}       |MAIL, DATA, EOH, EOM     |SASL login name           |
333     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
334     |{auth_author}       |MAIL, DATA, EOH, EOM     |SASL sender               |
335     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
336     |{auth_type}         |MAIL, DATA, EOH, EOM     |SASL login method         |
337     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
338     |{client_addr}       |Always                   |Client IP address         |
339     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
340     |{client_connections}|CONNECT                  |Connection concurrency for|
341     |                    |                         |this client               |
342     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
343     |                    |                         |Client hostname           |
344     |                    |                         |When address -> name      |
345     |{client_name}       |Always                   |lookup or name -> address |
346     |                    |                         |verification fails:       |
347     |                    |                         |"unknown"                 |
348     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
349     |{client_port}       |Always (Postfix >=2.5)   |Client TCP port           |
350     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
351     |                    |                         |Client name from address -|
352     |{client_ptr}        |CONNECT, HELO, MAIL, DATA|> name lookup             |
353     |                    |                         |When address -> name      |
354     |                    |                         |lookup fails: "unknown"   |
355     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
356     |{cert_issuer}       |HELO, MAIL, DATA, EOH,   |TLS client certificate    |
357     |                    |EOM                      |issuer                    |
358     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
359     |{cert_subject}      |HELO, MAIL, DATA, EOH,   |TLS client certificate    |
360     |                    |EOM                      |subject                   |
361     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
362     |{cipher_bits}       |HELO, MAIL, DATA, EOH,   |TLS session key size      |
363     |                    |EOM                      |                          |
364     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
365     |{cipher}            |HELO, MAIL, DATA, EOH,   |TLS cipher                |
366     |                    |EOM                      |                          |
367     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
368     |{daemon_name}       |Always                   |value of                  |
369     |                    |                         |milter_macro_daemon_name  |
370     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
371     |{mail_addr}         |MAIL                     |Sender address            |
372     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
373     |{mail_host}         |MAIL (Postfix >= 2.6,    |Sender next-hop           |
374     |                    |only with smtpd_milters) |destination               |
375     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
376     |{mail_mailer}       |MAIL (Postfix >= 2.6,    |Sender mail delivery      |
377     |                    |only with smtpd_milters) |transport                 |
378     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
379     |                    |                         |Recipient address         |
380     |{rcpt_addr}         |RCPT                     |With rejected recipient:  |
381     |                    |                         |descriptive text          |
382     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
383     |                    |                         |Recipient next-hop        |
384     |{rcpt_host}         |RCPT (Postfix >= 2.6,    |destination               |
385     |                    |only with smtpd_milters) |With rejected recipient:  |
386     |                    |                         |enhanced status code      |
387     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
388     |                    |                         |Recipient mail delivery   |
389     |{rcpt_mailer}       |RCPT (Postfix >= 2.6,    |transport                 |
390     |                    |only with smtpd_milters) |With rejected recipient:  |
391     |                    |                         |"error"                   |
392     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
393     |{tls_version}       |HELO, MAIL, DATA, EOH,   |TLS protocol version      |
394     |                    |EOM                      |                          |
395     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
396     |v                   |Always                   |value of milter_macro_v   |
397     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
399 Postfix sends specific sets of macros at different Milter protocol stages. The
400 sets are configured with the parameters as described in the table (EOH = end of
401 headers; EOM = end of message). The protocol version is a number that Postfix
402 sends at the beginning of the Milter protocol handshake.
404 As of Sendmail 8.14.0, Milter applications can specify what macros they want to
405 receive at different Milter protocol stages. An application-specified list
406 takes precedence over a Postfix-specified list.
408      _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b 
409     |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|
410     |                             |v\bve\ber\brs\bsi\bio\bon\bn        |                     |
411     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
412     |milter_connect_macros        |2 or higher    |CONNECT              |
413     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
414     |milter_helo_macros           |2 or higher    |HELO/EHLO            |
415     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
416     |milter_mail_macros           |2 or higher    |MAIL FROM            |
417     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
418     |milter_rcpt_macros           |2 or higher    |RCPT TO              |
419     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
420     |milter_data_macros           |4 or higher    |DATA                 |
421     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
422     |milter_end_of_header_macros  |6 or higher    |EOH                  |
423     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
424     |milter_end_of_data_macros    |2 or higher    |EOM                  |
425     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
426     |milter_unknown_command_macros|3 or higher    |unknown command      |
427     |_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
429 W\bWo\bor\brk\bka\bar\bro\bou\bun\bnd\bds\bs
431   * To avoid breaking DKIM etc. signatures with an SMTP-based content filter,
432     update the before-filter SMTP client in master.cf, and add a line with "-
433     o disable_mime_output_conversion=yes" (note: no spaces around the "="). For
434     details, see the advanced content filter example.
436     /etc/postfix/master.cf:
437         # =============================================================
438         # service type  private unpriv  chroot  wakeup  maxproc command
439         #               (yes)   (yes)   (yes)   (never) (100)
440         # =============================================================
441         scan      unix  -       -       n       -       10      smtp
442             -o smtp_send_xforward_command=yes
443             -o disable_mime_output_conversion=yes
444             -o smtp_generic_maps=
446   * Some Milter applications use the "{if_addr}" macro to recognize local mail;
447     this macro does not exist in Postfix. Workaround: use the "{client_addr}"
448     macro instead.
450   * Some Milter applications log a warning that looks like this:
452         sid-filter[36540]: WARNING: sendmail symbol 'i' not available
454     And they may insert an ugly message header with "unknown-msgid" like this:
456         X-SenderID: Sendmail Sender-ID Filter vx.y.z host.example.com <unknown-
457         msgid>
459     The problem is that Milter applications expect that the queue ID is known
460     before the MTA accepts the MAIL FROM (sender) command. Postfix does not
461     choose a queue ID, which is used as the queue file name, until after it
462     accepts the first valid RCPT TO (recipient) command.
464     If you experience the ugly header problem, see if a recent version of the
465     Milter application fixes it. For example, current versions of dkim-filter
466     and dk-filter already have code that looks up the Postfix queue ID at a
467     later protocol stage, and sid-filter version 1.0.0 no longer includes the
468     queue ID in the message header.
470     To fix the ugly message header, you will need to add code that looks up the
471     Postfix queue ID at some later point im time. The example below adds the
472     lookup after the end-of-message.
474       o Edit the filter source file (typically named xxx-filter/xxx-filter.c or
475         similar).
477       o Look up the mlfi_eom() function and add code near the top shown as b\bbo\bol\bld\bd
478         text below:
480         dfc = cc->cctx_msg;
481         assert(dfc != NULL);
483         /\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/
484         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)
485         {\b{
486                 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;
487                 i\bif\bf (\b(j\bjo\bob\bbi\bid\bd !\b!=\b= 0\b0)\b)
488                         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;
489         }\b}
491     NOTES:
493       o Different mail filters use slightly different names for variables. If
494         the above code does not compile, look elsewhere in the mail filter
495         source file for code that looks up the "i" macro value, and copy that
496         code.
498       o This change fixes only the ugly message header, but not the WARNING
499         message. Fortunately, many Milters log that message only once.
501 L\bLi\bim\bmi\bit\bta\bat\bti\bio\bon\bns\bs
503 This section lists limitations of the Postfix Milter implementation. Some
504 limitations will be removed as the implementation is extended over time. Of
505 course the usual limitations of before-queue filtering will always apply. See
506 the CONTENT_INSPECTION_README document for a discussion.
508   * The Milter protocol has evolved over time. Therefore, different Postfix
509     versions implement different feature sets.
511      _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b 
512     |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                                       |
513     |_\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
514     |   2.6 |All Milter requests of Sendmail 8.14.0 (see notes below).       |
515     |_\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
516     |       |All Milter requests of Sendmail 8.14.0, except:                 |
517     |       |SMFIP_RCPT_REJ (report rejected recipients to the mail filter), |
518     |   2.5 |SMFIR_CHGFROM (replace sender, with optional ESMTP parameters), |
519     |       |SMFIR_ADDRCPT_PAR (add recipient, with optional ESMTP           |
520     |       |parameters).                                                    |
521     |_\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
522     |   2.4 |All Milter requests of Sendmail 8.13.0.                         |
523     |_\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
524     |   2.3 |All Milter requests of Sendmail 8.13.0, except:                 |
525     |       |SMFIR_REPLBODY (replace message body).                          |
526     |_\b _\b _\b _\b _\b _\b _\b _\b|_\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b _\b |
528   * For Milter applications that are written in C, you need to use the Sendmail
529     libmilter library.
531   * Postfix has TWO sets of mail filters: filters that are used for SMTP mail
532     only (specified with the smtpd_milters parameter), and filters for non-SMTP
533     mail (specified with the non_smtpd_milters parameter). The non-SMTP filters
534     are primarily for local submissions.
536     When mail is filtered by non_smtpd_milters, the Postfix cleanup(8) server
537     has to simulate SMTP client requests. This works as expected, with only one
538     exception: non_smtpd_milters must not REJECT or TEMPFAIL simulated RCPT TO
539     commands. When this rule is violated, Postfix will report a configuration
540     error, and mail will stay in the queue.
542   * Postfix currently does not apply content filters to mail that is forwarded
543     or aliased internally, or to mail that is generated internally such as
544     bounces or Postmaster notifications. This may be a problem when you want to
545     apply a signing Milter to such mail.
547   * When you use the before-queue content filter for incoming SMTP mail (see
548     SMTPD_PROXY_README), Milter applications have access only to the SMTP
549     command information; they have no access to the message header or body, and
550     cannot make modifications to the message or to the envelope.
552   * Postfix 2.6 ignores the optional ESMTP parameters in requests to replace
553     the sender (SMFIR_CHGFROM) or to append a recipient (SMFIR_ADDRCPT_PAR).
554     Postfix logs a warning message when a Milter application supplies such
555     ESMTP parameters:
557     warning: queue-id: cleanup_chg_from: ignoring ESMTP arguments "whatever"
558     warning: queue-id: cleanup_add_rcpt: ignoring ESMTP arguments "whatever"
560   * Postfix 2.3 does not implement requests to replace the message body. Milter
561     applications log a warning message when they need this unsupported
562     operation:
564     st_optionneg[134563840]: 0x3d does not fulfill action requirements 0x1e
566     The solution is to use Postfix version 2.4 or later.
568   * Most Milter configuration options are global. Future Postfix versions may
569     support per-Milter timeouts, per-Milter error handling, etc.