some html fixes
[exim-website.git] / howto / mailman21.html
1 <!-- -*-html-*- -->
2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
3 <html>
4   <head>
5     <title>HOWTO - Using Exim 4 and Mailman together</title>
6     <style type="text/css">
7       body { color: #00005a; background: white; }
8       a:link { color: #ff6600; }
9       a:visited { color: #990000; }
10       a:hover { color: #ff9933; }
11     </style>
12   </head>
13   <body>
14     <h1>HOWTO - Using Exim 4 and Mailman 2.1 together</h1>
15
16     <p>Mailman is a list manager with web front end and built in
17     archiving functions.  Details can be found at <a
18     href="http://www.list.org/"> http://www.list.org/</a>.  This
19     documentation describes the configuration of Exim (version 4) to
20     work with Mailman version 2.1</p>
21
22     <h2><a name="index">Index</a></h2>
23
24     <ul>
25       <li><a href="#scope">Scope of this document</a></li>
26       <li><a href="#basic">Basic Configuration</a></li>
27     <ul>
28       <li><a href="#mmconf">Mailman configuration</a></li>
29       <li><a href="#exconf">Exim configuration</a></li>
30       <li><a href="#maconf">Main configuration settings</a></li>
31       <li><a href="#roconf">Exim Router</a></li>
32       <li><a href="#taconf">Exim Transport</a></li>
33     </ul>
34     <li><a href="#batune">Basic mailing list MTA tuning</a></li>
35     <ul>
36       <li><a href="#retune">Receiver verification</a></li>
37       <li><a href="#rctune">Tuning of numbers of recipients</a></li>
38       <li><a href="#smtune">SMTP callback</a></li>
39     </ul>
40     <li><a href="#verpin">Doing VERP and personalisation with exim
41         and Mailman</a></li>
42     <ul>
43       <li><a href="#verpmm">VERP within Mailman</a></li>
44       <li><a href="#persmm">Mailing list personalisation by Mailman</a></li>
45       <li><a href="#verpex">VERP expansion by Exim rather than
46           Mailman</a></li>
47     </ul>
48     <li><a href="#virdom">Virtual domains</a></li>
49     <li><a href="#lispol">List policy management</a></li>
50     <ul>
51       <li><a href="#conpol">Content scanning</a></li>
52       <li><a href="#incpol">Incoming message checks</a></li>
53       <li><a href="#mmapol">Mailman specific ACL checks</a></li>
54     </ul>
55     <li><a href="#lisver">List verification</a></li>
56     <li><a href="#problem">Possible Problems</a></li>
57     <li><a href="#dochis">Document History</a></li>
58   </ul>
59
60     <h2><a href="#index"><a name="scope">Scope of this document</a></a></h2>
61
62     <p>This document describes how to set up a basic working
63     configuration using Exim 4 as an MTA for the Mailman MLM.  The
64     assumption is made that the receiving MTA, Mailman and the list
65     distribution MTA are all on the same machine, and that Mailman
66     talks to Exim using SMTP to address <tt>127.0.0.1</tt></p>
67
68     <p>It also describes ways of using VERP delivery, both
69     conventionally (doing VERP from Mailman), and an alternative more
70     efficient technique where VERP expansion is done within exim.</p>
71
72     <p>Tuning and setting appropriate mailing list protection policies
73     is also covered in passing.</p>
74
75     <p>General installation, use, running and administration of either
76     Mailman or exim is not covered here - the documentation for the
77     programs concerned should be read for this information.</p>
78
79     <h2><a href="#index"><a name="basic">Basic Configuration</a></a></h2>
80
81     <h3><a href="#index"><a name="mmconf">Mailman configuration</a></a></h3>
82
83     <p>For basic operation there is no Mailman configuration needed
84     other than the standard options detailed in the Mailman install
85     documentation.  The user/group settings for Mailman must match
86     those in the config fragments given below, and you need to have at
87     least configured <tt>DEFAULT_URL_HOST</tt> and
88     <tt>DEFAULT_EMAIL_HOST</tt> within Mailman, for example by editing
89     <tt>~mailman/Mailman/mm_cfg.py</tt> and setting the following
90     (substituting in your own domains):-</p>
91
92 <pre>
93   # The host part of the URL used for your mailman install
94   DEFAULT_URL_HOST = 'www.example.com'
95   #
96   # The email domain of your lists
97   DEFAULT_EMAIL_HOST = 'list.example.com'
98   #
99   # Let Mailman know that the MTA needs no aliases setting
100   MTA = None
101 </pre>
102
103     <p>The final setting above informs Mailman that it does not need
104     to prompt you to add aliases when creating a list (like Sendmail),
105     or modify other settings (like Postfix).  Not setting this will
106     mean that Mailman nags you to do things that aren't necessary in
107     an Exim configuration.</p>
108
109     <p>After making a change to the Mailman configuration file you
110     need to restart the Mailman queue runners.</p>
111
112 <pre>
113   ~mailman/bin/mailmanctl restart
114 </pre>
115
116     <p>Mailman should also be set to deliver to the MTA using SMTP -
117     this is done by having <tt>DELIVERY_MODULE = 'SMTPDirect'</tt> in
118     the config file (which is the default mode of operation)</p>
119
120
121     <h3><a href="#index"><a name="exconf">Exim configuration</a></a></h3>
122
123     <p>The Exim configuration is built so that a list created within
124     Mailman automatically appears to Exim without the need for
125     defining any additional aliases (however Mailman may helpfully
126     show or email you a list of required aliases when you create a
127     list - you can just ignore those - if you have set the
128     <tt>MTA</tt> parameter it will stop doing this).</p>
129
130     <p>The drawback of this configuration is that it will work poorly
131     on systems supporting lists in several different mail domains.
132     While Mailman handles virtual domains, it does not yet support
133     having two distinct lists with the same name in different virtual
134     domains, using the same Mailman installation.  This will
135     eventually change.  (But see below for a variation on this scheme
136     that should accommodate virtual domains better.)</p>
137
138     <p>The configuration file excerpts below are for use in an already
139     functional Exim configuration.  You also need to have an alias for
140     <tt>mailman</tt> within the <tt>mm_domains</tt>, this picks up
141     mail sent to the site list (or basically just sent in error), and
142     should forward to the Mailman Administrator.  It appears that a
143     couple of Mailman messages mention the <tt>mailman-admin</tt>
144     address (this appears to be an error in Mailman or maybe a
145     packaging error), so I would suggest that <tt>mailman-admin</tt>
146     is aliased also to the Mailman Administrator.</p>
147
148     <p><i>[Note: the instructions in this document will work only with
149     Exim 4.  It may be possible to adapt them for Exim 3, but frankly
150     it is not worth the trouble]</i></p>
151
152     <p>You will need to add some macros to the main section of your
153     Exim config file.  You will also need to define one new transport
154     and add new routers.  Additional ACLs may be used to handle policy
155     enforcement.  Remember that the exim daemon needs restarting
156     before it sees configuration changes.</p>
157
158     <h3><a href="#index"><a name="maconf">Main configuration settings</a></a></h3>
159
160     <p>First, you need to add some macros to the top of your Exim
161     config file.  These just make the routers and transport below a
162     bit cleaner.  Obviously, you'll need to edit these based on how
163     you configured and installed Mailman.</p>
164
165 <pre>
166   # Home dir for your Mailman installation -- aka Mailman's prefix
167   # directory.
168   # By default this is set to "/usr/local/mailman"
169   # On a Red Hat/Fedora system using the RPM use "/var/mailman"
170   # On Debian using the deb package use "/var/lib/mailman"
171   # This is normally the same as ~mailman
172   MM_HOME=/var/mailman
173   #
174   # User and group for Mailman, should match your --with-mail-gid
175   # switch to Mailman's configure script.
176   # Value is normally "mailman"
177   MM_UID=mailman
178   MM_GID=mailman
179   #
180   # Domains that your lists are in - colon separated list
181   # you may wish to add these into local_domains as well
182   domainlist mm_domains=list.example.com
183   #
184   # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
185   #
186   # These values are derived from the ones above and should not need
187   # editing unless you have munged your mailman installation
188   #
189   # The path of the Mailman mail wrapper script
190   MM_WRAP=MM_HOME/mail/mailman
191   #
192   # The path of the list config file (used as a required file when
193   # verifying list addresses)
194   MM_LISTCHK=MM_HOME/lists/${lc::$local_part}/config.pck
195 </pre>
196
197     <h3><a href="#index"><a name="roconf">Exim Router</a></a></h3>
198
199     <p>This router picks up all the addresses going to the Mailman
200     lists.  Initially it selects only the domains that have may have
201     lists in, then selects where <tt>local_part</tt> matches a list
202     name (ie you can see a list config file).  The suffixes pick up
203     all the Mailman admin addresses<p>
204
205     <p>The router should be placed in the router section (ie somewhere
206     after the <tt>"begin routers"</tt> line of your config file).
207     Normally you would place it just after the aliases router (since
208     that will pick up the <tt>mailman</tt> master contact
209     address).</p>
210
211 <pre>
212   mailman_router:
213     driver = accept
214     domains = +mm_domains
215     require_files = MM_LISTCHK
216     local_part_suffix_optional
217     local_part_suffix = -admin     : \
218                         -bounces   : -bounces+* : \
219                         -confirm   : -confirm+* : \
220                         -join      : -leave     : \
221                         -owner     : -request   : \
222                         -subscribe : -unsubscribe
223     transport = mailman_transport
224 </pre>
225
226     <h3><a href="#index"><a name="taconf">Exim Transport</a></a></h3>
227
228     <p>The transport for Exim 4 can be placed anywhere where under the
229     <tt>begin transports</tt> line of your Exim config file.</p>
230
231     <p>The <tt>if def:local_part_suffix</tt> section selects whether
232     the suffix is used as the mailman command, or whether there is no
233     suffix and so <tt>post</tt> is passed as a command.</p>
234
235     <p>The <tt>sg</tt> phrase strips the VERP information (if any)
236     from the suffix,</p>
237
238 <pre>
239   mailman_transport:
240     driver = pipe
241     command = MM_WRAP \
242               '${if def:local_part_suffix \
243                     {${sg{$local_part_suffix}{-(\\w+)(\\+.*)?}{\$1}}} \
244                     {post}}' \
245               $local_part
246     current_directory = MM_HOME
247     home_directory = MM_HOME
248     user = MM_UID
249     group = MM_GID
250 </pre>
251
252
253     <h2><a href="#index"><a name="batune">Basic mailing list MTA tuning</a></a></h2>
254
255     <p>Exim has a lot configurability, especially where the ACL
256     (Access Control Lists) used during SMTP reception are concerned.
257     MTA policy needs to be tuned so that list traffic is not affected
258     by ACLs intended for qualifying traffic coming in from outside.
259     Later in this document some suggestions are made regarding
260     filtering traffic that is going into the mailing list, however
261     </p>
262
263     <h3><a href="#index"><a name="retune">Receiver verification</a></a></h3>
264
265     <p>Exim's receiver verification feature is very useful -- it lets
266     Exim reject unrouteable addresses at SMTP time.  However, this is
267     most useful for externally-originating mail that is addresses to
268     mail in one of your local domains.  For Mailman list traffic, mail
269     originates on your server, and is addressed to random external
270     domains that are not under your control.  Furthermore, each
271     message is addressed to many recipients -- up to 500 if you use
272     Mailman's default configuration, and don't tweak
273     <tt>SMTP_MAX_RCPTS</tt>.</p>
274
275     <p>Doing receiver verification on Mailman list traffic is a recipe
276     for trouble.  In particular, Exim will attempt to route every
277     recipient addresses in outgoing Mailman list posts.  Even though
278     this requires nothing more than a few DNS lookups for each
279     address, it can still introduce significant delays (because these
280     verifications have to be done serially as you attempt handoff to
281     exim).  Therefore, you should disable recipient verification for
282     Mailman traffic.</p>
283
284     <p>Under Exim 4, this is probably already taken care of for you by
285     the default recipient verification ACL statement (in the "RCPT TO"
286     ACL):</p>
287
288 <pre>
289   accept  domains       = +local_domains
290           endpass
291           message       = unknown user
292           verify        = recipient
293 </pre>
294
295     <p>which only does recipient verification on addresses in your
296     domain.  (That's not exactly the same as doing recipient
297     verification only on messages coming from non-127.0.0.1 hosts, but
298     it should do the trick for Mailman).  Obviously if the next ACL
299     does verification on non-local addresses you will need to deal
300     with that.</p>
301
302     <p>Alternatively you can add an early get-out in the "RCPT TO"
303     ACL), which <i>trusts</i> all traffic coming from the loopback IP
304     address:</p>
305
306 <pre>
307   accept  hosts         = 127.0.0.1
308 </pre>
309
310     <h3><a href="#index"><a name="rctune">Tuning of numbers of recipients</a></a></h3>
311
312     <p>By default Mailman will send up to 500 recipients on each
313     message it injects into exim.  However this is not necessarily a
314     good configuration for exim since it will route all those
315     recipients before starting deliveries to any of them.
316     Additionally some ACL configurations have tests on the maximum
317     number of recipients (which is a good reason for having a get out
318     ACL for list traffic as described above)</p>
319
320     <p>I would suggest setting Mailman to send a maximum of 5 to 50
321     recipients on a single mail (setting it lower decreases list
322     latency, but increases the work that Mailman and exim have to do),
323     and change it to send a maximum of 30 messages per SMTP
324     connection.  To reflect this you should also change the exim
325     parameter <tt>smtp_accept_queue_per_connection</tt> to be 30 as
326     well.</p>
327
328     <p>For example, add the following lines to
329     <tt>~mailman/Mailman/mm_cfg.py</tt>:</p>
330
331 <pre>
332   # Max recipients for each message
333   SMTP_MAX_RCPTS = 15
334   # Max messages sent in each SMTP connection
335   SMTP_MAX_SESSIONS_PER_CONNECTION = 30
336 </pre>
337
338     <p>Tuning a mailing list system is very much a black art, and
339     depends on the type of lists you host, their throughput, size and
340     the bandwidth available.  In general, tuning is only a significant
341     issue if you are pushing your system near its operational
342     limits.</p>
343
344     <h2><a href="#index"><a name="verpin">Doing VERP and personalisation with exim and Mailman</a></a></h2>
345
346     <h3><a href="#index"><a name="verpmm">VERP within Mailman</a></a></h3>
347
348     <p><a href="http://cr.yp.to/proto/verp.txt">VERP</a> (Variable
349     Envelope Return Paths) encodes the (original) receipient address
350     in the sender address.  The reason for doing this is that it means
351     bounces are sent to an address which has the original recipient
352     address encoded in it - meaning you know which recipient address
353     caused the bounce.  This makes automatic bounce handling very
354     effective - the normal method of parsing the bouncing address out
355     of the bounce message is very prone to failure, especially in the
356     case of foreign MTAs which use different addressing standards, or
357     where mail forwarding is involved.</p>
358
359     <p>VERP will send one email, with a separate envelope sender
360     (return path), for each of your subscribers - this means that it
361     will generate more traffic since you cannot bundle up deliveries
362     together.  An <a
363     href="http://www.python.org/cgi-bin/faqw-mm.py?req=show%26file=faq04.012.htp">analysis
364     of the costs of VERP</a> can be found in the <a
365     href="http://www.python.org/cgi-bin/faqw-mm.py">Mailman FAQ
366     Wizard</a>.</p>
367
368     <p>VERP settings within Mailman are done on a per-installation
369     basis - ie they affect all the lists within the installation. To
370     configure VERP within Mailman read the information in
371     <tt>~mailman/Mailman/Default.py</tt> for the options that start
372     with <tt>VERP</tt>.  In a nutshell, all you need to do to enable
373     VERP with Exim is to add these lines to
374     <tt>~mailman/Mailman/mm_cfg.py</tt>:</p>
375
376 <pre>
377   VERP_PASSWORD_REMINDERS = 1
378   VERP_PERSONALIZED_DELIVERIES = 1
379   VERP_CONFIRMATIONS = 1
380   VERP_DELIVERY_INTERVAL = 1
381 </pre>
382
383     <p>(The router and ACLs above are smart enough to deal with VERP
384     bounces.)</p>
385
386     <p>This configuration on its own will make the monthly password
387     reminders, confirmations and all list postings be sent out using
388     VERP</p>
389
390     <p>If you wish to have the advantages of VERP with a lower
391     bandwidth cost, you can enable VERP on occasional list postings
392     rather than on every posting.  Mailman will still VERP on all
393     password reminders and confirmations (these are already inherently
394     single recipient mailings), but only on occasional list postings.
395     To make Mailman use VERP on every twentieth list posting (using
396     bulk delivery for the other 19), change:-</p>
397
398 <pre>
399   VERP_DELIVERY_INTERVAL = 20
400 </pre>
401
402     <p>The downside to doing this is that Mailman may fail to notice a
403     bouncing address if it does not receive at least one bounce per
404     day, so ideally this approach should only be taken if the lists
405     have more than 20 message per day throughput.</p>
406
407     <h3><a href="#index"><a name="persmm">Mailing list personalisation by Mailman</a></a></h3>
408
409     <p>Mailman can also personalise each message it sends out on a
410     list.  This allows, for example, the recipient's own address to
411     appear as the To: header, or information specific to them to be
412     placed in the mail footer (although at present personalisation can
413     only be done for normal mail delivery - not for digest
414     subscribers).  This personalisation comes at a cost of an
415     individual message per recipient (ie same bandwidth requirements
416     as full VERP) and some processing costs for Mailman.</p>
417
418     <p>To enable personalisation, add the following configuration item
419     to <tt>~mailman/Mailman/mm_cfg.py</tt> (you should also set the
420     VERP settings from above since you have already incurred the costs
421     of VERP):-</p>
422
423 <pre>
424   OWNERS_CAN_ENABLE_PERSONALIZATION = 1
425 </pre>
426
427     <p>You will then find that in the list administration web
428     interface a new set of options has appeared in the <i>Non-digest
429     options</i> section.</p>
430
431     <h3><a href="#index"><a name="verpex">VERP expansion by exim rather than Mailman</a></a></h3>
432
433     <p>One drawback of VERP is that as well as increasing the
434     bandwidth outgoing mail requires, it also causes Mailman to send
435     one separate message per recipient from Mailman to exim - causing
436     exim to have many many more queue entries and consequently more
437     queue disk space.  For example a 20,000 recipient list would
438     require 400MB minimum temporary queue storage for each 20KB
439     message sent to the list.  There are also issues of increasing
440     disk traffic/throughput and losing some disk caching
441     advantages.</p>
442
443     <p>These local load problems can be overcome by doing the VERP
444     expansion as the message is sent out from the MTA over network
445     SMTP rather than as the message is injected into the MTA.  It will
446     come as no surprise that exim can be configured to do just
447     this.</p>
448
449     <p>Firstly we need to pick up outgoing Mailman mail and send it to
450     a specialised VERP transport.  This is done using a router which
451     should be placed just before your normal <tt>dnslookup</tt> router
452     for remote addresses:-</p>
453
454 <pre>
455   # Pick up on messages from our local mailman and route them via our
456   # special VERP-enabled transport
457   #
458   mailman_verp_router:
459     driver = dnslookup
460     # we only consider messages sent in through loopback
461     condition = ${if eq{$sender_host_address}{127.0.0.1}{yes}{no}}
462     # we do not do this for traffic going to the local machine
463     domains = !+local_domains:!+mm_domains
464     ignore_target_hosts = <; 0.0.0.0; \
465                              127.0.0.0/8; \
466                              ::1/128; \
467                              fe80::/10; \
468                              ff00::/8
469     # only the un-VERPed bounce addresses are handled
470     senders = "*-bounces@*"
471     transport = mailman_verp_smtp
472 </pre>
473
474     <p>Addresses selected by this router should then be passed on to
475     an SMTP transport that does VERP expansion.  This should be placed
476     anywhere within the transport section:-</p>
477
478 <pre>
479   # Mailman VERP envelope sender address formatting.  This seems not to use
480   # quoted-printable encoding of the address, but instead just replaces the
481   # '@' in the recipient address with '='.
482   #
483   mailman_verp_smtp:
484     driver = smtp
485     # put recipient address into return_path
486     return_path = \
487       ${local_part:$return_path}+$local_part=$domain@${domain:$return_path}
488     # must restrict to one recipient at a time
489     max_rcpt = 1
490     # Errors-To: may carry old return_path
491     headers_remove = Errors-To
492     headers_add = Errors-To: \
493       ${local_part:$return_path}+$local_part=$domain@${domain:$return_path}
494 </pre>
495
496     <p>Once this has been configured, Mailman can be set to not do
497       VERP expansion on normal list deliveries - the VERP
498       configuration should now look like:-</p>
499 <pre>
500   VERP_PASSWORD_REMINDERS = 1
501   VERP_PERSONALIZED_DELIVERIES = 1
502   VERP_CONFIRMATIONS = 1
503   VERP_DELIVERY_INTERVAL = 0
504 </pre>
505
506     <p>If you have set personalisation on any list, this will still be
507     handled, and VERPed, by Mailman.</p>
508
509     <h2><a href="#index"><a name="virdom">Virtual domains</a></a></h2>
510
511     <p>One approach to handling virtual domains is to use a separate
512     Mailman installation for each virtual domain.  (Currently, this is
513     the only way to have lists with the same name in different virtual
514     domains handled by the same machine.)</p>
515
516     <p>In this case, you must change the <tt>MM_HOME</tt> macro to
517     something like this:-</p>
518
519 <pre>
520   MM_HOME=/virtual/${lc::$domain}/mailman
521 </pre>
522
523     <p>and modify the <tt>mm_domains</tt> domain list appropriately.</p>
524
525     <h2><a href="#index"><a name="lispol">List policy management</a></a></h2>
526
527     <p>Most list policy handling is done within Mailman using the Web
528     GUI.  However some issues may be better handled by the MTA,
529     especially matters of overall site policy (not just mailing list
530     policy).  For example you may wish to do virus or spam scanning on
531     incoming messages.</p>
532
533     <p>In general you exclude outgoing list mail from any policy
534     controls.  This is because outgoing list mail has already been
535     through the policy controls on the way into the system.
536     Additionally spam scanning (for example) is a machine intensive
537     operation, and scanning a message that has already been scanned,
538     and then replicated to many recipients, is going to be very
539     expensive as well as ineffective.  For this reason you will
540     normally have an <tt>accept</tt> clause early on in your ACLs that
541     causes Mailman generated traffic to bypass the machine intensive
542     checks.</p>
543
544     <h3><a href="#index"><a name="conpol">Content scanning</a></a></h3>
545
546     <p>I would recommend that mailing lists now scan for both spam and
547     viruses on incoming mail - this is due to the potential for a
548     compromised windows machine belonging to a subscriber managing to
549     distribute unwanted content via the list.  This causes problems
550     not only to the list reputation, but also to the list manager who
551     will get many many bounces from subscribers who do content
552     scanning on their own incoming mail.</p>
553
554     <p>The best way to do this is using the <a
555     href="http://duncanthrax.net/exiscan-acl/">exiscan</a> extension
556     along with a virus scanner such as <a
557     href="http://duncanthrax.net/exiscan-acl/">clam-av</a> and a spam
558     content scanner such as <a
559     href="http://www.spamassassin.org/">SpamAssassin</a>. Configuring
560     these is beyond the scope of this document, however Tim Jackson
561     has a very good set of <a
562     href="http://www.timj.co.uk/linux/Exim-SpamAndVirusScanning.pdf">PDF
563     documentation</a> on integrating these.</p>
564
565     <p>One thing to note is that if you add full SpamAssassin headers
566     onto list messages this bulks up the messages significantly.
567     These headers are also available to list subscribers, which might
568     make it easier for someone malicious to work out how to evade your
569     spam scanning strategy.  I would suggest that Spam headers are not
570     added for Mailman incoming mail, or minimal (short) headers added,
571     or that they are stripped somewhere.  However having minimal
572     headers on means that you can, for example, moderate all messages
573     which have a given spam rating (as well as bouncing messages with
574     a very high rating).</p>
575
576     <h3><a href="#index"><a name="incpol">Incoming message checks</a></a></h3>
577
578     <p>You may wish to apply various checks to incoming messages to
579     ensure that they are sane.  These may include:-</p>
580
581     <ul>
582       <li>DNSBL checks</li>
583       <li>Header checks</li>
584       <li>Sender callback verification</li>
585     </ul>
586
587     <p>However all of these do have some degree of false positive
588     ratings.  You need to be aware of how much of your user base you
589     may alienate by imposing too strict a set of controls, and balance
590     that against the reduced amount of unwanted bulk mail.</p>
591
592     <h3><a href="#index"><a name="mmapol">Mailman specific ACL checks</a></a></h3>
593
594     <p>Lists should never receive bounce messages to the posting
595     address unless the bounced message is either a forgery using the
596     list address as the sender address, or the bouncing MTA is
597     terminally broken.  In either of these cases we really are not
598     interested in receiving the messages and can reject them at SMTP
599     time with a clear conscience.  The ACL to do this (as part of the
600     RCPT ACL) is:-</p>
601
602 <pre>
603   # Reject bounce (null sender) messages to the list
604   reject   message = "Recipient never sends mail so cannot cause bounces"
605            senders = :
606            domains = +mm_domains
607            condition = ${if exists{MM_LISTCHK} {yes}{no}}
608 </pre>
609
610     <p>Additionally other mailman addresses do not generate mail (as
611     the envelope sender, although they may be mentioned in the header
612     addresses.  The ACL is split into 2 so that it can be written
613     without the local_part condition wrapping.</p>
614
615 <pre>
616   # Reject bounce (null sender) messages to the list
617   reject   message = "Recipient never sends mail so cannot cause bounces"
618            senders = :
619            domains = +mm_domains
620            local_parts = \N^.*-(admin|join|leave|owner|request)$\N
621   reject   message = "Recipient never sends mail so cannot cause bounces"
622            senders = :
623            domains = +mm_domains
624            local_parts = \N^.*-(subscribe|unsubscribe)$\N
625 </pre>
626
627     <h3><a href="#index"><a name="smtune">SMTP callbacks</a></a></h3>
628
629     <p>Exim's SMTP callback feature is an even more powerful way to
630     detect bogus sender addresses than normal sender verification.
631     They are specially useful for checking envelope sender addresses
632     at RCPT time within SMTP, and have been to date the most effective
633     single anti-SPAM measure (however it should be noted that CBV is
634     hated vehemently by some mail admins, and does increase both
635     latency and traffic, as well as theoretically being a means to set
636     up a DDOS situation).</p>
637
638     <p>It is recommended that SMTP Sender CBV is not carried out on
639     messages to the Mailman bounce handlers, so that broken remote
640     MTAs (specifcally ones which send bounces with something other
641     than a null sender address) do not get excluded from being taken
642     off mailing lists</p>
643
644 <pre>
645   # Do callback verification unless Mailman incoming bounce
646   reject   !local_parts = *-bounces : *-bounces+*
647            !verify = sender/callout=30s,defer_ok
648
649 </pre>
650
651     <p>Callback verification can also be done on header addresses, but
652     care should be taken not to reject messages unnecessarily,
653     especially when the message is going to Mailman's bounce
654     processor</p>
655
656     <h2><a href="#index"><a name="lisver">List verification</a></a></h2>
657
658     <p>This is how a set of address tests for the Exim lists look on a
659     working system.  The list in question is
660     <tt>testlist@list.example.com</tt>, and these commands were
661     run on the <tt>list.example.com</tt> mail server (<tt>"% "</tt>
662     indicates the Unix shell prompt):</p>
663
664 <pre>
665   % exim -bt testlist@list.example.com
666   testlist@list.example.com
667     router = mailman_router, transport = mailman_transport
668   
669   % exim -bt testlist-request@list.example.com
670   testlist-request@list.example.com
671     router = mailman_router, transport = mailman_transport
672   
673   % exim -bt testlist-bounces@list.example.com
674   testlist-bounces@list.example.com
675     router = mailman_router, transport = mailman_transport
676   
677   % exim -bt testlist-bounces+luser=example.com@list.example.com
678   testlist-bounces+luser=example.com@list.example.com
679     router = mailman_router, transport = mailman_transport
680 </pre>
681
682     <p>If your <tt>"exim -bt"</tt> output looks something like this,
683     that's a start: at least it means Exim will pass the right
684     messages to the right Mailman commands.  It by no means guarantees
685     that your Exim/Mailman installation is functioning perfectly,
686     though!</p>
687
688     <h2><a href="#index"><a name="problem">Possible Problems</a></a></h2>
689
690     <ul>
691
692       <li> Mailman will send as many <tt>MAIL FROM/RCPT TO</tt> as it
693       needs. It may result in more than 10 or 100 messages sent in one
694       connection, which will exceed the default value of Exim's
695       smtp_accept_queue_per_connection This is bad because it will
696       cause Exim to switch into queue mode and severely delay delivery
697       of your list messages.  The way to fix this is to set mailman's
698       <tt>SMTP_MAX_SESSIONS_PER_CONNECTION</tt> (in
699       <tt>~mailman/Mailman/mm_cfg.py</tt>) to a smaller value than
700       Exim's <tt>smtp_accept_queue_per_connection</tt></li>
701
702       <li>Mailman should ignore Exim delay warning messages, even
703       though Exim should never send this to list messages.  Mailman
704       2.1's general bounce detection and VERP support should greatly
705       improve the bounce detector's hit rates.</li>
706
707       <li>List existence is determined by the existence of a
708       <tt>config.pck</tt> file for a list.  If you delete lists by
709       foul means, be aware of this.</li>
710
711       <li>If you are getting Exim or Mailman complaining about user
712       ids when you send mail to a list, check that the
713       <tt>MM_UID</tt> and <tt>MM_GID</tt> match those of
714       Mailman itself (i.e. what were used in the configure script).
715       Also make sure you do not have aliases in the main alias file
716       for the list.</li>
717
718     </ul>
719
720     <h2><a href="#index"><a name="dochis">Document History</a></a></h2>
721
722     <ul>
723       <li>Originally written by Nigel Metheringham.</li>
724       <li>Updated by Marc Merlin for Mailman 2.1, Exim 4</li>
725       <li>Overhauled/reformatted/clarified/simplified by Greg
726         Ward.</li>
727       <li>Rehashed again by Nigel Metheringham</li>
728     </ul>
729
730     <p>Like many documents of this type, it has evolved and taken on
731     contributions by many many helpful folks, mainly those on the
732     Mailman and exim mailing lists.  To all of you, who have made
733     contributions yet had their names shamefully lost by me, <i>Thank
734     You</i>.</p>
735
736     <hr>
737     <h4>$Id: mailman21.html,v 1.3 2004/06/09 11:36:59 nigel Exp $</h4>
738   </body>
739 </html>