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
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
25 This document provides information on the following topics:
27 * How Milter applications plug into Postfix
28 * Building Milter applications
29 * Running Milter applications
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).
69 Network -> smtpd(8) | |
74 Network -> qmqpd(8) -> cleanup(8) -> incoming
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
101 [...lots of output omitted...]
103 * The other option is to build the libmilter library from Sendmail source
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
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
117 APPENDDEF(`confINCDIRS', `-I/some/where/sendmail-x.y.z/include')
118 APPENDDEF(`confLIBDIRS', `-L/some/where/sendmail-x.y.z/obj.systemtype/
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
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
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
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
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
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:
267 # 2.3 <= Postfix <= 2.5
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
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
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 |
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|
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: |
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 |
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 |
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 |
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 |
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: |
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 |
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}"
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-
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
477 o Look up the mlfi_eom() function and add code near the top shown as b
\bbo
\bol
\bld
\bd
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)
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;
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
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 |
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
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
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
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.