comparison xml/dnsbl.in @ 111:d0dad5610980

move to autoconf/automake/docbook
author carl
date Sun, 18 Dec 2005 15:16:25 -0800
parents 1c7677042b78
children f4f5fb263072
comparison
equal deleted inserted replaced
110:75c10deb3fe9 111:d0dad5610980
43 <refsect1 id='options.1'> 43 <refsect1 id='options.1'>
44 <title>Options</title> 44 <title>Options</title>
45 <variablelist> 45 <variablelist>
46 <varlistentry> 46 <varlistentry>
47 <term>-c</term> 47 <term>-c</term>
48 <listitem> 48 <listitem><para>
49 <para> 49 Load the configuration file, print a cannonical form
50 Load the configuration file, print a cannonical form 50 of the configuration on stdout, and exit.
51 of the configuration on stdout, and exit. 51 </para></listitem>
52 </para>
53 </listitem>
54 </varlistentry> 52 </varlistentry>
55 <varlistentry> 53 <varlistentry>
56 <term>-s</term> 54 <term>-s</term>
57 <listitem> 55 <listitem><para>
58 <para> 56 Stress test the configuration loading code by repeating
59 Stress test the configuration loading code by repeating 57 the load/free cycle in an infinite loop.
60 the load/free cycle in an infinite loop. 58 </para></listitem>
61 </para>
62 </listitem>
63 </varlistentry> 59 </varlistentry>
64 <varlistentry> 60 <varlistentry>
65 <term>-d <replaceable class="parameter">n</replaceable></term> 61 <term>-d <replaceable class="parameter">n</replaceable></term>
66 <listitem> 62 <listitem><para>
67 <para> 63 Set the debug level to <replaceable class="parameter">n</replaceable>.
68 Set the debug level to <replaceable class="parameter">n</replaceable>. 64 </para></listitem>
69 </para>
70 </listitem>
71 </varlistentry> 65 </varlistentry>
72 <varlistentry> 66 <varlistentry>
73 <term>-e <replaceable class="parameter">from|to</replaceable></term> 67 <term>-e <replaceable class="parameter">from|to</replaceable></term>
74 <listitem> 68 <listitem><para>
75 <para> 69 Print the results of looking up the from and to addresses in the
76 Print the results of looking up the from and to addresses in the 70 current configuration. The | character is used to separate the from and to
77 current configuration. The | character is used to separate the from and to 71 addresses in the argument to the -e switch.
78 addresses in the argument to the -e switch. 72 </para></listitem>
79 </para>
80 </listitem>
81 </varlistentry> 73 </varlistentry>
82 <varlistentry> 74 <varlistentry>
83 <term>-r <replaceable class="parameter">local-domain-socket</replaceable></term> 75 <term>-r <replaceable class="parameter">local-domain-socket</replaceable></term>
84 <listitem> 76 <listitem><para>
85 <para> 77 Set the local socket used for the connection to our own dns resolver processes.
86 Set the local socket used for the connection to our own dns resolver processes. 78 </para></listitem>
87 </para>
88 </listitem>
89 </varlistentry> 79 </varlistentry>
90 <varlistentry> 80 <varlistentry>
91 <term>-p <replaceable class="parameter">sendmail-socket</replaceable></term> 81 <term>-p <replaceable class="parameter">sendmail-socket</replaceable></term>
92 <listitem> 82 <listitem><para>
93 <para> 83 Set the socket used for the milter connection to sendmail. This is either
94 Set the socket used for the milter connection to sendmail. This is either 84 "inet:port@ip-address" or "local:local-domain-socket-file-name".
95 "inet:port@ip-address" or "local:local-domain-socket-file-name". 85 </para></listitem>
96 </para>
97 </listitem>
98 </varlistentry> 86 </varlistentry>
99 <varlistentry> 87 <varlistentry>
100 <term>-t <replaceable class="parameter">timeout</replaceable></term> 88 <term>-t <replaceable class="parameter">timeout</replaceable></term>
101 <listitem> 89 <listitem><para>
102 <para> 90 Set the timeout in seconds used for communication with sendmail.
103 Set the timeout in seconds used for communication with sendmail. 91 </para></listitem>
104 </para>
105 </listitem>
106 </varlistentry> 92 </varlistentry>
107 </variablelist> 93 </variablelist>
108 </refsect1> 94 </refsect1>
109 95
110 <refsect1> 96 <refsect1 id='usage.1'>
111 <title>Usage</title> 97 <title>Usage</title>
112 <para><command>@PACKAGE@</command> -c</para> 98 <para><command>@PACKAGE@</command> -c</para>
113 <para><command>@PACKAGE@</command> -s</para> 99 <para><command>@PACKAGE@</command> -s</para>
114 <para><command>@PACKAGE@</command> -d 2</para> 100 <para><command>@PACKAGE@</command> -e 'someone@aol.com|localname@mydomain.tld'</para>
115 <para><command>@PACKAGE@</command> -e'someone@aol.com|localname@mydomain.tld'</para> 101 <para><command>@PACKAGE@</command> -d 10 -r resolver.sock -p local:dnsbl.sock</para>
116 <para><command>@PACKAGE@</command> -d 10 -r /var/run/dnsbl/dnsbl.resolver.sock -p local:/var/run/dnsbl/dnsbl.sock</para> 102 </refsect1>
103
104 <refsect1 id='installation.1'>
105 <title>Installation</title>
106 <para>
107 This is now a standard GNU autoconf/automake installation, so the normal
108 "./configure; make; su; make install" works. "make chkconfig" will
109 setup the init.d runlevel scripts. Alternatively, you can use the
110 source or binary RPMs at <ulink
111 url="http://www.five-ten-sg.com/@PACKAGE@/packages">http://www.five-ten-sg.com/@PACKAGE@/packages</ulink>.
112 </para>
113 <para>
114 Note that this has ONLY been tested on Linux, specifically RedHat Linux.
115 In particular, this milter makes no attempt to understand IPv6. Your
116 mileage will vary. You will need at a minimum a C++ compiler with a
117 minimally thread safe STL implementation. The distribution includes a
118 test.cpp program. If it fails this milter won't work. If it passes,
119 this milter might work.
120 </para>
121 <para>
122 Modify your sendmail.mc by removing all the "FEATURE(dnsbl" lines, add
123 the following line in your sendmail.mc and rebuild the .cf file
124 </para>
125 <para><screen>INPUT_MAIL_FILTER(`dnsbl', `S=local:/var/run/dnsbl/dnsbl.sock, F=T, T=C:30s;S:5m;R:5m;E:5m')</screen></para>
126 <para>
127 Modify the default <citerefentry>
128 <refentrytitle>@PACKAGE@.conf</refentrytitle> <manvolnum>5</manvolnum>
129 </citerefentry> configuration.
130 </para>
131 </refsect1>
132
133 <refsect1 id='configuration.1'>
134 <title>Configuration</title>
135 <para>
136 The configuration file is documented in <citerefentry>
137 <refentrytitle>@PACKAGE@.conf</refentrytitle> <manvolnum>5</manvolnum>
138 </citerefentry>. Any change to the config file, or any file included
139 from that config file, will cause it to be reloaded within three
140 minutes.
141 </para>
117 </refsect1> 142 </refsect1>
118 143
119 <refsect1 id='introduction.1'> 144 <refsect1 id='introduction.1'>
120 <title>Introduction</title> 145 <title>Introduction</title>
121 <para> 146 <para>
156 to your /etc/mail/virtusertable since otherwise sendmail will reject 181 to your /etc/mail/virtusertable since otherwise sendmail will reject
157 that message. 182 that message.
158 </para> 183 </para>
159 </refsect1> 184 </refsect1>
160 185
161 <refsect1 id='todo.1'> 186 <refsect1 id='dcc.1'>
162 <title>DCC Issues</title> 187 <title>DCC Issues</title>
163 <para> 188 <para>
164 If you are also using the <ulink 189 If you are also using the <ulink
165 url="http://www.rhyolite.com/anti-spam/dcc/">DCC</ulink> milter, there 190 url="http://www.rhyolite.com/anti-spam/dcc/">DCC</ulink> milter, there
166 are a few considerations. You may need to whitelist senders from the 191 are a few considerations. You may need to whitelist senders from the
197 be appropriately tagged and used only for the domains controlled by each 222 be appropriately tagged and used only for the domains controlled by each
198 of those clients. 223 of those clients.
199 </para> 224 </para>
200 </refsect1> 225 </refsect1>
201 226
202 <refsect1 id='todo.1'> 227 <refsect1 id='definitions.1'>
203 <title>Definitions</title> 228 <title>Definitions</title>
204 <para> 229 <para>
205 CONTEXT - a collection of parameters that defines the filtering context 230 CONTEXT - a collection of parameters that defines the filtering context
206 to be used for a collection of envelope recipient addresses. The 231 to be used for a collection of envelope recipient addresses. The
207 context includes such things as the list of DNSBLs to be used, and the 232 context includes such things as the list of DNSBLs to be used, and the
217 DNSBL-LIST - a named list of DNSBLs that will be used for specific 242 DNSBL-LIST - a named list of DNSBLs that will be used for specific
218 recipients or recipient domains. 243 recipients or recipient domains.
219 </para> 244 </para>
220 </refsect1> 245 </refsect1>
221 246
222 <refsect1 id='todo.1'> 247 <refsect1 id='filtering.1'>
223 <title>Filtering Procedure</title> 248 <title>Filtering Procedure</title>
224 <para> 249 <para>
225 If the client has authenticated with sendmail, the mail is accepted, the 250 If the client has authenticated with sendmail, the mail is accepted, the
226 filtering contexts are not used, the dns lists are not checked, and the 251 filtering contexts are not used, the dns lists are not checked, and the
227 body content is not scanned. Otherwise, we follow these steps for each 252 body content is not scanned. Otherwise, we follow these steps for each
228 recipient. 253 recipient.
229 </para> 254 </para>
230 <orderedlist> 255 <orderedlist>
231 <listitem> 256 <listitem><para>
232 The envelope to email address is used to find an initial filtering 257 The envelope to email address is used to find an initial filtering
233 context. We first look for a context that specified the full email 258 context. We first look for a context that specified the full email
234 address in the env_to statement. If that is not found, we look for a 259 address in the env_to statement. If that is not found, we look for a
235 context that specified the entire domain name of the envelope recipient 260 context that specified the entire domain name of the envelope recipient
236 in the env_to statement. If that is not found, we look for a context 261 in the env_to statement. If that is not found, we look for a context
237 that specified the user@ part of the envelope recipient in the env_to 262 that specified the user@ part of the envelope recipient in the env_to
238 statement. If that is not found, we use the first top level context 263 statement. If that is not found, we use the first top level context
239 defined in the config file. 264 defined in the config file.
240 </listitem> 265 </para></listitem>
241 <listitem> 266 <listitem><para>
242 The initial filtering context may redirect to a child context based on 267 The initial filtering context may redirect to a child context based on
243 the values in the initial context's env_from statement. We look for [1) 268 the values in the initial context's env_from statement. We look for [1)
244 the full envelope from email address, 2) the domain name part of the 269 the full envelope from email address, 2) the domain name part of the
245 envelope from address, 3) the user@ part of the envelope from address] 270 envelope from address, 3) the user@ part of the envelope from address]
246 in that context's env_from statement, with values that point to a child 271 in that context's env_from statement, with values that point to a child
247 context. If such an entry is found, we switch to that child filtering 272 context. If such an entry is found, we switch to that child filtering
248 context. 273 context.
249 </listitem> 274 </para></listitem>
250 <listitem> 275 <listitem><para>
251 We lookup [1) the full envelope from email address, 2) the domain name 276 We lookup [1) the full envelope from email address, 2) the domain name
252 part of the envelope from address, 3) the user@ part of the envelope 277 part of the envelope from address, 3) the user@ part of the envelope
253 from address] in the filtering context env_from statement. That results 278 from address] in the filtering context env_from statement. That results
254 in one of (white, black, unknown, inherit). 279 in one of (white, black, unknown, inherit).
255 </listitem> 280 </para></listitem>
256 <listitem> 281 <listitem><para>
257 If the answer is black, mail to this recipient is rejected with "no such 282 If the answer is black, mail to this recipient is rejected with "no such
258 user", and the dns lists are not checked. 283 user", and the dns lists are not checked.
259 </listitem> 284 </para></listitem>
260 <listitem> 285 <listitem><para>
261 If the answer is white, mail to this recipient is accepted and the dns 286 If the answer is white, mail to this recipient is accepted and the dns
262 lists are not checked. 287 lists are not checked.
263 </listitem> 288 </para></listitem>
264 <listitem> 289 <listitem><para>
265 If the answer is unknown, we don't reject yet, but the dns lists will be 290 If the answer is unknown, we don't reject yet, but the dns lists will be
266 checked, and the content may be scanned. 291 checked, and the content may be scanned.
267 <listitem> 292 </para></listitem>
293 <listitem><para>
268 If the answer is inherit, we repeat the envelope from search in the 294 If the answer is inherit, we repeat the envelope from search in the
269 parent context. 295 parent context.
270 </listitem> 296 </para></listitem>
271 <listitem> 297 <listitem><para>
272 The dns lists specified in the filtering context are checked and the 298 The dns lists specified in the filtering context are checked and the
273 mail is rejected if any list has an A record for the standard dns based 299 mail is rejected if any list has an A record for the standard dns based
274 lookup scheme (reversed octets of the client followed by the dns 300 lookup scheme (reversed octets of the client followed by the dns
275 suffix). 301 suffix).
276 </listitem> 302 </para></listitem>
277 <listitem> 303 <listitem><para>
278 If the mail has not been accepted or rejected yet, we look for a 304 If the mail has not been accepted or rejected yet, we look for a
279 verification context, which is the closest ancestor of the filtering 305 verification context, which is the closest ancestor of the filtering
280 context that both specifies a verification host, and which covers the 306 context that both specifies a verification host, and which covers the
281 envelope to address. If we find such a verification context, and the 307 envelope to address. If we find such a verification context, and the
282 verification host is not our own hostname, we open an smtp conversation 308 verification host is not our own hostname, we open an smtp conversation
283 with that verification host. The current envelope from and recipient to 309 with that verification host. The current envelope from and recipient to
284 values are passed to that verification host. If we receive a 5xy 310 values are passed to that verification host. If we receive a 5xy
285 response those commands, we reject the current recipient with "no such 311 response those commands, we reject the current recipient with "no such
286 user". 312 user".
287 </listitem> 313 </para></listitem>
288 <listitem> 314 <listitem><para>
289 If the mail has not been accepted or rejected yet, and the filtering 315 If the mail has not been accepted or rejected yet, and the filtering
290 context enables content filtering, and this is the first such recipient 316 context enables content filtering, and this is the first such recipient
291 in this smtp transaction, we set the content filtering parameters from 317 in this smtp transaction, we set the content filtering parameters from
292 this context, and enable content filtering for the body of this message. 318 this context, and enable content filtering for the body of this message.
293 </listitem> 319 </para></listitem>
294 </orderedlist> 320 </orderedlist>
295 <para> 321 <para>
296 If content filtering is enabled for this body, the mail text is decoded 322 If content filtering is enabled for this body, the mail text is decoded
297 (uuencode, base64, mime, html entity, url encodings), scanned for HTTP 323 (uuencode, base64, mime, html entity, url encodings), scanned for HTTP
298 and HTTPS URLs, and the first &lt;configurable&gt; host names are 324 and HTTPS URLs, and the first &lt;configurable&gt; host names are
303 the mail is rejected. We also scan for excessive bad html tags, and if 329 the mail is rejected. We also scan for excessive bad html tags, and if
304 a &lt;configurable&gt; limit is exceeded, the mail is rejected. 330 a &lt;configurable&gt; limit is exceeded, the mail is rejected.
305 </para> 331 </para>
306 </refsect1> 332 </refsect1>
307 333
308 <refsect1> 334 <refsect1 id='access.1'>
309 <title>Sendmail access vs. DNSBL</title> 335 <title>Sendmail access vs. DNSBL</title>
310 <para> 336 <para>
311 With the standard sendmail.mc dnsbl FEATURE, the dnsbl checks may be 337 With the standard sendmail.mc dnsbl FEATURE, the dnsbl checks may be
312 suppressed by entries in the /etc/mail/access database. For example, 338 suppressed by entries in the /etc/mail/access database. For example,
313 suppose you control a /18 of address space, and have allocated some /24s 339 suppose you control a /18 of address space, and have allocated some /24s
314 to some clients. You have access entries like 340 to some clients. You have access entries like
315 <screen> 341 <literallayout class="monospaced"><![CDATA[
316 192.168.4 OK 342 192.168.4 OK
317 192.168.17 OK 343 192.168.17 OK]]></literallayout>
318 </screen>
319 </para> 344 </para>
320 <para> 345 <para>
321 to allow those clients to smarthost thru your mail server. Now if one 346 to allow those clients to smarthost thru your mail server. Now if one
322 of those clients happens get infected with a virus that turns a machine 347 of those clients happens get infected with a virus that turns a machine
323 into an open proxy, and their 192.168.4.45 lands on the SBL-XBL, you 348 into an open proxy, and their 192.168.4.45 lands on the SBL-XBL, you
340 these directions</ulink> helpful for setting up smtp-auth if you are on 365 these directions</ulink> helpful for setting up smtp-auth if you are on
341 RH Linux. 366 RH Linux.
342 </para> 367 </para>
343 </refsect1> 368 </refsect1>
344 369
345 <refsect1> 370 <refsect1 id='performance.1'>
346 <title>Installation and configuration</title>
347 <para>
348 This is a standard GNU autoconf/automake installation, so the normal
349 <screen>
350 ./configure
351 make
352 su
353 make install
354 </screen>
355 works. "make chkconfig" will setup the init.d runlevel scripts.
356 </para>
357 <para>
358 Note that this has ONLY been tested on Linux, specifically RedHat Linux.
359 In particular, this milter makes no attempt to understand IPv6. Your
360 mileage will vary. You will need at a minimum a C++ compiler with a
361 minimally thread safe STL implementation. The distribution includes a
362 test.cpp program. If it fails this milter won't work. If it passes,
363 this milter might work.
364 </para>
365 <para>
366 Modify your sendmail.mc by removing all the "FEATURE(dnsbl" lines, add
367 the following line in your sendmail.mc and rebuild the .cf file
368 </para>
369 <para>
370 <screen>
371 INPUT_MAIL_FILTER(`dnsbl', `S=local:/var/run/dnsbl/dnsbl.sock, F=T, T=C:30s;S:5m;R:5m;E:5m')
372 </screen>
373 </para>
374 <para>
375 Modify the default <citerefentry>
376 <refentrytitle>@PACKAGE@.conf</refentrytitle> <manvolnum>5</manvolnum>
377 </citerefentry> configuration.
378 </para>
379
380
381 <refsect1 id='todo.1'>
382 <title>Performance Issues</title> 371 <title>Performance Issues</title>
383 <para> 372 <para>
384 Consider a high volume high performance machine running sendmail. Each 373 Consider a high volume high performance machine running sendmail. Each
385 sendmail process can do its own dns resolution. Typically, such dns 374 sendmail process can do its own dns resolution. Typically, such dns
386 resolver libraries are not thread safe, and so must be protected by some 375 resolver libraries are not thread safe, and so must be protected by some
407 course that steady state is very unlikely to happen. 396 course that steady state is very unlikely to happen.
408 </para> 397 </para>
409 </refsect1> 398 </refsect1>
410 399
411 400
412 <refsect1 id='todo.1'> 401 <refsect1 id='rejected.1'>
413 <title>Rejected Ideas</title> 402 <title>Rejected Ideas</title>
414 <para> 403 <para>
415 The following ideas have been considered and rejected. 404 The following ideas have been considered and rejected.
416 </para> 405 </para>
417 <para> 406 <para>
418 Add max_recipients for each mail domain to the configuration. 407 Add max_recipients setting to the context configuration. Recipients in
419 Recipients in excess of that limit will be rejected, and all the 408 excess of that limit will be rejected, and all the non-whitelisted
420 recipients in that domain will be removed if there are some other 409 recipients will be removed. Current spammers *very* rarely send more
421 whitelisted recipients. Current spammers *very* rarely send more than 410 than ten recipients in a single smtp transaction, so this won't stop any
422 ten recipients in a single smtp transaction, so this won't stop any
423 significant amount of spam. 411 significant amount of spam.
424 </para> 412 </para>
425 <para> 413 <para>
426 Add poison addresses to the configuration. If any recipient is 414 Add poison addresses to the configuration. If any recipient is
427 poison, all recipients are rejected even if they would be whitelisted, 415 poison, all recipients are rejected even if they would be whitelisted,
452 Add a per-context option to reject mail if the number of digits in 440 Add a per-context option to reject mail if the number of digits in
453 the reverse dns client name exceeds some threshold. 441 the reverse dns client name exceeds some threshold.
454 </para> 442 </para>
455 </refsect1> 443 </refsect1>
456 444
457 <refsect1> 445 <refsect1 id='copyright.1'>
458 <title>Configuration</title>
459 <para>
460 The configuration file is documented in <citerefentry>
461 <refentrytitle>@PACKAGE@.conf</refentrytitle> <manvolnum>5</manvolnum>
462 </citerefentry>. Any change to the config file, or any file included
463 from that config file, will cause it to be reloaded within three
464 minutes.
465 </para>
466 </refsect1>
467
468 <refsect1>
469 <title>Copyright</title> 446 <title>Copyright</title>
470 <para> 447 <para>
471 Copyright (C) 2005 by 510 Software Group &lt;carl@five-ten-sg.com&gt; 448 Copyright (C) 2005 by 510 Software Group &lt;carl@five-ten-sg.com&gt;
472 </para> 449 </para>
473 <para> 450 <para>
481 with this program; see the file COPYING. If not, please write to the 458 with this program; see the file COPYING. If not, please write to the
482 Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 459 Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
483 </para> 460 </para>
484 </refsect1> 461 </refsect1>
485 462
486 <refsect1> 463 <refsect1 id='version.1'>
464 <title>CVS Version</title>
487 <para> 465 <para>
488 $Id$ 466 $Id$
489 </para> 467 </para>
490 </refsect1> 468 </refsect1>
491 </refentry> 469 </refentry>
502 <refmiscinfo>@PACKAGE@ @VERSION@</refmiscinfo> 480 <refmiscinfo>@PACKAGE@ @VERSION@</refmiscinfo>
503 </refmeta> 481 </refmeta>
504 482
505 <refnamediv id='name.5'> 483 <refnamediv id='name.5'>
506 <refname>@PACKAGE@.conf</refname> 484 <refname>@PACKAGE@.conf</refname>
507 <refpurpose>configuration file for @PACKAGE@</refpurpose> 485 <refpurpose>configuration file for @PACKAGE@ sendmail milter</refpurpose>
508 </refnamediv> 486 </refnamediv>
509 487
510 <refsynopsisdiv id='synopsis.5'> 488 <refsynopsisdiv id='synopsis.5'>
511 <title>Synopsis</title> 489 <title>Synopsis</title>
512 <cmdsynopsis> 490 <cmdsynopsis>
520 specified by this partial bnf description.</para> 498 specified by this partial bnf description.</para>
521 499
522 <literallayout class="monospaced"><![CDATA[ 500 <literallayout class="monospaced"><![CDATA[
523 CONFIG = {CONTEXT ";"}+ 501 CONFIG = {CONTEXT ";"}+
524 CONTEXT = "context" NAME "{" {STATEMENT}+ "}" 502 CONTEXT = "context" NAME "{" {STATEMENT}+ "}"
525 STATEMENT = (DNSBL | DNSBLLIST | CONTENT | ENV-TO | VERIFY | CONTEXT | ENV-FROM) ";" 503 STATEMENT = (DNSBL | DNSBLLIST | CONTENT | ENV-TO | VERIFY |
504 CONTEXT | ENV-FROM) ";"
526 505
527 DNSBL = "dnsbl" NAME DNSPREFIX ERROR-MSG 506 DNSBL = "dnsbl" NAME DNSPREFIX ERROR-MSG
528 507
529 DNSBLLIST = "dnsbl_list" {NAME}+ 508 DNSBLLIST = "dnsbl_list" {NAME}+
530 509
531 CONTENT = "content" ("on" | "off") "{" {CONTENT-ST}+ "}" 510 CONTENT = "content" ("on" | "off") "{" {CONTENT-ST}+ "}"
532 CONTENT-ST = (FILTER | IGNORE | TLD | HTML-TAGS | HTML-LIMIT | HOST-LIMIT) ";" 511 CONTENT-ST = (FILTER | IGNORE | TLD | HTML-TAGS | HTML-LIMIT |
512 HOST-LIMIT) ";"
533 FILTER = "filter" DNSPREFIX ERROR-MSG 513 FILTER = "filter" DNSPREFIX ERROR-MSG
534 IGNORE = "ignore" "{" {HOSTNAME [";"]}+ "}" 514 IGNORE = "ignore" "{" {HOSTNAME [";"]}+ "}"
535 TLD = "tld" "{" {TLD [";"]}+ "}" 515 TLD = "tld" "{" {TLD [";"]}+ "}"
536 HTML-TAGS = "html_tags" "{" {HTMLTAG [";"]}+ "}" 516 HTML-TAGS = "html_tags" "{" {HTMLTAG [";"]}+ "}"
537 ERROR-MSG = string containing exactly two %s replacement tokens for the client ip address 517 ERROR-MSG = string containing exactly two %s replacement tokens
518 for the client ip address
538 519
539 HTML-LIMIT = "html_limit" ("on" INTEGER ERROR-MSG | "off") 520 HTML-LIMIT = "html_limit" ("on" INTEGER ERROR-MSG | "off")
540 521
541 HOST-LIMIT = "host_limit" ("on" INTEGER ERROR-MSG | "off" | "soft" INTEGER) 522 HOST-LIMIT = "host_limit" ("on" INTEGER ERROR-MSG | "off" |
523 "soft" INTEGER)
542 524
543 ENV-TO = "env_to" "{" {(TO-ADDR | DCC-TO)}+ "}" 525 ENV-TO = "env_to" "{" {(TO-ADDR | DCC-TO)}+ "}"
544 TO-ADDR = ADDRESS [";"] 526 TO-ADDR = ADDRESS [";"]
545 DCC-TO = "dcc_to" ("ok" | "many") "{" DCCINCLUDEFILE "}" ";" 527 DCC-TO = "dcc_to" ("ok" | "many") "{" DCCINCLUDEFILE "}" ";"
546 528
677 spammer@example.com black; 659 spammer@example.com black;
678 }; 660 };
679 };]]></literallayout> 661 };]]></literallayout>
680 </refsect1> 662 </refsect1>
681 663
682 <refsect1> 664 <refsect1 id='version.5'>
665 <title>CVS Version</title>
683 <para> 666 <para>
684 $Id$ 667 $Id$
685 </para> 668 </para>
686 </refsect1> 669 </refsect1>
687 670