~mailman-coders/mailman/2.1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732
3733
3734
3735
3736
3737
3738
3739
3740
3741
3742
3743
3744
3745
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770
3771
3772
3773
3774
3775
3776
3777
3778
3779
3780
3781
3782
3783
3784
3785
3786
3787
3788
3789
3790
3791
3792
3793
3794
3795
3796
3797
3798
3799
3800
3801
3802
3803
3804
3805
3806
3807
3808
3809
3810
3811
3812
3813
3814
3815
3816
3817
3818
3819
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841
3842
3843
3844
3845
3846
3847
3848
3849
3850
3851
3852
3853
3854
3855
3856
3857
3858
3859
3860
3861
3862
3863
3864
3865
3866
3867
3868
3869
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3886
3887
3888
3889
3890
3891
3892
3893
3894
3895
3896
3897
3898
3899
3900
3901
3902
3903
3904
3905
3906
3907
3908
3909
3910
3911
3912
3913
3914
3915
3916
3917
3918
3919
3920
3921
3922
3923
3924
3925
3926
3927
3928
3929
3930
3931
3932
3933
3934
3935
3936
3937
3938
3939
3940
3941
3942
3943
3944
3945
3946
3947
3948
3949
3950
3951
3952
3953
3954
3955
3956
3957
3958
3959
3960
3961
3962
3963
3964
3965
3966
3967
3968
3969
3970
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982
3983
3984
3985
3986
3987
3988
3989
3990
3991
3992
3993
3994
3995
3996
3997
3998
3999
4000
4001
4002
4003
4004
4005
4006
4007
4008
4009
4010
4011
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022
4023
4024
4025
4026
4027
4028
4029
4030
4031
4032
4033
4034
4035
4036
4037
4038
4039
4040
4041
4042
4043
4044
4045
4046
4047
4048
4049
4050
4051
4052
4053
4054
4055
4056
4057
4058
4059
4060
4061
4062
4063
4064
4065
4066
4067
4068
4069
4070
4071
4072
4073
4074
4075
4076
4077
4078
4079
4080
4081
4082
4083
4084
4085
4086
4087
4088
4089
4090
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106
4107
4108
4109
4110
4111
4112
4113
4114
4115
4116
4117
4118
4119
4120
4121
4122
4123
4124
4125
4126
4127
4128
4129
4130
4131
4132
4133
4134
4135
4136
4137
4138
4139
4140
4141
4142
4143
4144
4145
4146
4147
4148
4149
4150
4151
4152
4153
4154
4155
4156
4157
4158
4159
4160
4161
4162
4163
4164
4165
4166
4167
4168
4169
4170
4171
4172
4173
4174
4175
4176
4177
4178
4179
4180
4181
4182
4183
4184
4185
4186
4187
4188
4189
4190
4191
4192
4193
4194
4195
4196
4197
4198
4199
4200
4201
4202
4203
4204
4205
4206
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216
4217
4218
4219
4220
4221
4222
4223
4224
4225
4226
4227
4228
4229
4230
4231
4232
4233
4234
4235
4236
4237
4238
4239
4240
4241
4242
4243
4244
4245
4246
4247
4248
4249
4250
4251
4252
4253
4254
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267
4268
4269
4270
4271
4272
4273
4274
4275
4276
4277
4278
4279
4280
4281
4282
4283
4284
4285
4286
4287
4288
4289
4290
4291
4292
4293
4294
4295
4296
4297
4298
4299
4300
4301
4302
4303
4304
4305
4306
4307
4308
4309
4310
4311
4312
4313
4314
4315
4316
4317
4318
4319
4320
4321
4322
4323
4324
4325
4326
4327
4328
4329
4330
4331
4332
4333
4334
4335
4336
4337
4338
4339
4340
4341
4342
4343
4344
4345
4346
4347
4348
4349
4350
4351
4352
4353
4354
4355
4356
4357
4358
4359
4360
4361
4362
4363
4364
4365
4366
4367
4368
4369
4370
4371
4372
4373
4374
4375
4376
4377
4378
4379
4380
4381
4382
4383
4384
4385
4386
4387
4388
4389
4390
4391
4392
4393
4394
4395
4396
4397
4398
4399
4400
4401
4402
4403
4404
4405
4406
4407
4408
4409
4410
4411
4412
4413
4414
4415
4416
4417
4418
4419
4420
4421
4422
4423
4424
4425
4426
4427
4428
4429
4430
4431
4432
4433
4434
4435
4436
4437
4438
4439
4440
4441
4442
4443
4444
4445
4446
4447
4448
4449
4450
4451
4452
4453
4454
4455
4456
4457
4458
4459
4460
4461
4462
4463
4464
4465
4466
4467
4468
4469
4470
4471
4472
4473
4474
4475
4476
4477
4478
4479
4480
4481
4482
4483
4484
4485
4486
4487
4488
4489
4490
4491
4492
4493
4494
4495
4496
4497
4498
4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518
4519
4520
4521
4522
4523
4524
4525
4526
4527
4528
4529
4530
4531
4532
4533
4534
4535
4536
4537
4538
4539
4540
4541
4542
4543
4544
4545
4546
4547
4548
4549
4550
4551
4552
4553
4554
4555
4556
4557
4558
4559
4560
4561
4562
4563
4564
4565
4566
4567
4568
4569
4570
4571
4572
4573
4574
4575
4576
4577
4578
4579
4580
4581
4582
4583
4584
4585
4586
4587
4588
4589
4590
4591
4592
4593
4594
4595
4596
4597
4598
4599
4600
4601
4602
4603
4604
4605
4606
4607
4608
4609
4610
4611
4612
4613
4614
4615
4616
4617
4618
4619
4620
4621
4622
4623
4624
4625
4626
4627
4628
4629
4630
4631
4632
4633
4634
4635
4636
4637
4638
4639
4640
4641
4642
4643
4644
4645
4646
4647
4648
4649
4650
4651
4652
4653
4654
4655
4656
4657
4658
4659
4660
4661
4662
4663
4664
4665
4666
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677
4678
4679
4680
4681
4682
4683
4684
4685
4686
4687
4688
4689
4690
4691
4692
4693
4694
4695
4696
4697
4698
4699
4700
4701
4702
4703
4704
4705
4706
4707
4708
4709
4710
4711
4712
4713
4714
4715
4716
4717
4718
4719
4720
4721
4722
4723
4724
4725
4726
4727
4728
4729
4730
4731
4732
4733
4734
4735
4736
4737
4738
4739
4740
4741
4742
4743
4744
4745
4746
4747
4748
4749
4750
4751
4752
4753
4754
4755
4756
4757
4758
4759
4760
4761
4762
4763
4764
4765
4766
4767
4768
4769
4770
4771
4772
4773
4774
4775
4776
4777
4778
4779
4780
4781
4782
4783
4784
4785
4786
4787
4788
4789
4790
4791
4792
4793
4794
4795
4796
4797
4798
4799
4800
4801
4802
4803
4804
4805
4806
4807
4808
4809
4810
4811
4812
4813
4814
4815
4816
4817
4818
4819
4820
4821
4822
4823
4824
4825
4826
4827
4828
4829
4830
4831
4832
4833
4834
4835
4836
4837
4838
4839
4840
4841
4842
4843
4844
4845
4846
4847
4848
4849
4850
4851
4852
4853
4854
4855
4856
4857
4858
4859
4860
4861
4862
4863
4864
4865
4866
4867
4868
4869
4870
4871
4872
4873
4874
4875
4876
4877
4878
4879
4880
4881
4882
4883
4884
4885
4886
4887
4888
4889
4890
4891
4892
4893
4894
4895
4896
4897
4898
4899
4900
4901
4902
4903
4904
4905
4906
4907
4908
4909
4910
4911
4912
4913
4914
4915
4916
4917
4918
4919
4920
4921
4922
4923
4924
4925
4926
4927
4928
4929
4930
4931
4932
4933
4934
4935
4936
4937
4938
4939
4940
4941
4942
4943
4944
4945
4946
4947
4948
4949
4950
4951
4952
4953
4954
4955
4956
4957
4958
4959
4960
4961
4962
4963
4964
4965
4966
4967
4968
4969
4970
4971
4972
4973
4974
4975
4976
4977
4978
4979
4980
4981
4982
4983
4984
4985
4986
4987
4988
4989
4990
4991
4992
4993
-*- coding: iso-8859-1 -*-
Mailman - The GNU Mailing List Management System
Copyright (C) 1998-2020 by the Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA

Here is a history of user visible changes to Mailman.

2.1.40 (xx-xxx-xxxx)

  i18n

    - The German translation of `Esperanto` is fixed.  (LP: #1966685)

  Bug Fixes and other patches

    - Test for a valid header following a Unix From_ line in bin/cleanarch
      has been improved.  (LP: #1957025)
    - A 500 Internal Server Error when requesting the options page for a
      non-member address on a list with private rosters is avoided.
      (LP: #1961762)
    - A possible list membership leak via the user options CGI is fixed.
      (LP: #1968443)
    - Another possible list membership leak via the user options CGI is fixed.
      (LP: #2015416)
    - Yet another possible list membership leak via the user options CGI is
      fixed.  (LP: #2017813)

2.1.39 (13-Dec-2021)

  Bug Fixes and other patches

    - User matching for CSRF tokens is no longer case sensitive., and a
      potential NamerError in logging is fixed.  (LP: #1954694)

2.1.38 (30-Nov-2021)

  Security

    - A potential CSRF attack against a list admin from a list member or
      moderator has been blocked.  CVE-2021-44227  (LP: #1952384)

  Bug Fixes and other patches

    - NotAMemberError exception from the user options page when the user has
      been asynchronously unsubscribed is fixed.  (LP: #1951769)

2.1.37 (12-Nov-2021)

  Bug Fixes and other patches

    - A bug in the fix for CVE-2021-43332 has neen fixed.  (LP: #1950833)

2.1.36 (12-Nov-2021)

  Security

    - A potential XSS attack via the user options page has been reported by
      Harsh Jaiswal.  This is fixed.  CVE-2021-43331 (LP: #1949401)

    - A potential for for a list moderator to carry out an off-line brute force
      attack to obtain the list admin password has been reported by Andre
      Protas, Richard Cloke and Andy Nuttall of Apple.  This is fixed.
      CVE-2021-43332 (LP: #1949403)

2.1.35 (19-Oct-2021)

  Security

    - A potential for for a list member to carry out an off-line brute force
      attack to obtain the list admin password has been reported by Andre
      Protas, Richard Cloke and Andy Nuttall of Apple.  This is fixed.
      CVE-2021-42096  (LP: #1947639)

    - A CSRF attack via the user options page could allow takeover of a users
      account.  This is fixed.  CVE-2021-42097  (LP: #1947640)

  Bug Fixes and other patches

    - Fixed an issue where sometimes the wrapper message for DMARC mitigation
      Wrap Message has no Subject:.  (LP: #1915655)

    - Plain text message bodies with Content-Disposition: and no declared
      charset are no longer scrubbed.  (LP: #1917968)

    - CommandRunner now recodes message bodies in the charset of the user's
      or list's language to avoid a possible UnicodeError when including the
      message body in the reply.  (LP: #1921682)

    - Delivery disabled by bounce notices to admins now have 'disabled'
      properly translated.  (LP: #1922843)

    - DMARC policy discovery ignores domains with multiple DMARC records per
      RFC 7849,  (LP: 1931029)

2.1.34 (26-Jun-2020)

  i18n

    - The Spanish translation has been updated by Omar Walid Llorente.

  Bug Fixes and other patches

    - The fix for LP: #1859104 can result in ValueError being thrown on
      attempts to subscribe to a list. This is fixed and extended to apply
      REFUSE_SECOND_PENDING to unsubscription as well.  (LP: #1878458)

    - DMARC mitigation no longer misses if the domain name returned by DNS
      contains upper case.  (LP: #1881035)

    - A new WARN_MEMBER_OF_SUBSCRIBE setting can be set to No to prevent
      mailbombing of a member of a list with private rosters by repeated
      subscribe attempts.  (LP: #1883017)

    - Very long filenames for scrubbed attachments are now truncated.
      (LP: #1884456)

2.1.33 (07-May-2020)

  Security

    - A content injection vulnerability via the private login page has been
      fixed.  CVE-2020-15011  (LP: #1877379)

2.1.32 (05-May-2020)

  i18n

    Fixed a typo in the Spanish translation and updated mailman.pot and
    the message catalog for 2.1.31 security fix.

2.1.31 (05-May-2020)

  Security

    - A content injection vulnerability via the options login page has been
      discovered and reported by Vishal Singh. This is fixed.  CVE-2020-12108
      (LP: #1873722)

  i18n

    - The Spanish translation has been updated by Omar Walid Llorente.

  Bug Fixes and other patches

    - Bounce recognition for a non-compliant Yahoo format is added.

    - Archiving workaround for non-ascii in string.lowercase in some Python
      packages is added.

2.1.30 (13-Apr-2020)

  New Features

    - Thanks to Jim Popovitch, there is now a dmarc_moderation_addresses
      list setting that can be used to apply dmarc_moderation_action to mail
      From: addresses listed or matching listed regexps.  This can be used
      to modify mail to addresses that don't accept external mail From:
      themselves.

    - There is a new MAX_LISTNAME_LENGTH setting.  The fix for LP: #1780874
      obtains a list of the names of all the all the lists in the installation
      in order to determine the maximum length of a legitimate list name.  It
      does this on every web access and on sites with a very large number of
      lists, this can have performance implications.  See the description in
      Defaults.py for more information.

    - Thanks to Ralf Jung there is now the ability to add text based captchas
      (aka textchas) to the listinfo subscribe form.  See the documentation
      for the new CAPTCHA setting in Defaults.py for how to enable this.  Also
      note that if you have custom listinfo.html templates, you will have to
      add a <mm-captcha-ui> tag to those templates to make this work.  This
      feature can be used in combination with or instead of the Google
      reCAPTCHA feature added in 2.1.26.

    - Thanks to Ralf Hildebrandt the web admin Membership Management section
      now has a feature to sync the list's membership with a list of email
      addresses as with the bin/sync_members command.

    - There is a new drop_cc list attribute set from DEFAULT_DROP_CC.  This
      controls the dropping of addresses from the Cc: header in delivered
      messages by the duplicate avoidance process.  (LP: #1845751)

    - There is a new REFUSE_SECOND_PENDING mm_cfg.py setting that will cause
      a second request to subscribe to a list when there is already a pending
      confirmation for that user.  This can be set to Yes to prevent
      mailbombing of a third party by repeatedly posting the subscribe form.
      (LP: #1859104)

  i18n

    - The Japanese translation has been updated by Yasuhito FUTATSUKI.

    - The German translation has been updated by Ludwig Reiter.

    - The Spanish translation has been updated by Omar Walid Llorente.

    - The Brazilian Portugese translation has been updated by Emerson de Mello.

  Bug Fixes and other patches

    - Fixed the confirm CGI to catch a rare TypeError on simultaneous
      confirmations of the same token.  (LP: #1785854)

    - Scrubbed application/octet-stream MIME parts will now be given a
      .bin extension instead of .obj.  CVE-2020-12137  (LP: #1886117)

    - Added bounce recognition for a non-compliant opensmtpd DSN with
      Action: error.  (LP: #1805137)

    - Corrected and augmented some security log messages.  (LP: #1810098)

    - Implemented use of QRUNNER_SLEEP_TIME for bin/qrunner --runner=All.
      (LP: #1818205)

    - Leading/trailing spaces in provided email addresses for login to private
      archives and the user options page are now ignored.  (LP: #1818872)

    - Fixed the spelling of the --no-restart option for mailmanctl.

    - Fixed an issue where certain combinations of charset and invalid
      characters in a list's description could produce a List-ID header
      without angle brackets.  (LP: #1831321)

    - With the Postfix MTA and virtual domains, mappings for the site list
      -bounces and -request addresses in each virtual domain are now added
      to data/virtual-mailman (-owner was done in 2.1.24).  (LP: #1831777)

    - The paths.py module now extends sys.path with the result of
      site.getsitepackages() if available.  (LP: #1838866)

    - A bug causing a UnicodeDecodeError in preparing to send the confirmation
      request message to a new subscriber has been fixed.  (LP: #1851442)

    - The SimpleMatch heuristic bounce recognizer has been improved to not
      return most invalid email addresses.  (LP: #1859011)

2.1.29 (24-Jul-2018)

  Bug Fixes

    - Fixed the listinfo and admin overview pages that were broken by
      LP: #1780874.  (LP: #1783417)

2.1.28 (23-Jul-2018)

  Security

    - A content spoofing vulnerability with invalid list name messages in
      the web UI has been fixed.  CVE-2018-13796  (LP: #1780874)

  New Features

    - It is now possible to edit HTML and text templates via the web admin
      UI in a supported language other than the list's preferred_language.
      Thanks to Yasuhito FUTATSUKI.

  i18n

    - The Japanese translation has been updated by Yasuhito FUTATSUKI.

    - The German translation has been updated by Ralf Hildebrandt.

    - The Esperanto translation has been updated by Rubén Fernández Asensio.

  Bug fixes and other patches

    - The BLOCK_SPAMHAUS_LISTED_DBL_SUBSCRIBE feature added in 2.1.27 was
      not working.  This is fixed.  (LP: #1779774)

    - Escaping of HTML entities for the web UI is now done more selectively.
      (LP: #1779445)

2.1.27 (22-Jun-2018)

  Security

    - Existing protections against malicious listowners injecting evil
      scripts into listinfo pages have had a few more checks added.
      JVN#00846677/JPCERT#97432283/CVE-2018-0618

    - A few more error messages have had their values HTML escaped.
      JVN#00846677/JPCERT#97432283/CVE-2018-0618

    - The hash generated when SUBSCRIBE_FORM_SECRET is set could have been
      the same as one generated at the same time for a different list and
      IP address.  While this is not thought to be exploitable in any way,
      the generation has been changed to avoid this.  Thanks to Ralf Jung.

  New Features

    - An option has been added to bin/add_members to issue invitations
      instead of immediately adding members.  (LP: #1773064)

    - A new BLOCK_SPAMHAUS_LISTED_IP_SUBSCRIBE setting has been added to
      enable blocking web subscribes from IPv4 addresses listed in Spamhaus
      SBL, CSS or XBL.  It will work with IPv6 addresses if Python's
      py2-ipaddress module is installed.  The module can be installed via pip
      if not included in your Python.

    - Thanks to Jim Popovitch, Mailman has a new 'security' log and logs
      authentication failures to the various web CGI functions.  The logged
      data include the remote IP and can be used to automate blocking of IPs
      with something like fail2ban.  Since Mailman 2.1.14, these have returned
      an http 401 status and the information should be logged by the web
      server, but this new log makes that more convenient.  Also, the
      'mischief' log entries for 'hostile listname' noe include the remote IP
      if available.

    - Thanks to Jim Popovitch, admin notices of (un)subscribes now may give
      the source of the action.  This consists of a %(whence)s replacement
      that has been added to the admin(un)subscribeack.txt templates.  Thanks
      to Yasuhito FUTATSUKI for updating the non-English templates and help
      with internationalizing the reasons.

    - Thanks to Jim Popovitch, there is a new
      BLOCK_SPAMHAUS_LISTED_DBL_SUBSCRIBE setting to enable blocking web
      subscribes for addresses in domains listed in the Spamhaus DBL.

  i18n

    - The Japanese translation has been updated by Yasuhito FUTATSUKI.

    - The Russian translation has been updated by Danil Smirnov.

    - A partial Esperanto translation has been added.  Thanks to
      Rubén Fernández Asensio.

    - Fixed a '# -*- coding:' line in the Russian message catalog that was
      mistakenly translated to Russian.  (LP: #1777342)

  Bug fixes and other patches

    - Some messages from bin/arch were not issued in the charset of the system
      locale when DISABLE_COMMAND_LOCALE_CSET is No.  Thanks to Yasuhito
      FUTATSUKI this is now fixed.  (LP: #1768892)

    - The message displayed in the browser when accessing a Mailman CGI when
      mm_cfg.py can't be imported due to some exception other than ImportError
      has been improved.  (LP: #1760506)

    - The reimplementation of DELIVERY_RETRY_WAIT in 2.1.26 could cause extra
      dequeueing and requeueing in the out queue by OutgoingRunner.  This is
      fixed.  (LP: #1762871)

    - A Python 2.7 dependency introduced in the ToDigests handler in Mailman
      2.1.24 has been removed.  (LP: #1755317)

    - Bad values in a list's topics will no longer break everything that
      might instantiate the list.  (LP: #1754516)

    - A Python 2.7 dependency introduced with the reCAPTCHA feature in 2.1.26
      has been removed.  (LP: #1752658)

    - The reCAPTCHA feature requires JavaScript.  If JavaScript is not enabled,
      a message will be displayed on the subscribe form that JavaScript is
      required.  (LP: #1769374)

    - Quoting in the mailman-config command has been changed from double to
      single quotes to allow double-quoted parameters.  (LP: #1774986)

    - Approving a held subscription for a user with a 'different' preferred
      language no longer corrupts the results page.  (LP: #1777222)

    - An issue with garbled descriptions on listinfo and admin overview pages
      and the heading of a list's listinfo page due to incompatible character
      sets has been fixed thanks to Yasuhito FUTATSUKI.

  Miscellaneous

    - Added to the contrib directory, a script from Jim Popovitch to generate
      Sitemap files for a list's archive.

2.1.26 (04-Feb-2018)

  Security

    - An XSS vulnerability in the user options CGI could allow a crafted URL
      to execute arbitrary javascript in a user's browser.  A related issue
      could expose information on a user's options page without requiring
      login.  These are fixed.  Thanks to Calum Hutton for the report.
      CVE-2018-5950  (LP: #1747209)

  New Features

    - Thanks to David Siebörger who adapted an existing patch by Andrea
      Veri to use Google reCAPTCHA v2 there is now the ability to add
      reCAPTCHA to the listinfo subscribe form.  There are two new mm_cfg.py
      settings for RECAPTCHA_SITE_KEY and RECAPTCHA_SECRET_KEY, the values
      for which you obtain for your domain(s) from Google at
      <https://www.google.com/recaptcha/admin>.

    - Thanks to Lindsay Haisley, there is a new bin/mailman-config command
      to display various information about this Mailman version and how it
      was configured.

  i18n

    - The Japanese message catalog has been updated for added strings by
      Yasuhito FUTATSUKI.

    - The German translation of a couple of templates has been updated by
      Thomas Hochstein.

    - The Japanese translation of Defaults.py.in has been updated by
      Yasuhito FUTATSUKI.

  Bug fixes and other patches

    - Fixed an i18n bug in the reCAPTCHA feature.  (LP: #1746189)

    - Added a few more environment variables to the list of those passed
      to CGIs to support an nginx/uwsgi configuration.  (LP #1744739)

    - Mailman 2.1.22 introduced a Python 2.7 dependency that could affect
      bin/arch processing a message without a valid Date: header.  The
      dependency has been removed.  (LP: #1740543)

    - Messages held for header_filter_rules now show the matched regexp in
      the hold reason.  (LP: #1737371)

    - When updating the group and mode of a .db file with Mailman's Postfix
      integration, a missing file is ignored.  (LP: #1734162)

    - The DELIVERY_RETRY_WAIT setting is now effective.  (LP: #1729472)

2.1.25 (26-Oct-2017)

  New Features

    - The admindb held subscriptions listing now includes the date of the
      most recent request from the address.  (LP: #1697097)

  Accessibility

    - The admin Membership List now includes text for screen readers which
      identifies the function of each checkbox.  CSS is added to the page to
      visually hide the text but still allow screen readers to read it.
      Similar text has been added to some radio buttons on the admindb pages.

  i18n

    - The Russian translation has been updated by Sergey Matveev.
      (LP: #1708016)

  Bug fixes and other patches

    - Thanks to Jim Popovitch, certain failures in DNS lookups of DMARC policy
      will now result in mitigations being applied.  (LP: #1722013)

    - The default DMARC reject reason now properly replaces %(listowner)s.
      (LP: #1718962)

    - The web roster page now shows case preserved email addresses.
      (LP: #1707447)

    - Changed the SETGID wrappers to only pass those items in the environment
      that are needed by the called scripts.  (LP: #1705736)

    - Fixed MTA/Postfix.py to ensure that created aliases(.db) and
      virtual-mailman(.db) files are readable by Postfix and the .db files are
      owned by the Mailman user.  (LP: #1696066)

    - Defended against certain web attacks that cause exceptions and "we hit
      a bug" responses when POST data or query fragments contain multiple
      values for the same parameter.  (LP: #1695667)

    - The fix for LP: #1614841 caused a regression in the options CGI.  This
      has been fixed.  (LP: #1602608)

    - Added a -a option to the (e)grep commands in contrib/mmdsr to account
      for logs that may have non-ascii and be seen as binary.

    - Fixed the -V option to bin/list_lists to not show lists whose host is a
      subdomain of the given domain.  (LP: #1695610)

2.1.24 (02-Jun-2017)

  Security

    - A most likely unexploitable XSS attach that relies on the Mailman web
      server passing a crafted Host: header to the CGI environment has been
      fixed.  Apache for one is not vulnerable.  Thanks to Alqnas Eslam.

  New Features

    - There is a new RCPT_BASE64_HEADER_NAME setting.  If this is set to a
      non-empty string, that string is the name of a header that will be added
      to personalized and VERPed deliveries with value equal to the base64
      encoding of the recipient's email address.  This is intended to enable
      identification of the recipient otherwise redacted from "spam report"
      feedback loop messages.

    - cron/senddigests has a new -e/--exceptlist option to send pending
      digests for all but a named list.  (LP: #1619770)

    - The values for DEFAULT_DIGEST_FOOTER and DEFAULT_MSG_FOOTER have been
      changed to use a standard signature separator for DEFAULT_MSG_FOOTER
      and to remove the unneded line of underscores from DEFAULT_DIGEST_FOOTER.
      (LP: #266269)

  i18n

    - The Polish html templates have been recoded to use html entities
      instead of non-ascii characters.

    - The Basque (Euskara) translation has been updated by Gari Araolaza.

    - The German "details for personalize" page has been updated by
      Christian F Buser.

    - The Japanese translation has been updated by Yasuhito FUTATSUKI.

  Bug fixes and other patches

    - The list-owner@virtual.domain addresses are now added to virtual-mailman
      as they are exposed in 'list created' emails.  (LP: #1694384)

    - The 'list run by' addresses in web page footers are now just the
      list-owner address.  (LP: #1694384)

    - Changed member_verbosity_threshold from a >= test to a strictly > test
      to avoid the issue of moderating every post when the threshold = 1.
      (LP: #1693366)

    - Subject prefixing has been improved to always have a space between
      the prefix and the subject even with non-ascii in the prefix.  This
      will sometimes result in two spaces when the prefix is non-ascii but
      the subject is ascii, but this is the lesser evil.  (LP: #1525954)

    - Treat message and digest headers and footers as empty if they contain
      only whitespace.  (LP: #1673307)

    - Ensured that added message and digest headers and footers always have
      a terminating new-line.  (LP: #1670033)

    - Fixed an uncaught TypeError in the subscribe CGI.  (LP: #1667215)

    - Added recognition for a newly seen mailEnable bounce.

    - Fixed an uncaught NotAMemberError when a member is removed before a
      probe bounce for the member is returned.  (LP: #1664729)

    - Fixed a TypeError thrown in the roster CGI when called with a listname
      containing a % character.  (LP: #1661810)

    - Fixed a NameError issue in bin/add_members with
      DISABLE_COMMAND_LOCALE_CSET = yes.  (LP: #1647450)

    - The CleanseDKIM handler has been removed from OWNER_PIPELINE.  It isn't
      needed there and has adverse DMARC implications for messages to -owner
      of an anonymous list.  (LP: #1645901)

    - Fixed an issue with properly RFC 2047 encoding the display name in the
      From: header for messages with DMARC mitigations.  (LP: #1643210)

    - Fixed an issue causing UnicodeError in sending digests following a
      change of a list's preferred_language.  (LP: #1644356)

    - Enhanced the fix for race conditions in MailList().Load().  (LP: #266464)

    - Fixed a typo in Utils.py that could have resulted in a NameError in
      logging an unlikely occurrence.  (LP: #1637745)

    - Fixed a bug which created incorrect "view more members" links at the
      bottom of the admin Membership List pages.  (LP: #1637061)

    - The 2.1.23 fix for LP: #1604544 only fixed the letter links at the top
      of the Membership List.  The links at the bottom have now been fixed.

    - paths.py now adds dist-packages as well as site-packages to sys.path.
      (LP: #1621172)

    - INIT INFO has been added to the sample init.d script.  (LP: #1620121)

2.1.23 (27-Aug-2016)

  Security

    - CSRF protection has been extended to the user options page.  This was
      actually fixed by Tokio Kikuchi as part of the fix for LP: #775294 and
      intended for Mailman 2.1.15, but that fix wasn't completely merged at the
      time.  The full fix also addresses the admindb, and edithtml pages as
      well as the user options page and the previously fixed admin pages.
      Thanks to Nishant Agarwala for reporting the issue.  CVE-2016-6893
      (LP: #1614841)

  New Features

    - For header_filter_rules matching, RFC 2047 encoded headers, non-encoded
      headers and header_filter_rules patterns are now all decoded to unicode.
      Both XML character references of the form &#nnnn; and unicode escapes
      of the form \Uxxxx in patterns are converted to unicodes as well.  Both
      headers and patterns are normalized to 'NFKC' normal form before
      matching, but the normalization form can be set via a new NORMALIZE_FORM
      mm_cfg setting.  Also, the web UI has been updated to encode characters
      in text fields that are invalid in the character set of the page's
      language as XML character references instead of '?'.  This should help
      with entering header_filter_rules patterns to match 'odd' characters.
      This feature is experimental and is problematic for some cases where it
      is desired to have a header_filter_rules pattern with characters not in
      the character set of the list's preferred language.  For patterns
      without such characters, the only change in behavior should be because
      of unicode normalization which should improve matching.  For other
      situations such as trying to match a Subject: with CJK characters (range
      U+4E00..U+9FFF) on an English language (ascii) list, one can enter a
      pattern like '^subject:.*[&#19968;-&#40959;]' or
      '^subject:.*[\u4e00;-\u9fff;]' to match a Subject with any character in
      the range, and it will work, but depending on the actual characters and
      the browser, submitting another, even unrelated change can garble the
      original entry although this usually occurs only with ascii pages and
      characters in the range \u0080-\u00ff.  The \Uxxxx unicode escapes must
      have exactly 4 hex digits, but they are case insensitive.  (LP: #558155)

    - Thanks to Jim Popovitch REMOVE_DKIM_HEADERS can now be set to 3 to
      preserve the original headers as X-Mailman-Original-... before removing
      them.

    - Several additional templates have been added to those that can be edited
      via the web admin GUI.  (LP: #1583387)

    - SMTPDirect.py can now do SASL authentication and STARTTLS security when
      connecting to the outgoiung MTA. Associated with this are new
      Defaults.py/mm_cfg.py settings SMTP_AUTH, SMTP_USER, SMTP_PASSWD and
      SMTP_USE_TLS.  (LP: #558281)

    - There is a new Defaults.py/mm_cfg.py setting SMTPLIB_DEBUG_LEVEL which
      can be set to 1 to enable verbose smtplib debugging to Mailman's error
      log to help with debugging 'low level smtp failures'.  (LP: #1573074)

    - A list's nonmember_rejection_notice attribute will now be the default
      rejection reason for a held non-member post in addition to it's prior
      role as the reson for an automatically rejected non-member post.
      (LP: #1572330)

  i18n

    - The French translation of 'Dutch' is changed from 'Hollandais' to
      'Néerlandais' per Francis Jorissen.

    - Some German language templates that were incorrectly utf-8 encoded have
      been recoded as iso-8859-1.  (LP: #1602779)

    - Japanese translation and documentation in messages/ja has been updated by
      Yasuhito FUTATSUKI.

  Bug fixes and other patches

    - The admin Membership List letter links could be incorrectly rendered as
      Unicode strings following a search.  (LP: #1604544)

    - We no longer throw an uncaught TypeError with certain defective crafted
      POST requests to Mailman's CGIs.  (LP: #1602608)

    - Scrubber links in archives are now in the list's preferred_language
      rather than the poster's language.  (LP: #1586505)

    - Improved logging of banned subscription and address change attempts.
      (LP: #1582856)

    - In rare circumstances a list can be removed while the admin or listinfo
      CGI or bin/list_lists is running causing an uncaught MMUnknownListError
      to be thrown.  The exception is now caught and handled.  (LP: #1582532)

    - Set the Date: header in the wrapper message when from_is_list or
      dmarc_moderation_action is Wrap Message.  (LP: #1581215)

    - A site can now set DMARC_ORGANIZATIONAL_DOMAIN_DATA_URL to None or the
      null string if it wants to avoid using this.  (LP: #1578450)

    - The white space to the left of the admindb Logout link is no longer
      part of the link.  (LP: #1573623)

2.1.22 (17-Apr-2016)

  i18n

    - Fixed a typo in the German options.html template.  (LP: #1562408)

    - An error in the Brazilian Portugese translation of Quarterly has been
      fixed thanks to Kleber A. Benatti.

    - The Brazilian Portugese translation has been updated by Emerson Ribeiro
      de Mello.

  Bug fixes and other patches

    - All addresses in data/virtual-mailman are now properly appended with
      VIRTUAL_MAILMAN_LOCAL_DOMAIN and duplicates are not generated if the
      site list is in a virtual domain.  (LP: #1570630)

    - DMARC mitigations will now find the From: domain to the right of the
      rightmost '@' rather than the leftmost '@'.  (LP: #1568445)

    - DMARC mitigations for a sub-domain of an organizational domain will now
      use the organizational domain's sp= policy if any.  (LP: #1568398)

    - Modified NewsRunner.py to ensure that messages gated to Usenet have a
      non-blank Subject: header and when munging the Message-ID to add the
      original to References: to help with threading.  (LP: #557955)

    - Fixed the pipermail archiver to do a better job of figuring the date of
      a post when its Date: header is missing, unparseable or has an obviously
      out of range date.  This should only affect bin/arch as ArchRunner has
      code to fix dates at least if ARCHIVER_CLOBBER_DATE_POLICY has not been
      set to 0 in mm_cfg.py.  If posts have been added in the past to a list's
      archive using bin/arch and an imported mbox, running bin/arch again could
      result is some of those posts being archived with a different date.
      (LP: #1555798)

    - Fixed an issue with CommandRunner shunting a malformed message with a
      null byte in the body.  (LP: #1553888)

    - Don't collapse multipart with a single sub-part inside multipart/signed
      parts.  (LP: #1551075)

2.1.21 (28-Feb-2016)

  New Features

    - There is a new dmarc_none_moderation_action list setting and a
      DEFAULT_DMARC_NONE_MODERATION_ACTION mm_cfg.py setting to optionally
      apply Munge From or Wrap Message actions to posts From: domains that
      publish DMARC p=none.  The intent is to eliminate failure reports to
      the domain owner for messages that would be munged or wrapped if the
      domain published a stronger DMARC policy.  See the descriptions in
      Defaults.py, the web UI and the bug report for more.  (LP: #1539384)

    - Thanks to Jim Popovitch there is now a feature to automatically turn
      on moderation for a malicious list member who attempts to flood a list
      with spam.  See the details for the Privacy options ... -> Sender
      filters -> member_verbosity_threshold and member_verbosity_interval
      settings in the web admin UI and the documentation in Defaults.py for
      the DEFAULT_MEMBER_VERBOSITY_* and VERBOSE_CLEAN_LIMIT settings for
      information.

    - bin/list_members now has options to display all moderated or all
      non-moderated members.

    - There is now a mm_cfg.py setting GLOBAL_BAN_LIST which is like the
      individual list's ban_list but applies globally to all subscribe
      requests.  See the description in Defaults.py for more details.

  i18n

    - The Japanese translation has been updated by Yasuhito FUTATSUKI.

    - Also thanks to Miloslav Trmac and Yasuhito FUTATSUKI, the l10n for
      Mailman's bin/ commands has been fixed to display using the character
      set of the user's work station even when Mailman's character set for
      the language is different.  Because this has not been tested over a
      wide set of locales, there is an mm_cfg.py switch
      DISABLE_COMMAND_LOCALE_CSET to disable it if it causes problems.
      (LP: #558167)

    - The Polish translation has been updated by Stefan Plewako.

    - The German translation has been updated by Mirian Margiani and
      Bernhard Schmidt.

    - The Russian translation has been updated by Danil Smirnov.

    - Several Galician templates that were improperly encoded as iso-8859-1
      have been fixed.  (LP: #1532504)

    - The Brazilian Portugese translation has been updated by Emerson Ribeiro
      de Mello.

  Bug fixes and other patches

    - If DMARC lookup fails to find a policy, also try the Organizational
      Domain.  Associated with this is a new mm_cfg.py setting
      DMARC_ORGANIZATIONAL_DOMAIN_DATA_URL which sets the URL used to
      retrieve the data for the algorithm that computes the Organizational
      Domain.  See https://publicsuffix.org/list/ for info.  (LP: #1549420)

    - Modified contrib/mmdsr to correctly report No such list names that
      contain ".

    - User's "Acknowledge" option will now be honored for posts to anonymous
      lists.  (LP: #1546679)

    - Fixed a typo in the Non-digest options regular_exclude_ignore
      description thanks to Yasuhito FUTATSUKI.

    - DEFAULT_PASS_MIME_TYPES has been changed to accept text/plain sub-parts
      from message/rfc822 parts and multipart parts other than mixed and
      alternative and also accept pgp signatures.  This only applies to newly
      created lists and other than pgp signatures, still only accepts
      text/plain.  (LP: #1517446)

    - Modified contrib/mmdsr to report held and banned subscriptions and DMARC
      lookups in their own categories.

    - Fixed a bug that could create a garbled From: header with certain DMARC
      mitigation actions.  (LP: #1536816)

    - Treat a poster's address which matches an equivalent_domains address as
      a list member for the regular_exclude_ignore check.  (LP: #1526550)

    - Fixed an issue that sometimes left no white space following
      subject_prefix.  (LP: #1525954)

    - Vette log entries for banned subscriptions now include the source of
      the request if available.  (LP: #1525733)

    - Submitting the user options form for a user who was asynchronously
      unsubscribed would throw an uncaught NotAMemberError.  (LP: #1523273)

    - It was possible under some circumstances for a message to be shunted
      after a handler rejected or discarded it, and the handler would be
      skipped upon unshunting and the message accepted.  (LP: #1519062)

    - Posts gated to usenet will no longer have other than the target group
      in the Newsgroups: header.  (LP: #1512866)

    - Invalid regexps in *_these_nonmembers, subscribe_auto_approval and
      ban_list are now logged.  (LP: #1507241)

    - Refactored the GetPattern list method to simplify extending @listname
      syntax to new attributes in the future.  Changed Moderate.py to use the
      GetPattern method to process the *_these_nonmembers lists.

    - Changed CookHeaders to default to using space rather than tab as
      continuation_ws when folding headers.  (LP: #1505878)

    - Fixed the 'pidfile' path in the sample init.d script.  (LP: #1503422)

    - Subject prefixing could fail to collapse multiple 'Re:' in an incomming
      message if they all came after the list's subject_prefix.  This is now
      fixed.  (LP: #1496620)

    - Defended against a user submitting URLs with query fragments or POST
      data containing multiple occurrences of the same variable.
      (LP: #1496632)

    - Fixed bin/mailmanctl to check its effective rather than real uid.
      (LP: #1491187)

    - Fixed cron/gate_news to catch EOFError on opening the newsgroup.
      (LP: #1486263)

    - Fixed a bug where a delayed probe bounce can throw an AttributeError.
      (LP: #1482940)

    - If a list is not digestable an the user is not currently set to
      receive digests, the digest options will not be shown on the user's
      options page.  (LP: #1476298)

    - Improved identification of remote clients for logging and subscribe
      form checking in cases where access is via a proxy server.  Thanks to
      Jim Popovitch.  Also updated contrib/mmdsr for log change.

    - Fixed an issue with shunted messages on a list where the charset for
      the list's preferred_language had been changed from iso-8859-1 to
      utf-8 without recoding the list's description.  (LP: #1462755)

    - Mailman-Postfix integration will now add mailman@domain entries in
      data/virtual-mailman for each domain in POSTFIX_STYLE_VIRTUAL_DOMAINS
      which is a host_name of a list.  This is so the addresses which are
      exposed on admin and listinfo overview pages of virtual domains will
      be deliverable.  (LP: #1459236)

    - The vette log entry for DMARC policy hits now contains the list name.
      (LP: #1450826)

    - If SUBSCRIBE_FORM_SECRET is enabled and a user's network has a load
      balancer or similar in use the POSTing IP might not exactly match the
      GETting IP.  This is now accounted for by not requiring the last
      octet (16 bits for ipV6) to match.  (LP: #1447445)

    - DKIM-Signature:, DomainKey-Signature: and Authentication-Results:
      headers are now removed by default from posts to anonymous lists.
      (LP: #1444673)

    - The list admin web UI Mambership List search function often doesn't
      return correct results for search strings (regexps) that contain
      non-ascii characters.  This is partially fixed.  (LP: #1442298)

2.1.20 (31-Mar-2015)

  Security

    - A path traversal vulnerability has been discovered and fixed.  This
      vulnerability is only exploitable by a local user on a Mailman server
      where the suggested Exim transport, the Postfix postfix_to_mailman.py
      transport or some other programmatic MTA delivery not using aliases
      is employed.  CVE-2015-2775  (LP: #1437145)

  New Features

    - There is a new Address Change sub-section in the web admin Membership
      Management section to allow a list admin to change a list member's
      address in one step rather than adding the new address, copying settings
      and deleting the old address.  (LP: #266809)

  i18n

    - The Russian translation has been updated by Danil Smirnov.

    - The Polish translation has been updated by Stefan Plewako.

  Bug fixes and other patches

    - A LookupError in SpamDetect on a message with RFC 2047 encoded headers
      in an unknown character set is fixed.  (LP: #1427389)

    - Fixed a bug in CommandRunner that could process the second word of a
      body line as a command word and a case sensitivity in commands in
      Subject: with an Re: prefix.  (LP: #1426829)

    - Fixed a bug in CommandRunner that threw an uncaught KeyError if
      the input to the list-request address contained a command word
      terminated by a period.  (LP: #1426825)

2.2 Branch Backports (released in conjunction with 2.1.19)

  The following New Features and Bug Fixes have been in an "unofficial,
  never to be released" Mailman 2.2 branch for several years. Until now,
  they were never implemented on the official 2.1 branch because of their
  i18n impacts.  Given that there have been a number of i18n impacting
  changes due to DMARC mitigations in the last few releases, it has been
  decided to backport these as well.

  All of these changes have been running in production on several lists
  for years without problems other than untranslated strings, so they should
  be reasonably "bug free".

  New Features

    - There is a new list attribute 'subscribe_auto_approval' which is a list
      of email addresses and regular expressions matching email addresses
      whose subscriptions are exempt from admin approval.  (LP: #266609)

    - Confirmed member change of address is logged in the 'subscribe' log,
      and if admin_notify_mchanges is true, a notice is sent to the list
      owner using a new adminaddrchgack.txt template.

    - Added an 'automate' option to bin/newlist to send the notice to the
      admin without the prompt.

    - The processing of Topics regular expressions has changed. Previously the
      Topics regexp was compiled in verbose mode but not documented as such
      which caused some confusion.  Also, the documentation indicated that
      topic keywords could be entered one per line, but these entries were not
      handled properly.  Topics regexps are now compiled in non-verbose mode
      and multi-line entries are 'ored'.  Existing Topics regexps will be
      converted when the list is updated so they will continue to work.

    - Added real name display to the web roster.  (LP: #266754)


  Bug fixes and other patches

    - Changed the response to an invalid confirmation to be more generic.
      Not all confirmations are subscription requests.

    - Changed the default nonmember_rejection_notice to be more user friendly.
      (LP: #418728)

    - Added "If you are a list member" qualification to some messages from the
      options login page.  (LP: #266442)

    - Changed the 'Approve' wording in the admindbdetails.html template to
      'Accept/Approve' for better agreement with the button labels.

    - Added '(by thread)' to the previous and next message links in the
      archive to emphasize that even if you got to the message from a
      subject, date or author index, previous and next are still by thread.

2.1.19 (28-Feb-2015)

  New Features

    - The subscribe_auto_approval feature backported from the 2.2 branch and
      described above has been enhanced to accept entries of the form
      @listname to auto approve members of another list.  (LP: #1417093)

    - There is a new list attribute dmarc_wrapped_message_text and a
      DEFAULT_DMARC_WRAPPED_MESSAGE_TEXT setting to set the default for new
      lists.  This text is added to a message which is wrapped because of
      dmarc_moderation_action in a separate text/plain part that precedes the
      message/rfc822 part containing the original message.  It can be used to
      provide an explanation of why the message was wrapped or similar info.

    - There is a new list attribute equivalent_domains and a
      DEFAULT_EQUIVALENT_DOMAINS setting to set the default for new lists which
      in turn defaults to the empty string.  This provides a way to specify one
      or more groups of domains, e.g., mac.com, me.com, icloud.com, which are
      considered equivalent for validating list membership for posting and
      moderation purposes.

    - There is a new WEB_HEAD_ADD setting to specify text to be added to the
      <HEAD> section of Mailman's internally generated web pages.  This doesn't
      apply to pages built from templates, but in those cases, custom templates
      can be created.  (LP: #1409396)

    - There is a new DEFAULT_SUBSCRIBE_OR_INVITE setting.  Set this to Yes
      to make the default selection on the admin Mass Subscriptions page
      Invite rather than Subscribe.  (LP: #1404511)

    - There is a new list attribute in the Bounce processing section.
      bounce_notify_owner_on_bounce_increment if set to Yes will cause
      Mailman to notify the list owner on every bounce that increments a
      list member's score but doesn't result in a probe or disable.  There
      is a new configuration setting setting
      DEFAULT_BOUNCE_NOTIFY_OWNER_ON_BOUNCE_INCREMENT to set the default
      for new lists.  This in turn defaults to No.  (LP: #1382150)

  Changed behavior

    - Mailman's log files, request.pck files and heldmsg-* files are no
      longer created world readable to protect against access by untrusted
      local users.  Note that permissions on existing log files won't be
      changed so if you are concerned about this and don't rotate logs or
      have a logrotate process that creates new log files instead of letting
      Mailman create them, you will need to address that.  (LP: #1327404)

  Other changes

    - The Python Powered logo image has been replaced in the misc/ directory
      in the source distribution.  Depending on how you've installed these
      images, you may need to copy PythonPowered.png from the misc/ directory
      in the source or from the $prefix/icons/ installed directory to another
      location for your web server.  (LP: #1408575)

  i18n

    - The Polish translation has been updated by Stefan Plewako.

    - The Interlingua translation has been updated by Martijn Dekker.

    - The Japanese message catalog has been updated by SATOH Fumiyasu.

    - Mailman's character set for Romanian has been changed from iso-8859-2
      to utf-8 and the templates and messages recoded.  This change will
      require running 'bin/arch --wipe' on any existing Romanian language
      lists in order to recode the list's archives, and will require recoding
      any edited templates in lists/LISTNAME/ro/*, templates/DOMAIN/ro/* and
      templates/site/ro/*.  It may also require recoding any existing
      iso-8859-2 text in list attributes.  (LP: #1418735)

    - Mailman's character set for Russian has been changed from koi8-r to
      utf-8 and the templates and messages recoded.  This change will
      require running 'bin/arch --wipe' on any existing Russian language
      lists in order to recode the list's archives, and will require recoding
      any edited templates in lists/LISTNAME/ru/*, templates/DOMAIN/ru/* and
      templates/site/ru/*.  It may also require recoding any existing koi8-r
      text in list attributes.  (LP: #1418448)

    - Mailman's versions.py has been augmented to help with the above two
      character set changes.  The first time a list with preferred_language
      of Romanian or Russian is accessed or upon upgrade to this release,
      any list attributes which have string values such as description, info,
      welcome_msg, etc. that appear to be in the old character set will be
      converted to utf-8.  This is done recursively for the values (but not
      the keys) of dictionary attributes and the elements of list and tuple
      attributes.

    - The Russian message catalog and templates have been further updated by
      Danil Smirnov.

    - The Romanian message catalog has been updated.  (LP: #1415489)

    - The Russian templates have been updated by Danil Smirnov.  (LP: #1403462)

    - The Japanese translation has been updated by SATOH Fumiyasu.
      (LP: #1402989)

    - A minor change in the French translation of a listinfo subscribe form
      message has been made.  (LP: #1331194)

  Bug fixes and other patches

    - Because of privacy concerns with the 2.2 backport adding real name to
      list rosters, this is controlled by a new ROSTER_DISPLAY_REALNAME
      setting that defaults to No.  You may wish to set this to Yes in
      mm_cfg.py.

    - Organization: headers are now unconditionally removed from posts to
      anonymous lists.  Regexps in ANONYMOUS_LIST_KEEP_HEADERS weren't kept
      if the regexp included the trailing ':'.  This is fixed too.
      (LP: #1419132)

    - The admindb interface has been fixed so the the detail message body
      display doesn't lose part of a multi-byte character, and characters which
      are invalid in the message's charset are replaced rather than the whole
      body not being converted to the display charset.  (LP: #1415406)

    - Fixed a bug in bin/rmlist that would throw an exception or just fail to
      remove held message files for a list with regexp special characters in
      its name.  (LP: #1414864)

    - When applying DMARC mitigations, CookHeaders now adds the original From:
      to Cc: rather than Reply-To: in some cases to make MUA 'reply' and
      'reply all' more consistent with the non-DMARC cases.  (LP: #1407098)

    - The Subject: of the list welcome message wasn't always in the user's
      preferred language.  Fixed.  (LP: #1400988)

    - Accept email command in Subject: prefixed with Re: or similar with no
      intervening space.  (LP: #1400200)

    - Fixed a UnicodeDecodeError that could occur in the web admin interface
      if 'text' valued attributes have unicode values.  (LP: #1397170)

    - We now catch the NotAMemberError exception thrown if an authenticated
      unsubscribe is submitted from the user options page for a nonmember.
      (LP: #1390653)

    - Fixed an archiving bug that would cause messages with 'Subject: Re:'
      only to be indexed in the archives without a link to the message.
      (LP: #1388614)

    - The vette log entry for a message discarded by a handler now includes
      the list name and the name of the handler.  (LP: #558096)

    - The options CGI now rejects all but HTTP GET and POST requests.
      (LP: #1372199)

    - A list's poster password will now be accepted on an Urgent: header.
      (LP: #1371678)

    - Fixed a bug which caused a setting of 2 for REMOVE_DKIM_HEADERS to be
      ignored.  (LP: #1363278)

    - Renamed messages/sr/readme.sr to README.sr.  (LP: #1360616)

    - Moved the dmarc_moderation_action checks from the Moderate handler to
      the SpamDetect handler so that the Reject and Discard actions will be
      done before the message might be held by header_filter_rules, and the
      Wrap Message and Munge From actions will be done on messages held by
      header_filter_rules if the message is approved.  (LP: #1334450)

    - <label> tags have been added around most check boxes and radio buttons
      and their text labels in the admin and admindb web GUI so they can be
      (de)selected by clicking the text.  (LP: #266391)

    - If checking DNS for dmarc_moderation_action and DNS lookup is not
      available, log it.  (LP: #1324541)

    - Handle missing From: header addresses for DMARC mitigation actions.
      (LP: #1318025)

2.1.18-1 (06-May-2014)

  Bug fixes and other patches

    - A critical incompatibility between the DMARC Wrap Message action and
      Python versions older than 2.6.x for some x <= 5 existed and caused
      Wrapped message to be shunted.  This is fixed.  (LP: #1316682)

    - Sender: headers are no longer removed in from_is_list Munge From
      actions.  (LP: #1315970)

2.1.18 (03-May-2014)

  Acknowledgements

    - Thanks to Jim Popovitch and Phil Pennock for the branch that formed the
      basis of the dmarc_moderation_action feature.

    - Thanks to Franck Martin et al for the branch that formed the basis of
      the from_is_list feature.

  Dependencies

    - There is a new dependency associated with the new Privacy options ->
      Sender filters -> dmarc_moderation_action feature discussed below.
      This requires that the dnspython <http://www.dnspython.org/> package
      be available in Python.  This package can be downloaded from the above
      site or from the CheeseShop <https://pypi.python.org/pypi/dnspython/>
      or installed with pip.

  New Features

    - The from_is_list feature introduced in 2.1.16 is now unconditionally
      available to list owners.  There is also, a new Privacy options ->
      Sender filters -> dmarc_moderation_action feature which applies to list
      messages where the From: address is in a domain which publishes a DMARC
      policy of reject or possibly quarantine.  This is a list setting with
      values of Accept, Wrap Message, Munge From, Reject or Discard. There is
      a new DEFAULT_DMARC_MODERATION_ACTION configuration setting to set the
      default for this, and the list admin UI is not able to set an action
      which is 'less' than the default.  The prior ALLOW_FROM_IS_LIST setting
      has been removed and is effectively always Yes. There is a new
      dmarc_quarantine_moderation_action list setting with default set by a
      new DEFAULT_DMARC_QUARANTINE_MODERATION_ACTION configuration setting
      which in turn defaults to Yes.  The list setting can be set to No to
      exclude domains with DMARC policy of quarantine from
      dmarc_moderation_action.

      dmarc_moderation_action and from_is_list interact in the following way.
      If the message is From: a domain to which dmarc_moderation_action applies
      and if dmarc_moderation_action is other than Accept,
      dmarc_moderation_action applies to that message.  Otherwise the
      from_is_list action applies.

      Also associated with dmarc_moderation_action are configuration settings
      DMARC_RESOLVER_TIMEOUT and DMARC_RESOLVER_LIFETIME. These are described
      in more detail in Defaults.py.  There are also new vette log entries
      written when dmarc_moderation_action is found to apply to a post.

  i18n

    - Added missing <mm-digest-question-start> tag to French listinfo template.
      (LP: #1275964)

  Bug Fixes and other patches

    - Removed HTML tags from the title of a couple of rmlist.py pages because
      browsers don't render tags in the title.  (LP: #265848)

    - Most Mailman generated notices to list owners and moderators are now
      sent as Precedence: list instead of bulk.  (LP: #1313146)

    - The Reply-To: munging options weren't honored if there was no
      from_is_list action.  (LP: #1313010)

    - Changed from_is_list actions to insert the list address in Cc: if the
      list is fully personalized.  Otherwise, the list address is only in
      From: and Reply-To: overrides it.  (LP: #1312970)

    - Fixed the Munge From action to only Munge the From: and/or Reply-To: in
      the outgoing message and not in archives, digests and messages sent via
      the usenet gateway.  (LP: #1311431)

    - Fixed a long standing issue in which a notice sent to a user whose
      language is other than that of the list can cause subsequent things
      which should be in the list's language to be in the user's language
      instead.  (LP: #1308655)

    - Fixed the admin Membership List so a search string if any is not lost
      when visiting subsequent fragments of a chunked list.  (LP: #1307454)

    - For from_is_list feature, use email address from original From: if
      original From: has no display name and strip domain part from resultant
      names that look like email addresses.  (LP: #1304511)

    - Added the list name to the vette log "held message approved" entry.
      (LP: #1295875)

    - Added the CGI module name to various "No such list" error log entries.
      (LP: #1295875)

    - Modified contrib/mmdsr to report module name if present in "No such list
      error log entries.

    - Fixed a NameError exception in cron/nightly_gzip when it tries to print
      the usage message.  (LP: #1291038)

    - Fixed a bug in ListAdmin._handlepost that would crash when trying to
      preserve a held message for the site admin if HOLD_MESSAGES_AS_PICKLES
      is False.  (LP: #1282365)

    - The from_is_list header munging feature introduced in Mailman 2.1.16 is
      no longer erroneously applied to Mailman generated notices.
      (LP: #1279667)

    - Changed the message from the confirm CGI to not indicate approval is
      required for an acceptance of an invitation.  (LP: #1277744)

    - Fixed POSTFIX_STYLE_VIRTUAL_DOMAINS to be case-insensitiive.
      (LP: #1267003)

    - Added recognition for another simple warning to bounce processing.
      (LP: #1263247)

    - Fixed a few failing tests in tests/test_handlers.py.  (LP: #1262950)

    - Fixed bin/arch to not create scrubbed attachments for messages skipped
      when processing the --start= option.  (LP: #1260883)

    - Fixed email address validation to do a bit better in obscure cases.
      (LP: #1258703)

    - Fixed a bug which caused some authentication cookies to expire too soon
      if AUTHENTICATION_COOKIE_LIFETIME is non-zero.  (LP: #1257112)

    - Fixed a possible TypeError in bin/sync_members introduced in 2.1.17.
      (LP: #1243343)

  Miscellaneous

    - Added to the contrib directory, a script from Alain Williams to count
      posts in a list's archive.

2.1.17 (23-Nov-2013)

  New Features

    - Handling of posts gated from usenet to a list via the Mail <-> News
      gateway is changed.  Formerly, no list membership, moderation or
      *_these_nonmembers checks were done.  Now, if the sender of the usenet
      post is a moderated member or a nonmember matching a *_these_nonmembers
      filter, those checks will be done and actions applied.  Nonmember posts
      from senders not matching a *_these_nonmembers filter are still accepted
      as before.  (LP: #1252575)

    - There is a new mm_cfg.py setting ANONYMOUS_LIST_KEEP_HEADERS.  Since it
      is not possible to know which non-standard headers in a message might
      reveal sender information, we now remove all headers from incoming posts
      to anonymous lists except those which match regular expressions in this
      list. The default setting keeps non X- headers except those known to
      reveal sender information, Mailman added X- headers and x-Spam- headers.
      See the description in Defaults.py for more information.  (LP: #1246039)

  i18n

    - The Japanese message catalog has been updated by SATOH Fumiyasu.
      (LP: #1248855)

  Bug Fixes and other patches

    - Added a reopen command to the sample init.d script in misc/mailman.in.
      (LP: #1251917)

    - Fixed a misspelling in Tagger.py causing an "unexpected keyword argument
      'Delete'" exception.  (LP: #1251495)

    - Fixed contrib/qmail-to-mailman.py to work with a user other than
      'mailman' and to recognize more listname-* addresses.  (LP: #412293)

    - Fixed a possible UnicodeDecodeError in bin/sync_members.  (LP: #1243343)

    - Fixed Makefile to not include $DESTDIR in paths compiled into .pyc
      files for traceback purposes.  (LP: #1241770)

2.1.16 (16-Oct-2013)

  New Features

    - There is a new list attribute from_is_list to either rewrite the From:
      header of posts replacing the posters address with that of the list or
      wrap the message in an outer message From: the list for compatability
      with DMARC and or ADSP.  There is a new mm_cfg.py setting
      DEFAULT_FROM_IS_LIST to control the default for new lists, and the
      existing REMOVE_DKIM_HEADERS setting has been extended to allow removing
      those headers only for certain from_is_list lists.  This feature must
      be enabled by setting ALLOW_FROM_IS_LIST to Yes in mm_cfg.py.  See the
      description of these settings in Defaults.py for more detail.  This
      feature is experimental in 2.1.16, and it is subject to change or to
      become just one of the two methods in a subsequent release. People
      interested in this feature are encouraged to try it and report their
      experiences to the mailman-users@python.org list.

    - There is a new DISPLAY_HELD_SUMMARY_SORT_BUTTONS setting which if set
      in mm_cfg.py will display a set of radio buttons in the admindb held
      message summary to select how the held messages are sorted and grouped
      for display. The exact setting determines the default grouping and
      sorting.  See the description in Defaults.py for details.

    - Setting digest_size_threshhold to zero now means no digests will be
      sent based on size instead of a digest being sent with every post.
      (LP: #558274)

    - There is a new mm_cfg.py setting SUBSCRIBE_FORM_SECRET which will put
      a dynamically generated, hidden hash in the listinfo subscribe form and
      check it upon submission.  Setting this will prevent automated processes
      (bots) from successfully POSTing web subscribes without first retrieving
      and parsing the form from the listinfo page.  The form must also be
      submitted no later than FORM_LIFETIME nor no earlier than
      SUBSCRIBE_FORM_MIN_TIME after retrieval.  Note that enabling this will
      break any static subscribe forms on your site.  See the description in
      Defaults.py for more info.  (LP: #1082746)

    - add_members now has an option to add members with mail delivery disabled
      by admin.  (LP: #1070574)

    - IncomingRunner now logs rejected messages to the vette log.
      (LP: #1068837)

    - The name of the mailmanctl master lock file is now congigurable via the
      mm_cfg.py setting MASTER_LOCK_FILE.  (LP: #1082308)

    - list_lists now has an option to list only lists with public archives.
      (LP: #1082711)

  Contributed programs

    - A new import_majordomo_into_mailman.pl script has been contributed by
      Geoff Mayes.  (LP: #1129742)

    - A new "sitemap" bash script has been contributed by Tomasz Chmielewski
      <mangoo@wpkg.org> to generate a sitemap.xml file of an installation's
      public archives for submission to search engines.

  i18n

    - The Danish translation has been updated thanks to Tom Christensen.

    - Fixed a string in the Czech message catalog.  (LP: #1234567)

    - A Farsi (Persian) translation has been added thanks to Javad Hoseini and
      Mahyar Moghimi.

    - Fixed several misspelled or garbled string replacements in the Spanish
      message catalog.  (LP: #1160138)

    - pt_BR message catalog has two new and an updated message per Hugo Koji
      Kobayashi.  (LP: #1138578)

    - German message catalog has been updated per Ralf Hildebrandt.

    - Corrected typo in templates/it/private.html.

  Bug Fixes and other patches

    - Fixed a crash in SpamDetect.py which caused messages with unparseable
      RFC 2047 encoded headers to be shunted.  (LP: #1235101)

    - Fixed cron/disabled to send a fresh cookie when notifying disabled
      members.  (LP: #1203200)

    - Added "message_id" to the interpolation dictionary for the Article.html
      template.  (LP: #725498)

    - Changed the admin GUI to report only the bad entries in a list of email
      addresses if any are bad.  (LP: #558253)

    - Added logging for template errors in HyperArch.py.  (LP: #558254)

    - Added more explanation to the bad owner address message from
      bin/newlist.  (LP: #1200763)

    - Fixed a bug causing the admin web interface to fail CSRF checking if
      the list name contains a '+' character.  (LP: #1190802)

    - Fixed bin/mailmanctl -s to not remove the master lock if it can't be
      determined to be truly stale.  (LP: #1189558)

    - It is no longer possible to add 'invalid' addresses to the ban_list
      and the *_these_nonmembers filters from the check boxes on the admindb
      interface.  (LP: #1187201)

    - Backported recognition for mail.ru DSNs and minor bug fixes from
      lp:flufl.bounce.  (LP: #1074592, LP: #1079249 and #1079254)

    - Defended against buggy web servers that don't include an empty
      QUERY_STRING in the CGI environment.  (LP: #1160647)

    - The Switchboard.finish() method now logs the text of the exception when
      it fails to unlink/preserve a .bak file.  (LP: #1165589)

    - The pending (un)subscriptions waiting approval are now sorted by email
      address in the admindb interface as intended.  (LP: #1164160)

    - The subscribe log entry for a bin/add_members subscribe now identifies
      bin/add_members as the source.  (LP: #1161642)

    - Fixed a bug where the Subject: of the user notification of a
      bin/remove_members unsubscribe was not in the user's language.
      (LP: #1161445)

    - Fixed a bug where BounceRunner could create and leave behind zero length
      bounce-events files.  (LP: #1161610)

    - Added recognition for another Yahoo bounce format.  (LP: #1157961)

    - Changed configure's method for getting Python's include directory from
      distutils.sysconfig.get_config_var('CONFINCLUDEPY') to
      distutils.sysconfig.get_python_inc().  (LP: #1098162)

    - Added an Auto-Generated: header to password reminders.  (LP: #558240)

    - Fixed a bug where non-ascii characters in the real name in a subscription
      request could throw a UnicodeEncodeError upon subscription approval and
      perhaps in other situations too.  (LP: #1047100)

    - The query fragments send_unsub_notifications_to_list_owner and
      send_unsub_ack_to_this_batch will now assume default values if not set
      in mass unsubscribe URLs.  (LP: #1032378)

    - Replaced utf-8 encoded characters in newly added German templates with
      HTML entities. (LP: #1018208)

2.1.15 (13-Jun-2012)

  Security

    - Strengthened the validation of email addresses.

    - An XSS vulnerability, CVE-2011-0707, has been fixed.

    - The web admin interface has been hardened against CSRF attacks by adding
      a hidden, encrypted token with a time stamp to form submissions and not
      accepting authentication by cookie if the token is missing, invalid or
      older than the new mm_cfg.py setting FORM_LIFETIME which defaults to one
      hour.  Posthumous thanks go to Tokio Kikuchi for this implementation
      which is only one of his many contributions to Mailman prior to his
      death from cancer on 14 January 2012.

  New Features

    - Added a password reminder button to the private archive login page.
      Backported from the 2.2 branch.

    - There is a new list attribute regular_exclude_ignore set from mm_cfg.py
      DEFAULT_REGULAR_EXCLUDE_IGNORE.  This defaults to True even though the
      prior behavior is equivalent to False.  A True setting will ignore an
      exclude list if the poster is not a member of that list.  The False
      setting can result in list members not receiving posts if the nonmember
      post is not accepted by the exclude list.  Backported from 2.2 branch.

    - Eliminated the list cache from the qrunners.  Indirect self-references
      caused lists to never be dropped from the cache which in turn caused
      the qrunners to grow very large in installations with many lists or
      multiple large lists.  Bug #862683.

    - The user options 'list my other subscriptions' page now indicates for
      each list if the subscription is 'nomail' or 'digest'.  Bug #793669.

    - A new list poster password has been implemented.  This password may only
      be used in Approved: or X-Approved: headers for pre-approving posts.
      Using this password for that purpose precludes compromise of a more
      valuable password sent in plain text email.  Bug #770581.

    - A new mm_cfg.py setting AUTHENTICATION_COOKIE_LIFETIME has been added.
      If this is set to a non-zero value, web authentication cookies will
      expire that many seconds following their last use.  Its default value is
      zero to preserve current behavior.

    - A new mm_cfg.py setting RESPONSE_INCLUDE_LEVEL has been added to control
      how much of the original message is included in automatic responses to
      email commands.  The default is 2 to preserve the prior behavior of
      including the full message.  Setting this to 1 in mm_cfg.py will include
      only the original headers, and 0 will include none of the original.  It
      is recommended to set this to 0 in mm_cfg.py to minimize the effects of
      backscatter.  Bug #265835.

    - A new mm_cfg.py setting DEFAULT_RESPOND_TO_POST_REQUESTS has been added
      to control the default for respond_to_post_requests for new lists.  It is
      set to Yes for backwards compatibility, but it is recommended that
      serious consideration be given to setting it to No.  Bug #266051.

    - A new mm_cfg.py setting DISCARD_MESSAGE_WITH_NO_COMMAND has been added to
      control whether a message to the -request address without any commands or
      a message to -confirm whose To: address doesn't match VERP_CONFIRM_REGEXP
      is responded to or just logged.  It defaults to Yes which is different
      from prior behavior.  Bug #410236.

    - Two new mm_cfg.py settings, BROKEN_BROWSER_WORKAROUND and
      BROKEN_BROWSER_REPLACEMENTS, have been added to control escaping of
      additional characters beyond the standard <, >, &, and " in the web UI.
      See the documentation of these settings in Defaults.py.  The default
      values for these settings result in no change from the prior release.
      Bug #774588.

  i18n

    - Added some missing German templates from Egon Frerich.

    - Added Greek translation from Antonis Limperis.

    - A few errors in the Basque translation are fixed.  Bug #836861.

    - Fixed a misspelling in the German invite.txt template.  Bug #815444.

    - Fixed a missing format character in the Spanish translation.
      Bug #670988.

    - Thanks go to the following for updating translations for the changes in
      this release.
        Thijs Kinkhorst
        Stefan Förster
        Fabian Wenk

  Bug Fixes and other patches

    - Fixed a bug that could send an admin notice of a held subscription with
      the subject in the user's preferred language instead of the list's
      preferred language and possibly not properly RFC 2047 encoded.
      (LP: #998949)

    - Fixed a possible CPU bound loop in OutgoingRunner if the attempt to
      Connect to the SMTP server throws a socket.error.  (LP: #966531)

    - Fixed a potential crash in the web UI if a language is removed from the
      LC_DESCRIPTIONS dictionary.  (LP: #966565)

    - Added an Auto-Submitted: header to invitations and (un)subscription
      confirmation requests to reduce the possibility of an autoresponder
      confirming the request.  (LP: #265831)

    - Added javascript to the private.html and admlogin.html templates to
      focus the cursor on the entry field.  (LP: #266054)

    - Added CPPFLAGS and LDFLAGS to src/Makefile to support their use.
      (LP: #637652)

    - Stopped removing the trailing slash from the List-Archive: header URL.
      (LP: #964190)

    - A configured version of contrib/courier-to-mailman.py is now created in
      build/contrib/courier-to-mailman.py.  (LP: #999250)

    - Subscription disabled warnings are now sent without a Precedence:
      header.  Bug #808821.

    - Backported 2.2 branch fix for a problem in SpamDetect.py that could
      cause header_filter_rules to fail to match RFC 2047 encoded headers.

    - Fix for bug #629738 could cause a crash in the admindb details display
      if the decoded message body contained characters not in the character
      set of the list's preferred language.  Fixed.  Bug #910440.

    - Added recognition for another Qmail bounce format.

    - Fixed an erroneous seek in the Mailman.Mailbox.Mailbox.AppendMessage
      method that could cause a corrupt mailbox for files opened 'w+'.
      Bug #901957.

    - A held message with a null sender caused a crash in the admindb
      interface.  This is fixed by changing the sender to <missing>.
      Bug #897103.

    - Changed subject prefixing to allow for possible whitespace between an
      'Re' and the following colon when determining how to add the prefix.
      Bug #893290.

    - Fixed a problem where topics regexps would not match RFC 2047 encoded
      Keywords: and/or Subject: headers.  Bug #891676.

    - Fixed misleading response to an email approval of a held message.
      Bug #889968.

    - Added masthead.txt to the list of templates that can be edited via the
      web admin interface.  Bug #266805.

    - Changed the way digest_footer is added to the RFC 1153 (plain) format
      digest for RFC compliance.  Bug #887610.

    - Fixed cron/checkdbs to report unsubscriptions waiting approval.
      Bug #873821.

    - The fix for BUG #266220 (sf1181161) has been enhanced so that if there
      is a pathological HTML part such that the Approved: password text isn't
      found, but it is found after stripping out HTML tags, the post is
      rejected with an informative message.

    - A bug that would cause reset of any new_member_options bits other than
      the four displayed as checkboxes on the list admin General Options page
      whenever the page was updated or bin/config_list attempted to update
      new_member_options has been fixed.  Bug #865825.

    - A problem with the logic avoiding unnecessarily reloading a current list
      object from the config.pck arises if the list is updated by another
      process within the same second that it was last read/written.  That can
      cause the reading of latest version of the list to be skipped.  This has
      been fixed.  Bug #862675.

    - Fixed bin/export.py to accept case insensitive password schemes.
      Bug #833134.

    - Added Tokio Kikuchi's icons to the misc/ and installed icons/
      directories.  Bug #782474.

    - Fixed a problem which could result in raw, undecoded message bodies
      appearing in plain digests and archives.  Bug #787790.

    - Fixed a problem in admindb.py where the character set for the display of
      the message body excerpt was not correctly determined.  Bug #779751.

    - Prevented setting user passwords with leading/trailing whitespace.
      Bug #778088.

    - Mailman now sets the 'secure' flag in cookies set via https URLs.
      Bug #770377.

    - Added a logout link to the admindb interface and made both admin and
      admindb logout effective for a site admin cookie if allowed.
      Bug #769318.

    - Replaced the old Mailman logos and icon that install to Mailman's icons
      directory with the new ones.  If you copy these elsewhere on your
      server, please copy these new ones.

    - Changed bin/genaliases to only call the POSTFIX_*_CMD commands once when
      MTA = 'Postfix'.  Bug #266408.

    - Added a report of the affected members to the warnings issued when
      setting a list with digest members digestable=No and when setting a list
      with non-digest members nondigestable=no.  Bug #761232.

    - Fixed a problem where content filtering could remove the headers from
      an attached message/rfc822 part if the message in that part is
      multipart/alternative and collapse_alternatives is Yes.  Bug #757062.

    - Changed the subscribe CGI to strip leading and trailing whitespace from
      the supplied email address.  Bug #745432.

    - Changed the maximum number of arguments for the who command to be
      considered administrivia from 2 to 1 to help avoid false positives.
      Bug #739524.

    - Added the list name as 'display-name' in added Sender: headers to help
      mitigate Outlook et al 'on behalf of' displays.  Bug #736849.

    - Fixed a typo in the usage() definition cron/gate_news.  Bug #721015.

    - Fixed an uncaught KeyError when poster tries to cancel a post which was
      already handled.  Bug #266224.

    - Held message user notifications now come From: list-owner instead of
      list-bounces.  Bug #714424.

    - Issue an HTTP 404 status for private archive file not found.

    - @listname entries in *_these_nonmembers are no longer case sensitive.
      Bug #705715.

    - Changed bin/rmlist to also remove heldmsg files for the removed list and
      fixed a problem with removal of stale locks for the list.  Bug #700528.

    - Fixed a bug where content filtering could leave a multipart message or
      part with just one sub-part. These should be recast to just the sub-part.
      Bug #701558.

    - Fixed a bug that could erroneously handle posts from addresses in
      *_these_nonmembers and send held/rejected notices to bogus addresses when
      The From or other sender header is RFC 2047 encoded.  Bug #702516.

    - Updated contrib/mm-handler-2.1.10 to better handle lists with names that
      look like admin addresses.  Bug #697161.

    - Added bounce recognition for a bogus Dovecot MDN.  Bug #693134.

    - Fixed a problem where an emailed command in the Subject: header with a
      non-ascii l10n of an 'Re:' prefix is ignored.  Bug #685261.

    - Fixed a problem with approving a post by email when the body of the
      approval mail is base64 encoded.  Bug #677115.

    - Fixed the host name in the From: address of the owner notification from
      bin/add_members.  Bug #666181.

2.1.14 (20-Sep-2010)

  Security

    - Two potential XSS vulnerabilities have been identified and fixed.

  New Features

    - A new feature for controlling the addition/replacement of the Sender:
      header in outgoing mail has been implemented.  This allows a list owner
      to set include_sender_header on the list's General Options page in the
      admin GUI.  The default for this setting is Yes which preserves the prior
      behavior of removing any pre-existing Sender: and setting it to the
      list's -bounces address.  Setting this to No stops Mailman from adding or
      modifying the Sender: at all.

      Additionally, there is a new Defaults.py/mm_cfg.py setting
      ALLOW_SENDER_OVERRIDES which defaults to Yes but which can be set to No
      to remove the include_sender_header setting from General Options, and
      thus preserve the prior behavior completely.

    - Bounce processing has been enhanced so that if a bounce is returned to a
      list from a non-member who is a member of a regular_include_list, the
      bounce will be processed as a bounce for the included list.

  i18n

    - Fixed a missing format character in the German bin/mailmanctl docstring.

    - Updated Dutch translation from Jan Veuger.

    - Updated Japanese Translation from Tokio Kikuchi.

    - Updated Finnish translation from Joni Töyrylä.

    - Made a few corrections to some Polish templates.  Bug #566731.

    - Made a minor change to the Chinese (China) message catalog.  Bug #545772.

    - Changed a few DOCTYPE directives in templates for compliance.
      Bug #500952 and Bug #500955.

  Bug Fixes and other patches

    - Made minor wording improvements and typo corrections in some messages.
      Bug #426979.

    - Fixed i18n._() to catch exceptions due to bad formats.  Bug #632660.

    - Fixed admindb interface to decode base64 and quoted-printable encoded
      message body excerpts for display.  Bug #629738.

    - Fixed web CGI tracebacks to properly report sys.path.  Bug #615114.

    - Changed the member options login page unsubscribe request to include the
      requesters IP address in the confirmation request.  Bug #610527.

    - Changed fix_url to lock the list if not locked.  Bug #610364.

    - Made a minor change to the English subscribeack.txt (welcome message)
      template to emphasize that a password is only required to unsubscribe
      *without confirmation*.

    - Fixed an issue in admindb that could result in a KeyError and "we hit a
      bug" response when a moderator acts on a post that had been handled by
      someone else after the first moderator had retrieved it.  Bug #598671.

    - Fixed a bug which would fail to show a list on the admin and listinfo
      overview pages if its web_page_url contained a :port.  Bug # 597741.

    - Fixed bin/genaliases to not throw TypeError when MTA = None.
      Bug #587657.

    - Provided the ability to specify in mm_cfg.py a local domain (e.g.
      'localhost') for the local addresses in the generated virtual-mailman
      when MTA = 'Postfix'.  See VIRTUAL_MAILMAN_LOCAL_DOMAIN in Defaults.py.
      Bug #328907.

    - Made a minor change to the removal of an Approved: pseudo-header from
      a text/html alternative to allow for an inserted '\xA0' before the
      password.

    - Fixed Content Filtering collapse_alternatives to work on deeply nested
      multipart/alternative parts.  Bug #576675.

    - We now accept/remove X-Approved: and X-Approve: headers in addition to
      Approved: and Approve: for pre-approving posts.  Bug #557750.

    - Reordered the 'cancel' and 'subscribe' buttons on the subscription
      confirmation web page so the default action upon 'enter' will be the
      subscribe button in browsers that pick the first button.  Bug #530654.

    - Fixed a bug in the admindb interface that could apply a moderator
      action to a message not displayed.  Bug #533468.

    - Added a traceback to the log message produced when processing the
      digest.mbox throws an exception.

    - Added a urlhost argument to the MailList.MailList.Create() method to
      allow bin/newlist and the the create CGI to pass urlhost so the host
      will be correct in the listinfo link on the emptyarchive page.
      Bug #529100.

    - Added the List-Post header to the default list of headers retained in
      messages in the MIME digest.  Bug #526143.

    - When daemonizing mailmanctl, we now ensure terminal files are closed.

    - Fixed a bug in pipermail archiving that caused fallback threading by
      subject to fail.  Bug #266572.

    - We now give an HTTP 401 status for authentication failures from admin,
      admindb, private, options and roster CGIs, and an HTTP 404 status from
      all the CGIs for an invalid list name.

    - Backported the listinfo template change from the 2.2 branch to fix
      Bug #514050.

    - Fixed a bug where going to an archives/private/list.mbox/list.mbox URL
      would result in a munged URL if authentication was required. Bug #266164.

    - Fixed a bug where check_perms would throw an OSError if an entry in
      Mailman's lists/ directory was not a directory.  Bug #265613.

    - Fixed a bug where a message with an Approved: header held by a handler
      that precedes Approve (SpamDetect by default) would not have the
      Approved: header removed if the held message was approved.  Bug #501739.

2.1.13 (22-Dec-2009)

  i18n

    - Updated Dutch message catalog from Jan Veuger.

    - Added Asturian translation from Marcos Costales and the Asturian
      Language Team.

  Bug Fixes and other patches

    - Added "white-space: pre-wrap" style for <pre> tag in archives.
      Bug #266467.

    - Added vette logging for rejected and discarded (un)subscribe requests.

    - Fixed a bug in admindb.py that could erroneously discard an unsubscribe
      request as a duplicate.

    - Decoded RFC 2047 encoded message subjects for a few reports.
      Bug #266428.

    - Fixed the French, Spanish and Hebrew translations which improperly
      translated the 'coding:' line in bin/config_list output.

    - Fixed the auto-responder to treat messages to -confirm, -join, -leave,
      -subscribe and -unsubscribe as requests rather than posts.  Bug #427962.

    - Configure/make no longer builds Japanese and Korean codecs in
      pythonlib if Python already has them.

    - Inadvertently setting a null site or list password allowed access
      to a list's web admin interface without authentication.  Fixed by
      not accepting null passwords.

    - Changed VERP_CONFIRM_REGEXP  in Defaults.py to work if the replying
      MUA folds the To: header and in cases where the list name includes '+'.

    - Fixed some paths in contrib/check_perms_grsecurity.py. Bug #411192.

    - Replies to commands sent to list-request now come From: list-owner
      instead of list-bounces.

    - Mailman no longer folds long sub-part headers in multipart messages.
      In addition, Mailman no longer escapes From_ lines in the body of
      messages sent to regular list members, although MTA's may do it anyway.
      This is to avoid breaking signatures per Bug #265967.

    - XSS protection in the web interface went too far in escaping HTML
      entities.  Fixed.

    - Removed or anonymized additional headers in posts to anonymous lists.

    - Fixed a bug that could cause incorrect threading of replies to archived
      messages that arrive with timestamps in the same second.

    - Scrubbed HTML attachments containing tab characters would get the tabs
      replaced by a string of '&nbsp' without a semicolon.  Fixed.

    - Caught a TypeError in content filtering, collapse alternatives that
      occurred with a malformed message if a multipart/alternative part
      wasn't multi-part.  Reported in comments to bug #266230.

    - Fixed a few things in bin/update:
      - Changed some old messages for more current meaning.
      - Fixed qfiles update to not lose metadata from 2.1.5+ format entries.
      - Fixed 2.0.x template migration to not die if the templates/ tree
        contains subdirectories from a version control system.

    - Fixed a bug that would show a list on the admin and listinfo overview
      pages if its web_page_url host contained the current host as a
      substring.  Bug #342162.

    - Fixed a bug in Utils.canonstr() that would throw a UnicodeDecodeError
      if the string contained an HTML entity > 255 and also characters in the
      128-255 range.  Bug #341594.

    - Added recognition for more bounces.

    - Updated contrib/mmdsr to report preserved messages and to use mktemp to
      create temp files.

2.1.12 (23-Feb-2009)

  Bug fixes and other patches

    - Fix compatibility with Python 2.6.

    - Fixed a bug in admin.py which would result in chunked pages of the
      membership list for members whose address begins with a non-alphanumeric
      character to not be visible or retrievable.

    - Changed ListAdmin.py to make rejected post messages From: the -owner
      address instead of the -bounces address.

    - With MTA = 'Postfix', if the STANZA END for a list being removed is
      missing or munged, the remainder of the aliases and/or virtual-mailman
      file is lost.  Fixed.

    - Since Mailman 2.1.1, 2.0.x outstanding subscription and held message
      requests have not been migrated properly.  This is fixed.
      Bug #266106 (sf998384).

    - Changed cron/gate_news to continue processing the remaining lists on
      certain errors that can be caused by configuration of a particular list.
      Bug #265941 (sf775100).

    - Fixed a bug in AvoidDuplicates.py that caused it to fail if the address
      in the To: or Cc: header differed in case from the case-preserved member
      address.  Bug #297795.

    - Fixed a problem in SecurityManager that caused it to not find the
      cookie when CheckCookie was not given a user and the user in the cookie
      had a %xx encoded character.  Bug # 299220.

    - Fixed a minor fromusenet reporting issue in the contributed mmdsr
      script.

    - Fixed a minor issue in cron/gate_news that could cause a list's
      watermark to not be completely updated.

    - Fixed an issue that prevented editing the options.html template from
      the web admin interface. SF Bug #2164798.

    - Fixed a problem in Decorate which could throw a TypeError on conversion
      to unicode of a header/footer that was already unicode because of
      interpolating a unicode value.

    - Fixed an issue where list creation would report bad owner email
      instead of bad listname when the list name had non-ascii characters.
      SF Bug #2126489.

    - Fixed an issue where in some circumstances HyperArch.py would translate
      ' at ' into the wrong language ultimately throwing a UnicodeDecodeError
      when the translation was decoded with a different character set.
      Bug #308152.

    - Corrected a typo in Mailman/Gui/Privacy.py. Bug #309757.

    - Changed the pattern used to recognize URLs in messages for the pipermail
      archive in order to try to do a better job of making hyperlinks.
      Bug #310124.

    - Added missing --bare option to French translation of list_lists help.
      Bug #312119.

    - Fixed a long standing error that stopped relative hrefs from being
      generated for links on Mailman's web pages.

    - Changed the admindb interface so that when messages are rejected from
      the summary page, the reject reason is the rejection message from the
      Errors.HoldMessage subclass instead of the generic "No reason given".

    - Fixed the admin Membership List Find member function so the 'letter'
      links to a chunked result would still be limited to the Find member
      search. SF patch #1532081.

    - Changed scripts/driver to return a 405 status for non GET, POST, HEAD
      methods. SF patch #1578756.

    - Fixed a bug in admindb.py in the implementation of replacing "No Reason
      Given" with the default rejection reason.  Bug #325016.

    - Changed Gui/Topics.py to validate regexps in VERBOSE mode.  Bug #327008.

    - Worked around a potential problem in HyperArch.py with unicode character
      set arguments.  Bug #328353.

    - Recognize a couple more bounces.

    - Fixed a bug introduced in 2.1.11 which would attempt to store bounce info
      for a member just deleted if bounce_you_are_disabled_warnings is zero.

  i18n

    - Updated Dutch, Catalan and Polish translations.

  Miscellaneous

    - Added Lindsay Haisley's courier_to_mailman.py to the contrib directory.

    - Added John Dennis' (RedHat) FHS patch to the contrib directory.

2.1.11 (30-Jun-2008)

  New Features

    - Added a new cron/cull_bad_shunt script to cull and optionally
      archive old entries from the bad and shunt queues. This is controlled
      by new Defaults.py/mm_cfg.py settings BAD_SHUNT_STALE_AFTER (default
      7 days) and BAD_SHUNT_ARCHIVE_DIRECTORY (default None) which determine
      how long to keep bad and shunt queue entries and optionally, where to
      archive removed entries.

    - Prepended list name to bounce log unrecognized bounce messages.

    - Added a new Defaults.py|mm_cfg.py setting ACCEPTABLE_LISTNAME_CHARACTERS
      with default value '[-+_.=a-z0-9]'.  This Python regular expression
      character class specifies the characters allowed in list names.  The
      motivation for this is the fact that previously, a list named, e.g.,
      xxx&yyy could be created and MTA aliases generated that would cause
      The MTA to execute yyy as a command.  There is a possible security issue
      here, but it is not believed to be exploitable in any meaningful way.

  Bug fixes and other patches

    - Changed the preservation of unparseable messages to be conditional on
      the Defaults.py/mm_cfg.py setting of QRUNNER_SAVE_BAD_MESSAGES and
      changed the queue directory in which messages are preserved from 'shunt'
      to 'bad'.

    - Fixed a bug introduced in 2.1.10 that caused some email subscribe
      requests to be shunted (1966837).

    - Fixed a problem with bin/update erroneously moving templates from
      templates/xx to lists/xx if a list has the same name as a language
      code.  Also fixed the absolute path to lists/ (1418670 ).

    - Changed Utils.ValidateEmail to not allow specials (particularly ':')
      in unquoted local parts (1956393).

    - Changed bin/update to remove .bak files erroneously left behind in
      qfiles/*/ by a 2.1.9 bug.

    - Added 's' to %(listname) in templates/ia/admlogin.html and
      templates/sl/help.txt (1682990).

    - Use newer template variable for site-owner address in
      templates/ko/newlist.txt and templates/ru/newlist.txt (1578766).

    - Corrections to Spanish translation submitted by Wikimedia Foundation
      (1433262) and Debian.

    - Corrections to German translation submitted by Ralf Doeblitz (916196).

    - Correction to French translation submitted by Maxime Carron (1588617).

    - Correction to Portuguese translation submitted by Gabriel P. Silva
      (1733057).

    - Add #! line to fblast.py test script (1578740).

    - Fixed unescaped '%' in templates/nl/newlist.txt (1719017).

    - Changed non-ascii characters in some templates/*/*.html files to HTML
      entities.

    - Fixed a problem in Decorate.py that could result in a multipart
      message with no part headers for the original body part (1991348).

    - Improved recognition of some bounce messages.

    - Rearranged calls to the list setBounceInfo() method in Bouncer.py
      to accommodate MemberAdaptors that store bounce info outside the
      list instance.

    - Fixed CookHeaders.py which in some cases with new style prefixing
      would insert an extra space between the prefix and the subject.

    - Changed OldStyleMemberships.py to remove the member from one_last_digest
      when changing from regular to digest delivery to avoid the possibility
      of a duplicate digest in some circumstances.

    - Patched Danish message catalog for proper use of HTML entities per
      Jonas Smedegaard (1999966).

    - Improved bounce loop detection and handling in BounceRunner.py.

    - Merged the Catalan i18n from the Mailman Catalan Translation Team.

    - German translation updated by Peer Heinlein.

    - Added check for gateway_to_news before holding for ModeratedNewsgroup.

    - At some point, cron/senddigests and bin/update were inadvertently
      'preconfigured'. This has been fixed.

    - Brazilian Portuguese translation updated by Diego Francisco
      de Gastal Morales.

    - Added 'listname' to the replacements for the archidxfoot.html template.

  Miscellaneous

    - Brad Knowles' mailman daily status report script updated to 0.0.18.

2.1.10 (21-Apr-2008)

  Security

    - The 2.1.9 fixes for CVE-2006-3636 were not complete.  In particular,
      some potential cross-site scripting attacks were not detected in
      editing templates and updating the list's info attribute via the web
      admin interface.  This has been assigned CVE-2008-0564 and has been
      fixed.  Thanks again to Moritz Naumann for assistance with this.

    - There is a new mm_cfg.py/Defaults.py variable
      OWNERS_CAN_CHANGE_MEMBER_PASSWORDS which controls whether the list
      owner can change a member's password from the member's options page.
      This defaults to No and should be changed to Yes only if list owners
      are trusted to not change a member's password, log in as the member
      and make global membership changes.

  New Features

    - Changed cmd_who.py to list all members if authorization is with the
      list's admin or moderator password and to accept the password if the
      roster is public.  Also changed the web roster to show hidden members
      when authorization is by site or list's admin or moderator password
      (1587651).

    - Added the ability to put a list name in accept_these_nonmembers
      to accept posts from members of that list (1220144).

    - Added a new 'sibling list' feature to exclude members of another list
      from receiving a post from this list if the other list is in the To: or
      Cc: of the post or to include members of the other list if that list is
      not in the To: or Cc: of the post (Patch ID 1347962).

    - Added the admin_member_chunksize attribute to the admin General Options
      interface (Bug 1072002, Partial RFE 782436).

Internationalization

    - Added the Hebrew translation from Dov Zamir.  This includes addition of
      a direction ('ltr', 'rtl') to the LC_DESCRIPTIONS table.  The
      add_language() function defaults direction to 'ltr' to not break
      existing mm_cfg.py files.

    - Added the Slovak translation from Martin Matuska.

    - Added the Galician translation from Frco. Javier Rial Rodríguez.

  Bug fixes and other patches

    - Added bounce recognition for several additional bounce formats.

    - Fixed CommandRunner.py to decode a quoted-printable or base64 encoded
      message part (1829061).

    - Fixed Scrubber.py to avoid loss of an implicit text/plain message part
      with no Content-* headers in a MIME multipart message (759841).  Fixed
      several other minor scrubber issues (1242450).

    - Added Date and Message-ID headers to the confirm reply message that
      Mailman adds to the admin notification (1471318).

    - Fixed Cgi/options.py to not present the "empty" topic to user.

    - Fixed Handlers/CalcRecips.py to not process topics if topics are
      disabled for the list.  This caused users who had previously subscribed
      to topics and elected to not receive non-matching posts to receive no
      messages after topics were disabled for the list.

    - Fixed MaildirRunner.py to handle hyphenated list names.

    - Fixed a bug in MimeDel.py (content filtering) which caused
      *_filename_extensions to not match if the extension in the message was
      not all lower case.

    - Fixed versions.py to not call a non-existant method when converting held
      posts from Mailman 1.0.x lists.

    - Added a test to configure to detect a missing python-devel package on
      some RedHat systems.

    - Fixed bin/dumpdb to once again be able to dump marshals (broken since
      2.1.5) (963137).

    - Worked around a bug in the Python email library that could cause Mailman
      to not get the correct value for the sender of a message from an RFC
      2231 encoded header causing spurious held messages.

    - Fixed bin/check_perms to detect certain missing permissions on the
      archives/private/ and archives/private/<list>/database/ directories.

    - Improved exception handling in cron/senddigests.

    - Changed the admindb page to not show the "Discard all messages marked
      Defer" checkbox when there are only (un)subscribes and no held messages.
      Also added a separator and heading for "Held Messages" like the ones for
      "Subscribe Requests" and "Unsubscribe Requests".  Suppressed the
      "Database Updated" message when coming from the login page.  Also
      removed the "Discard all messages marked Defer" checkbox from the
      details page where it didn't work (1562922, 1000699).

    - Fixed admin.py so null VARHELP category is handled (1573393).

    - Fixed OldStyleMemberships.py to preserve delivery statuses BYADMIN
      and BYUSER on a straight change of address (1642388).  Also fixed a
      bug that could result in a member key with uppercase in the domain.

    - Fixed bin/withlist so that -r can take a full package path to a
      callable.

    - Removal of DomainKey/DKIM signatures is now controlled by Defaults.py
      mm_cfg.py variable REMOVE_DKIM_HEADERS (default = No).  Also, if
      REMOVE_DKIM_HEADERS = Yes, an Authentication-Results: header will be
      removed if present.

    - The DeprecationWarning issued by Python 2.5 regarding string exceptions
      is supressed.

    - format=flowed and delsp=yes are now preserved for message bodies when
      message headers/footers are added and attachments are scrubbed
      (1495122).

    - Queue runner processing is improved to log and preserve for analysis in
      the shunt queue certain bad queue entries that were previously logged
      but lost.  Also, entries are preserved when an attempt to shunt throws
      an exception (1656289).

    - The admin Membership List pages have been changed in that the email
      address which forms a part of the various CGI data keys is now
      urllib.quote()ed. This allows changing options for and unsubbing an
      address which contains a double-quote character, but it may require
      changes to scripts that screen-scrape the web admin interface to
      produce a membership list so they will report an unquoted address.

    - The fix for bug 1181161 in 2.1.7 was incomplete.  The Approve(d): line
      wasn't always found in quoted-printable encoded parts and was never
      found in base64 encoded parts.  This is now fixed.

    - Fixed a mail loop if a list owner puts the list's -bounces or -admin
      address in the list's owner attribute (1834569).

    - Fixed the mailto: link in archived messages to prefix the subject with
      Re: and to put the correct message-id in In-Reply-To (1621278, 1834281).

    - Coerced list name arguments to lower case in the change_pw, inject,
      list_admins and list_owners command line tools (patch 1842412).

    - Fixed cron/disabled to test if bounce info is stale before disabling
      a member when the threshold has been reduced.

    - It wasn't noted here, but in 2.1.9, queue runner processing was made
      more robust by making backups of queue entries when they were dequeued
      so they could be recovered in the event of a system failure.  This
      opened the possibility that if a message itself caused a runner to
      crash, a loop could result that would endlessly reprocess the message.
      This has now been fixed by adding a dequeue count to the entry and
      moving the entry aside and logging the fact after the third dequeue of
      the same entry.

    - Fixed the command line scripts add_members, sync_members and
      clone_member to properly handle banned addresses (1904737).

    - Fixed bin/newlist to add the list's preferred language to the list's
      available_languages if it is other than the server's default language
      (1906368).

    - Changed the first URL in the RFC 2369 List-Unsubscribe: header to go
      to the options login page instead of the listinfo page.

    - Changed the options login page to not issue the "No address given" error
      when coming from the List-Unsubscribe and other direct links.  Also
      changed to remember the user's language selection when redisplaying the
      page following an error.

    - Changed cmd_subscribe.py to properly accept (no)digest without a
      password and to recognize (no)digest and address= case insensitively.

    - Fixed a problem where GuiBase._getValidValue() would truncate a
      floating point Number type to an int if the value was a float instead
      of a numeric string. This affected setting floating point values with
      config_list.

  Miscellaneous

    - Brad Knowles' mailman daily status report script updated to 0.0.17.

    - An updated mm-handler (mm-handler-2.1.10) that can help reduce
      backscatter has been added to the contrib directory.

2.1.9 (12-Sep-2006)

  Security

    - A malicious user could visit a specially crafted URI and inject an
      apparent log message into Mailman's error log which might induce an
      unsuspecting administrator to visit a phishing site.  This has been
      blocked.  Thanks to Moritz Naumann for its discovery.

    - Fixed denial of service attack which can be caused by some
      standards-breaking RFC 2231 formatted headers.  CVE-2006-2941.

    - Several cross-site scripting issues have been fixed.  Thanks to Moritz
      Naumann for their discovery.  CVE-2006-3636

    - Fixed an unexploitable format string vulnerability.  Discovery and fix
      by Karl Chen.  Analysis of non-exploitability by Martin 'Joey' Schulze.
      Also thanks go to Lionel Elie Mamane.  CVE-2006-2191.

  Internationalization

    - New languages: Arabic, Vietnamese.

  Bug fixes and other patches

    - Fixed Decorate.py so that characters in message header/footer which
      are not in the character set of the list's language are ignored rather
      than causing shunted messages (1507248).

    - Switchboard.py - Closed very tiny holes at the upper ends of queue
      slices that could result in unprocessable queue entries.  Improved FIFO
      processing when two queue entries have the same timestamp.

2.1.8 (15-Apr-2006)

  Security

    - A cross-site scripting hole in the private archive script of 2.1.7
      has been closed.  Thanks to Moritz Naumann for its discovery.

  Bug fixes and other patches

    - Bouncers support added: 'unknown user', Microsoft SMTPSVC, Prodigy.net
      and several others.

    - Updated email library to 2.5.7 which will encode payload into qp/base64
      upon setting.  This enabled backing out the scrubber related patches
      including 'X-Mailman-Scrubbed' header in 2.1.7.

    - Fix SpamDetect.py potential hold/reject loop problem.

    - A warning message from email package to the stderr can cause error
      in Logging because stderr may be detached from the process during
      the qrunner run.  We chose not to output errors to stderr but to
      the logs/error if the process is running under mailmanctl subprocess.

    - DKIM header cleansing was separated from Cleanse.py and added to
      -owner messages too.

    - Fixes: Lose Topics when go directly to topics URL (1194419).
      UnicodeError running bin/arch (1395683).  edithtml.py missing import
      (1400128).  Bad escape in cleanarch.  Wrong timezone in list archive
      index pages (1433673).  bin/arch fails with TypeError (1430236).
      Subscription fails with some Language combinations (1435722).
      Postfix delayed notification not recognized (863989).  2.1.7 (VERP)
      mistakes delay notice for bounce (1421285).  show_qfiles: 'str'
      object has no attribute 'as_string' (1444447).  Utils.get_domain()
      wrong if VIRTUAL_HOST_OVERVIEW off (1275856).

  Miscellaneous

    - Brad Knowles' mailman daily status report script updated to 0.0.16.

2.1.7 (31-Dec-2005)

  Security

    - The fix for CAN-2005-0202 has been enhanced to issue an appropriate
      message instead of just quietly dropping ./ and ../ from URLs.

    - A note on CVE-2005-3573: Although the RFC2231 bug example in the CVE has
      been solved in Mailman 2.1.6, there may be more cases where
      ToDigest.send_digests() can block regular delivery.  We put the
      send_digests() calling part in a try/except clause and leave a message
      in the error log if something happened in send_digests().  Daily call of
      cron/senddigests will provide more detail to the site administrator.

    - List administrators can no longer change the user's option/subscription
      globally.  Site admin can change these only if
      mm_cfg.ALLOW_SITE_ADMIN_COOKIES is set to Yes.

    - <script> tags are HTML-escaped in the edithtml CGI script.

    - Since the probe message for disabled users may reach unintended
      recipients, the password is excluded from sendProbe() and probe.txt.
      Note that the default value of VERP_PROBE has been set to `No' from
      2.1.6., thus this change doesn't affect the default behavior.

  New Features

    - Always remove DomainKey (and similar) headers from messages sent to the
      list. (1287546)

    - List owners can control the content filter behavior when collapsing
      multipart/alternative parts to its first subpart.  This allows the
      option of letting the HTML part pass through after other content
      filtering is done.

  Internationalization

    - New language: Interlingua.

  Bug fixes and other patches

    - Defaults.py.in: SCRUBBER_DONT_USE_ATTACHMENT_FILENAME is set to True for
      safer operation.

    - Fixed the bug where Scrubber.py munges quoted-printable by introducing
      the 'X-Mailman-Scrubbed' header which marks that the payload is
      scrubber-munged.  The flag is referenced in ToDigest.py, ToArchive.py,
      Decorate.py and Archiver.  A similar problem in ToDigest.py where the
      plain digest is generated is also fixed.

    - Fixed Syslog.py to write quopri encoded messages when it fail to write
      8-bit characters.

    - Fixed MTA/Postfix.py to check aliases group permission in check_perms
      and fixed mailman-install document on this matter (1378270).

    - Fixed private.py to go to the original URL after authorization
      (1080943).

    - Fixed bounce log score messages to be more consistent.

    - Fixed bin/remove_members to accept no arguments when both --fromall and
      --file= options are specified.

    - Changed cgi-bin and mail wrapper "group not found" error message to be
      more descriptive of the actual problem.

    - The list's ban_list now applies to address changes, admin mass
      subscribes and invites, and to confirmations/approvals of address
      changes, subscriptions and invitations.

    - quoted-printable and base64 encoded parts are decoded before passing to
      HTML_TO_PLAIN_TEXT_COMMAND (1367783).

    - Approve: header is removed from posts, and treated the same as the
      Approved: header. (1355707)

    - Fixed the removal of the line following Approve[d]: line in body of
      post.  (1318883)

    - The Approve[d]: <password> header is removed from all text/* parts in
      addition the initial text/plain part.  It must still be the first
      non-blank line in the first text/plain part or it won't be found or
      removed at all. (1181161)

    - Posts are now logged in post log file with the true sender, not
      listname-bounces. (1287921)

    - Correctly initialize and remember the list's default_member_moderation
      attribute in the web list creation page. (1263213)

    - PEP263 charset is added to the config_list output. (1343100)

    - Fixed header_filter_rules getting lost if accessed directly and
      authentication was needed by login page. (1230865)

    - Obscure email when the poster doesn't set full name in 'From:' header.

    - Preambles and epilogues are taken into account when calculating message
      sizes for holding purposes. (Mark Sapiro)

    - Logging/Logger.py unicode transform option. (1235567)

    - bin/update crashes with bogus files. (949117)

    - Bugs and patches: 1212066/1301983 (Date header in create/remove notice)

2.1.6 (30-May-2005)

  Security

    - Critical security patch for path traversal vulnerability in private
      archive script  (CAN-2005-0202).

    - Added the ability for Mailman generated passwords (both member and list
      admin) to be more cryptographically secure.  See new configuration
      variables USER_FRIENDLY_PASSWORDS, MEMBER_PASSWORD_LENGTH, and
      ADMIN_PASSWORD_LENGTH.  Also added a new bin/withlist script called
      reset_pw.py which can be used to reset all member passwords.  Passwords
      generated by Mailman are now 8 characters by default for members, and 10
      characters for list administrators.

    - A potential cross-site scripting hole in the driver script has been
      closed.  Thanks to Florian Weimer for its discovery.  Also, turn
      STEALTH_MODE on by default.

  Internationalization

    - Chinese languages are now supported.  They have been moved from 'big5'
      and 'gb' to 'zh_TW' and 'zh_CN' respectively for compliance to the IANA
      spec.  Note, however, that the character sets were changed from 'Big5'
      or 'GB2312' to 'UTF-8' to cope with the insufficient codecs support in
      Python 2.3 and earlier.  You may have to install Chinese capable codecs
      (like CJKCodecs) separately to handle the incoming messages which are in
      local charsets, or upgrade your Python to 2.4 or newer.

  Behavior or defaults changes

    - VERP_PROBES is disabled by default.

    - bin/withlist can be run without a list name, but only if -i is given.
      Also, withlist puts the directory it's found in at the end of sys.path,
      making it easier to run withlist scripts that live in $prefix/bin.

    - bin/newlist grew two new options: -u/--urlhost and -e/--emailhost which
      lets the user provide the web and email hostnames for the new mailing
      list.  This is a better way to specify the domain for the list, rather
      than the old 'mylist@hostname' syntax (which is still supported for
      backward compatibility, but deprecated).

  Compatibility

    - Python 2.4 compatibility issue: time.strftime() became strict about the
      'day of year' range.  (1078482)

  New Features

    - New feature: automatic discards of held messages.  List owners can now
      set how many days to hold the messages in the moderator request queue.
      cron/checkdb will automatically discard old messages.  See the
      max_days_to_hold variable in the General Options and
      DEFAULT_MAX_DAYS_TO_HOLD in Defaults.py.  This defaults to 0
      (i.e. disabled). (790494)

    - New feature: subject_prefix can be configured to include a sequence
      number which is taken from the post_id variable.  Also, the prefix is
      always put at the start of the subject, i.e. "[list-name] Re: original
      subject", if mm_cfg.OLD_STYLE_PREFIXING is set No.  The default style
      is "Re: [list-name]" if numbering is not set, for backward compatibility.
      If the list owner is using numbering feature by "%d" directive, the new
      style, "[list-name 123] Re:", is always used.

    - List owners can now cusomize the non-member rejection notice from
      admin/<listname>/privacy/sender page. (1107169)

    - Allow editing of the welcome message from the admin page (1085501).

    - List owners can now use Scrubber to get the attachments scrubbed (held
      in the web archive), if the site admin permits it in mm_cfg.py.  New
      variables introduced are SCRUBBER_DONT_USE_ATTACHMENT_FILENAME and
      SCRUBBER_USE_ATTACHMENT_FILENAME_EXTENSION in Defaults.py for scrubber
      behavior.  (904850)

  Documentation

    - Most of the installation instructions have been moved to a latex
      document.  See doc/mailman-install/index.html for details.

  Bug fixes and other patches

    - Mail-to-news gateway now strips subject prefix off from a response
      by a mail user if news_prefix_subject_too is not set.

    - Date and Message-Id headers are added for digests. (1116952)

    - Improved mail address sanity check.  (1030228)

    - SpamDetect.py now checks attachment header.  (1026977)

    - Filter attachments by filename extensions.  (1027882)

    - Bugs and patches: 955381 (older Python compatibility), 1020102/1013079/
      1020013 (fix spam filter removed), 665569 (newer Postfix bounce
      detection), 970383 (moderator -1 admin requests pending), 873035
      (subject handling in -request mail), 799166/946554 (makefile
      compatibility), 872068 (add header/footer via unicode), 1032434
      (KNOWN_SPAMMERS check for multi-header), 1025372 (empty Cc:), 789015
      (fix pipermail URL), 948152 (Out of date link on Docs),  1099138
      (Scrubber.py breaks on None part),  1099840/1099840 (deprecated %
      insertion),  880073/933762 (List-ID RFC compliance),  1090439 (passwd
      reminder shunted), 1112349 (case insensitivity in acceptable_aliases),
      1117618 (Don't Cc for personalized anonymous list), 1190404 (wrong
      permission after editing html)

2.1.5 (15-May-2004)

    - The admindb page has a checkbox that allows you to discard all held
      messages that are marked Defer.  On heavy lists with lots of spam holds,
      this makes clearing them much faster.

    - The qrunner system has changed to use only one file per message.
      However the configuration variable METADATA_FORMAT has been removed, and
      support for SAVE_MSGS_AS_PICKLES has been changed.  The latter no longer
      writes messages as plain text.  Instead, they are stored as pickles of
      plain strings, using the text pickle format.  This still makes them
      non-binary files readable and editable by humans.

      bin/dumpdb also works differently.  It will print out the entire pickle
      file (with more verbosity) and if used with 'python -i', it binds msg to
      a list of all objects found in the pickle file.

      Removed from Defaults.py: PENDINGDB_LOCK_TIMEOUT,
      PENDINGDB_LOCK_ATTEMPTS, METAFMT_MARSHAL, METAFMT_BSDDB_NATIVE,
      METAFMT_ASCII, METADATA_FORMAT

    - The bounce processor has been redesigned so that now when an address's
      bounce score reaches the threshold, that address will be sent a probe
      message.  Only if the probe bounces will the address be disabled.  The
      score is reset to zero when the probe is sent.  Also, bounce events are
      now kept in an event file instead of in memory.  This should help
      contain the bloat of the BounceRunner.

      New supporting variables in Defaults.py: VERP_PROBE_FORMAT,
      VERP_PROBE_REGEXP

      REGISTER_BOUNCES_EVERY is promoted to a Defaults.py variable.

    - The pending database has been changed from a global pickle file, to a
      unique pickle file per mailing list.

    - The 'request' database file has changed from a marshal, to the more
      secure pickle format.

    - Disallow multiple password retrievals.

    - SF patch #810675 which adds a "Discard all messages marked Defer" button
      for faster admindb maintenance.

    - The email package is updated to version 2.5.5.

    - New language: Turkish.

    - Bugs and patches: 869644, 869647 (NotAMemberError for old cookie data),
      878087 (bug in Slovenian catalog), 899263 (ignore duplicate pending
      ids), 810675 (discard all defers button)

2.1.4 (31-Dec-2003)

    - Close some cross-site scripting vulnerabilities in the admin pages
      (CAN-2003-0965).

    - New languages: Catalan, Croatian, Romanian, Slovenian.

    - New mm_cfg.py/Defaults.py variable PUBLIC_MBOX which allows the site
      administrator to disable public access to all the raw list mbox files
      (this is not a per-list configuration).

    - Expanded header filter rules under Privacy -> Spam Filters.  Now you can
      specify regular expression matches against any header, with specific
      actions tied to those matches.

    - Rework the SMTP error handling in SMTPDirect.py to avoid scoring bounces
      for all recipients when a permanent error code is returned by the mail
      server (e.g. because of content restrictions).

    - Promoted SYNC_AFTER_WRITE to a Default.py/mm_cfg.py variable and
      make it control syncing on the config.pck file.  Also, we always flush
      and sync message files.

    - Reduce archive bloat by not storing the HTML body of Article objects in
      the Pipermail database.  A new script bin/rb-archfix was added to clean
      up older archives.

    - Proper RFC quoting for List-ID descriptions.

    - PKGDIR can be passed to the make command in order to specify a different
      directory to unpack the distutils packages in misc.  (SF bug 784700).

    - Improved logging of the origin of subscription requests.

    - Bugs and patches: 832748 (unsubscribe_policy ignored for unsub button on
      member login page), 846681 (bounce disabled cookie was always out of
      date), 835870 (check VIRTUAL_HOST_OVERVIEW on through the web list
      creation), 835036 (global address change when the new address is already
      a member of one of the lists), 833384 (incorrect admin password on a
      hold message confirmation attachment would discard the message), 835012
      (fix permission on empty archive index), 816410 (confirmation page
      consistency), 834486 (catch empty charsets in the scrubber), 777444 (set
      the process's supplemental groups if possible), 860135 (ignore
      DiscardMessage exceptions during digest scrubbing), 828811 (reduce
      process size for list and admin overviews), 864674/864676 (problems
      accessing private archives and rosters with admin password), 865661
      (Tokio Kikuchi's i18n patches), 862906 (unicode prefix leak in admindb),
      841445 (setting new_member_options via config_list), n/a (fixed email
      command 'set delivery')

2.1.3 (28-Sep-2003)

    Performance, Reliability, Security

        - Closed a cross-site scripting exploit in the create cgi script.

        - Improvements in the performance of the bounce processor.
          Now, instead of processing each bounce immediately (which
          can cause severe lock contention), bounce events are queued.
          Every 15 minutes by default, the queued bounce events are
          processed en masse, on a list-per-list basis, so that each
          list only needs to be locked once.

        - When some or all of a message's recipients have temporary
          delivery failures, the message is moved to a "retry" queue.
          This queue wakes up occasionally and moves the file back to
          the outgoing queue for attempted redelivery.  This should
          fix most observed OutgoingRunner 100% cpu consumption,
          especially for bounces to local recipients when using the
          Postfix MTA.

        - Optional support for fsync()'ing qfile data after writing.
          Under some catastrophic system failures (e.g. power lose),
          it would be possible to lose messages because the data
          wasn't sync'd to disk.  By setting SYNC_AFTER_WRITE to True
          in Mailman/Queue/Switchboard.py, you can force Mailman to
          fsync() queue files after flushing them.  The benefits are
          debatable for most operating environments, and you must
          ensure that your Python has the os.fsync() function defined
          before enabling this feature (it isn't, even on all
          Unix-like operating systems).

    Internationalization

        - New languages Ukrainian, Serbian, Danish, Euskara/Basque.

        - Fixes to template lookup.  Lists with local overriding
          templates would find the wrong template.

        - .mo files (for internationalization) are now generated at
          build time instead of coming as part of the source
          distribution.

    Documentation

        - A first draft of member documentation by Terri Oda.  There
          is also a Japanese translation of this manual by Ikeda Soji.

    Archiver / Pipermail

        - In the configuration variables PUBLIC_EXTERNAL_ARCHIVER, and
          PRIVATE_EXTERNAL_ARCHIVER, %(hostname)s has been added to
          the list of allowable substitution variables.

        - The timezone is now taken into account when figuring the
          posting date for an article.

    Scripts / Cron

        - Fixes to cron/disabled for NotAMemberError crashes.

        - New script bin/show_qfiles which prints the contents of .pck
          message files.  New script bin/discard which can be used to
          mass discard held messages.

        - Fixes to cron/mailpasswds to account for old password-less
          subscriptions.

        - bin/list_members has grown two new options: --invalid/-i
          prints only the addresses in the member database that are
          invalid (which could have snuck in via old releases);
          --unicode/-u prints addresses which are stored as Unicode
          objects instead of as normal strings.

    Miscellaneous

        - Fixes to problems in some configurations where Python wouldn't
          be able to find its standard library.

        - Fixes to the digest which could cause MIME-losing missing
          newlines when parts are scrubbed via the content filters.

        - In the News/Mail gateway admin page, the configuration variable
          nntp_host can now be a name:port pair.

        - When messages are pulled from NNTP, the member moderation checks
          are short-circuited.

        - email 2.5.4 is included.  This fixes an RFC 2231 bug, among
          possibly others.

        - Fixed some extra spaces that could appear in the List-ID header.

        - Fixes to ensure that invalid email addresses can't be invited.

        - WEB_LINK_COLOR in Defaults.py/mm_cfg.py should now work.

        - Fixes so that shunted message file names actually match
          those logged in log/errors.

        - An improved pending action cookie generation algorithm has
          been added.

        - Fixes to the DSN bounce detector.

        - The usual additional u/i, internationalization, unicode, and
          other miscellaneous fixes.

2.1.2 (22-Apr-2003)

    - New languages Portuguese (Portugal) and Polish.

    - Many convenient constants have been added to the Defaults.py
      module to (hopefully) make it more readable.

    - Email addresses which contain 8-bit characters in them are now
      rejected and won't be subscribed.  This is not the same as 8-bit
      characters in the realname, which is still allowed.

    - The X-Originating-Email header is removed for anonymous lists.
      Hotmail apparently adds this header.

    - When running make to build Mailman, you can specify $DESTDIR to
      the install target to specify an alternative location for
      installation, without influencing the paths stored in
      e.g. Defaults.py.  This is useful to package managers.

    - New Defaults.py variable DELIVERY_RETRY_WAIT which controls how
      long the outgoing qrunner will wait before it retries a
      tempfailure delivery.

    - The semantics for the extend.py hook to MailList objects has
      changed slightly.  The hook is now called before attempting to
      lock and load the database.

    - Mailman now uses the email package version 2.5.1

    - bin/transcheck now checks for double-%'s

    - bin/genaliases grew a -q / --quiet flag

    - cron/checkdbs grew a -h / --help option.

    - The -c / --change-msg option has been removed from bin/add_members

    - bin/msgfmt.py has been added, taken from Python 2.3's Tools/i18n
      directory.  The various .mo files are now no longer distributed
      with Mailman.  They are generated at build time instead.

    - A new file misc/sitelist.cfg which can be used with
      bin/config_list provides a small number of recommended settings
      for your site list.  Be sure to read it over before applying!
      sitelist.cfg is installed into the data directory.

    - Many bug fixes, including these SourceForge bugs closed and
      patches applied: 677668, 690448, 700538, 700537, 673294, 683906,
      671294, 522080, 521124, 534297, 699900, 697321, 695526, 703941,
      658261, 710678, 707608, 671303, 717096, 694912, 707624, 716755,
      661138, 716754, 716702, 667167, 725369, 726415


2.1.1 (08-Feb-2003)

    Lots of bug fixes and language updates.  Also:

    - Closed a cross-site scripting vulnerability in the user options page.

    - Restore the ability to control which headers show up in messages
      included in plaintext and MIME digests.  See the variables
      PLAIN_DIGEST_KEEP_HEADERS and MIME_DIGEST_KEEP_HEADERS in
      Defaults.py.

    - Messages included in the plaintext digests are now sent through
      the scrubber to remove (and archive) attachments.  Otherwise,
      attachments would screw up plaintext digests.  MIME digests
      include the attachments inline.

2.1 final (30-Dec-2002)

    Last minute bug fixes and language updates.

2.1 rc 1 (24-Dec-2002)

    Bug fixes and language updates.  Also,

    - Lithuanian support has been added.

    - bin/remove_members grew --nouserack and --noadminack switches

    - configure now honors --srcdir

2.1 beta 6 (09-Dec-2002)

    Lots and lots of bug fixes, and translation updates.  Also,

    - ARCHIVER_OBSCURES_EMAILADDRS is now set to true by default.

    - QRUNNER_SAVE_BAD_MESSAGES is now set to true by default.

    - Bounce messages which were recognized, but in which no member
      addresses were found are no longer forwarded to the list
      administrator.

    - bin/arch grew a --wipe option which first removes the entire old
      archive before regenerating the new one.

    - bin/mailmanctl -u now prints a warning that permission problems
      could appear, such as when trying to delete a list through the
      web that has some archives in it.

    - bin/remove_members grew --nouserack/-n and -noadminack/-N options.

    - A new script bin/list_owners has been added for printing out
      list owners and moderators.

    - Dates in the web version of archived messages are now relative
      to the local timezone, and include the timezone names, when
      available.

2.1 beta 5 (19-Nov-2002)

    As is typical for a late beta release, this one includes the usual
    bug fixes, tweaks, and massive new features (just kidding).

    IMPORTANT: If you are using Pipermail, and you have any archives
    that were created or added to in 2.1b4, you will need to run
    bin/b4b5-archfix, followed by bin/check_perms to fix some serious
    performance problems.  From you install directory, run
    "bin/b4b5-archfix --help" for details.

    - The personalization options have been tweaked to provide more
      control over mail header and decoration personalizations.  In
      2.1b4, when personalization was enabled, the To and Cc headers
      were always overwritten.  But that's usually not appropriate for
      anything but announce lists, so now these headers aren't changed
      unless "Full personalization" is enabled.

    - You now need to go to the General category to enable emergency
      moderation.

    - The order of the hold modules in the GLOBAL_PIPELINE has
      changed, again.  Now Moderate comes before Hold.

    - Estonian language support has been added.

    - All posted messages should now get decorated with headers and
      footers in a MIME-safe way.  Previously, some MIME type messages
      didn't get decorated at all.

    - bin/arch grew a -q/--quiet option

    - bin/list_lists grew a -b/--bare option

2.1 beta 4 (26-Oct-2002)

    The usual assortment of bug fixes and language updates, some u/i
    tweaks, as well as the following:

    - Configuring / building / installing
        o Tightened up some configure checks; it will now bark loudly
          if you don't have the Python distutils package available
          (some Linux distros only include distutils in their "devel"
          packages).

        o Mailman's username/group security assertions are now done by
          symbolic name instead of numeric id.  This provides a level
          of indirection that makes it much easier to move or package
          Mailman.  --with-mail-gid and --with-cgi-gid are retained,
          but they control the group names used instead.

    - Command line scripts
        o A new script, bin/transcheck that language teams can use to
          check their .po files.

        o bin/list_members grew a --fullnames/-f option to print the
          full names along with the addresses.

        o cron/senddigests grew --help/-h and --listname/-l options.

        o bin/fix_url.py grew some command line options to support moving
          a list to a specific virtual domain.

    - Pipermail / archiving
        o Reworked the directory layout for archive attachments to be
          less susceptible to inode overload.  Attachments are now
          placed in

          archives/private/<listname>/attachments/<YYYYMMDD>/<msgidhash>

        o Internationalization support in the archiver has been improved.

    - Internationalization
        o New languages: Swedish.

    - Mail handling
        o Content filtering now has a pass_mime_type variable, which
          is a whitelist of MIME types to allow in postings.  See the
          details of the variable in the Content Filtering category
          for more information.

        o If a member has enabled their DontReceiveDuplicates option,
          we'll also strip their addresses from the Cc headers in the
          copy of the message sent to the list.  This helps keep the
          Cc lines from growing astronomically.

        o Bounce messages are now forwarded to the list administrators
          both if they are unrecognized, and if no list member's
          address could be extracted.

        o Content filtering now has a filter_action variable which
          controls what happens when a message matches the content
          filter rules.  The default is still to discard the message.

        o When searching for an Approve/Approved header, the first
          non-whitespace line of the body of the message is also
          checked, if the body has a MIME type of text/plain.

        o If a list is personalized, and the list's posting address is
          not included in a Reply-To header, the posting address is
          copied into a Cc header, otherwise there was no (easy) way a
          recipient could reply back to the list.

        o Added a MS Exchange bounce recognizer.

        o New configuration variable news_moderation which allows the
          mail->news gateway to properly post to moderated newsgroups.

        o Messages sent to a list's owners now comes from the site
          list to prevent mail loops when list owners or moderators
          having bouncing addresses.

    - Miscellaneous
        o mailanctl prevents runaway restarts by imposing a maximum
          restart value (defaulting to 10) for restarting the
          qrunners.  If you hit this limit, do "mailmanctl stop"
          followed by "mailmanctl start".

        o The Membership Management page's search feature now includes
          searching on members real names.

        o The start of a manual for list administrators is given in
          Python HOWTO format (LaTeX).  It's in doc/mailman-admin.tex
          but it still needs lots of fleshing out.

        o More protections against creating a list with an invalid name.

2.1 beta 3 (09-Aug-2002)

    The usual assortment of bug fixes and language updates.

    - New languages: Dutch, Portuguese (Brazil)

    - New configure script options: --with-mailhost, --with-urlhost,
      --without-permcheck.  See ./configure --help for details.

    - The encoding of Subject: prefixes is controlled by a new list
      option encode_ascii_prefixes.  This is useful for languages with
      character sets other than us-ascii.  See the Languages admin
      page for details.

    - A new list option news_prefix_subject_too controls whether
      postings gated from mail to news should have the subject prefix
      added to their Subject: header.

    - The algorithm for upgrading the moderation controls for a
      Mailman 2.0.x list has changed.  The change should be
      transparent, but you'll want to double check the moderation
      controls after upgrading from MM2.0.x.  This should have no
      effect for upgrades from a previous MM2.1 beta.

      See the UPGRADING file for details.

    - On the Mass Subscribe admin page, a text box has been added so
      that the admin can add a custom message to be prepended to the
      welcome/invite notification.

    - On the admindb page, a link is included to more easily reload
      the page.

    - The Sendmail.py delivery module is sabotaged so that it can't be
      used naively.  You need to read the comments in the file and
      edit the code to use this unsafe module.

    - When a member sends a `help' command to the request address,
      the url to their options page is included in the response.

    - Autoresponses, -request command responses, and posting hold
      notifications are inhibited for any message that has a
      Precedence: {bulk|list|junk} header.  This is to avoid mail
      loops between email 'bots.  If the original message has an
      X-Ack: yes header, the response is sent.

      Responses are also limited to a maximum number per day, as
      defined in the site variable MAX_AUTORESPONSES_PER_DAY.  This is
      another guard against 'bot loops, and it defaults to 10.

    - When a Reply-To: header is munged to include both the original
      and the list address, the list address is always added last.

    - The cron/mailpasswds script has grown a -l/--listname option.

    - The cron/disabled script has grown options to send out
      notifications for reasons other than bounce-disabled.  It has
      also grown a -f/--force option.  See cron/disabled --help for
      details.

    - The bin/dumpdb script has grown a -n/--noprint option.

    - An experimental new mechanism for processing incoming messages
      has been added.  If you can configure your MTA to do qmail-style
      Maildir delivery, Mailman now has a MaildirRunner qrunner.  This
      may turn out to be much more efficient and scalable, but for
      MM2.1, it will not be officially supported.  See Defaults.py.in
      and Mailman/Queue/MaildirRunner.py for details.

2.1 beta 2 (05-May-2002)

    Lots of bug fixing, and the following new features and changes:

    - A "de-mime" content filter feature has been added.  This
      oft-requested feature allows you to specify MIME types that
      Mailman should strip off of any messages before they're posted
      to the list.  You can also optionally convert text/html to
      text/plain (by default, through lynx if it's available).

    - Changes to the way the RFC 2919 and 2369 headers (i.e. the
      List-*: headers) are added:
          o List-Id: is always added
          o List-Post:, List-Help:, List-Subscribe:,
            List-Unsubscribe:, and List-Archive: are only added to
            posting messages.
          o X-List-Administrivia: is only added to messages Mailman
            creates and sends out of its own accord.

      Also, if the site administrator allows it, list owners can
      suppress the addition of all the List-*: headers.  List owners
      can also separately suppress the List-Post: header for
      announce-only lists.

    - A new framework for email commands has been added.  This allows
      you to easily add, delete, or change the email commands that
      Mailman understands, on a per-site, per-list, or even per-user
      basis.

    - Users can now change their digest delivery type from MIME to
      plain text globally, for all lists they are subscribed to.

    - No language select pulldowns are shown if the list only supports
      one language.

    - More mylist-admin eradication.

    - Several performance improvements in the bounce qrunner, one of
      which is to make it run only once per minute instead of once per
      second.

    - Korean language support as been added.

    - Gatewaying from news -> mail uses its connections to the nntpd
      more efficiently.

    - In bin/add_members, -n/--non-digest-members-file command line
      switch is deprecated in favor of -r/--regular-members-file.

    - bin/sync_members grew a -g/--goodbye-msg switch.

2.1 beta 1 (16-Mar-2002)

    In addition to the usual bug fixes, performance improvements, and
    GUI changes, here are the highlights:

    - MIME and other message handling
        o More robustness against badly MIME encapsulated messages: if
          a MessageParseError is raised during the initial parse, the
          message can either be discarded or saved in qfiles/bad,
          depending on the value of the new configuration variable
          QRUNNER_SAVE_BAD_MESSAGES.

        o There is a new per-user option that can be used to avoid
          receipt of extra copies, when a member of the list is also
          explicitly CC'd.

        o Always add an RFC 2822 Date: header if missing, since not
          all MTAs insert one automatically.

        o The Sender: and Errors-To: headers are no longer added to
          outgoing messages.

        o Headers and footers are always added by concatenation, if
          the message is not MIME and if the list's charset is a
          superset of us-ascii.

    - List administration
        o An `invitation' feature has been added.  This is selectable
          as a radio button on the mass subscribe page.  When
          selected, users are invited to join instead of immediately
          joined, i.e. they get a confirmation message.

        o You can now enable and disable list owner notifications for
          disabled-due-to-bouncing and removal-due-to-bouncing
          actions.  The site config variables
          DEFAULT_BOUNCE_NOTIFY_OWNER_ON_DISABLE and
          DEFAULT_BOUNCE_NOTIFY_OWNER_ON_REMOVAL control the default
          behavior.

        o List owners can now decide whether they receive unrecognized
          bounce messages or not (i.e. messages that the bounce
          processor doesn't recognize).  Site admins can set the
          default value for this flag with the config variable
          DEFAULT_BOUNCE_UNRECOGNIZED_GOES_TO_LIST_OWNER.

        o The admindb summary page gives the option of clearing the
          moderation flag of members who are on quarantined.

        o The action to take when a moderated member posts to a list
          is now configurable.  The message can either be held,
          rejected (bounced), or discarded.  If the message is
          rejected, a rejection notice string can be given.

        o In the General admin page, you can now set the default value
          for five per-user flags: concealing the user's email
          address, acknowledging posts sent by the user, copy
          suppression, not-me-too selection, and the default digest
          type.  Site admins can set the default bit field with the
          new DEFAULT_NEW_MEMBER_OPTIONS variable.

        o A new "Emergency brake" feature for turning on moderation of
          all list postings.  This is useful for when flamewars break
          out, and the list needs a cooling off period.  Messages
          containing an Approved: header with the list owner password
          are still allowed through, as are messages approved through
          the admindb interface.

        o When a moderated message is approved for the list, add an
          X-Mailman-Approved-At: header which contains the timestamp
          of the approval action (changed from X-Moderated: with a
          different format).

        o Lists can now be converted to using a less error prone
          mechanism for variable substitution syntax in headers and
          footers.  Instead of %(var)s strings, you'd use $var
          strings.  You must use "bin/withlist -r convert" to enable
          this.

        o When moderating held messages, the header text box and the
          message excerpt text box are now both read-only.

        o You can't delete the site list through the web.

        o When creating new lists through the web, you have the option
          of setting the "default member moderation" flag.

    - Security and privacy
        o New feature: banned subscription addresses.  Privacy
          options/subscription rules now have an additional list box
          which can contain addresses or regular expressions.
          Subscription requests from any matching address are
          automatically rejected.

        o Membership tests which compare message headers against list
          rosters are now more robust.  They now check, by default
          these header in order: From:, unixfrom, Reply-To:, Sender:.
          If any match, then the membership test succeeds.

        o ALLOW_SITE_ADMIN_COOKIES is a new configuration variable
          which says whether to allow AuthSiteAdmin cookies or not.
          Normally, when a list administrator logs into a list with
          the site password, they are issued a cookie that only allows
          them to do administration for this one list.  By setting
          ALLOW_SITE_ADMIN_COOKIES to 1, the user only needs to
          authenticate to one list with the site password, and they
          can administer any mailing list.

          I'm not sure this feature is wise, so the default value for
          ALLOW_SITE_ADMIN_COOKIES is 0.

        o Marc MERLIN's new recipes for secure Linuxes have been
          updated.

        o DEFAULT_PRIVATE_ROSTER now defaults to 1.

        o Passwords are no longer included in the confirmation pages.

    - Internationalization
        o With the approval of Tamito KAJIYAMA, the Japanese codecs
          for Python are now included automatically, so you don't need
          to download and install these separate.  It is installed in
          a Mailman-specific place so it won't affect your larger
          Python installation.

        o The configure script will produce a warning if the Chinese
          codes are not installed.  This is not a fatal error.

        o Russian templates and catalogs have been added.

        o Finnish templates and catalogs have been added.

    - Scripts and utilities
        o New program bin/unshunt to safely move shunted messages back
          into the appropriate processing queue.

        o New program bin/inject for sending a plaintext message into
          the incoming queue from the command line.

        o New cron script cron/disabled for periodically culling the
          disabled membership.

        o bin/list_members has grown some new command line switches
          for filtering on different criteria (digest mode, disable
          mode, etc.)

        o bin/remove_members has grown the --fromall switch.

        o You can now do a bin/rmlist -a to remove an archive even
          after the list has been deleted.

        o bin/update removes the $prefix/Mailman/pythonlib directory.

        o bin/withlist grows a --all/-a flag so the --run/-r option
          can be applied to all the mailing lists.  Also, interactive
          mode is now the default if -r isn't used.  You don't need to
          run this script as "python -i bin/withlist" anymore.

        o There is a new script contrib/majordomo2mailman.pl which
          should ease the transition from Majordomo to Mailman.

    - MTA integration
        o Postfix integration has been made much more robust, but now
          you have to set POSTFIX_ALIAS_CMD and POSTFIX_MAP_CMD to
          point to the postalias and postmap commands respectively.

        o VERP-ish delivery has been made much more efficient by
          eliminating extra disk copies of messages for each recipient
          of a VERP delivery.  It has also been made more robust in
          the face of failures during chunk delivery.  This required a
          rewrite of SMTPDirect.py and one casualty of that rewrite
          was the experimental threaded delivery.  It is no longer
          supported (but /might/ be resurrected if there's enough
          demand -- or a contributed patch :).

        o A new site config variable SMTP_MAX_SESSIONS_PER_CONNECTION
          specifies how many consecutive SMTP sessions will be
          conducted down the same socket connection.  Some MTAs have a
          limit on this.

        o Support for VERP-ing confirmation messages.  These are less
          error prone since the Subject: header doesn't need to be
          retained, and they allow a more user friendly (and i18n'd)
          Subject: header.  VERP_CONFIRM_FORMAT, VERP_CONFIRM_REGEXP,
          and VERP_CONFIRMATIONS control this feature (only supported
          for invitation confirmations currently, but will be expanded
          to the other confirmations).

        o Several new list-centric addresses have been added:
          -subscribe and -unsubscribe are synonyms for -join and
          -leave, respectively.  Also -confirm has been added to
          support VERP'd confirmations.

    - Archiver
        o There's now a default page for the Pipermail archive link
          for when no messages have yet been posted to the list.

        o Just the mere presence of an X-No-Archive: is enough to
          inhibit archiving for this message; the value of the header
          is now ignored.

    - Configuring, building, installing
        o Mailman now has a new favicon, donated by Terry Oda.  Not
          all web pages are linked to the favicon yet though.

        o The add-on email package is now distributed and installed
          automatically, so you don't need to do this.  It is
          installed in a Mailman-specific place so it won't affect
          your larger Python installation.

        o The default value of VERP_REGEXP has changed.

        o New site configuration variables BADQUEUE_DIR and
          QRUNNER_SAVE_BAD_MESSAGES which describe where to save
          messages which are not properly MIME encoded.

        o configure should be more POSIX-ly conformant.

        o The Mailman/pythonlib directory has been removed, but a new
          $prefix/pythonlib directory has been added.

        o Regression tests are now installed.

        o The second argument to add_virtual() calls in mm_cfg.py are
          now optional.

        o DEFAULT_FIRST_STRIP_REPLY_TO now defaults to 0.

        o Site administrators can edit the Mailman/Site.py file to
          customize some filesystem layout policies.


2.1 alpha 4 (31-Dec-2001)

    - The administrative requests database page (admindb) has been
      redesigned for better usability when there are lots of held
      postings.  Changes include:
        o A summary page which groups held messages by sender email
          address.  On this page you can dispose of all the sender's
          messages in one action.  You can also view the details of
          all the sender's messages, or the details of a single
          message.  You can also add the sender to one of the list's
          sender filters.

        o A details page where you can view all messages, just those
          for a particular sender, or just a single held message.
          This details page is laid out the same as the old admindb
          page.

        o The instructions have been shorted on the summary and
          details page, with links to more detailed explanations.

    - Bounce processing
        o Mailman now keeps track of the reason a member's delivery
          has been disabled: explicitly by the administrator,
          explicitly by the user, by the system due to excessive
          bounces, or for (legacy) unknown reasons.

        o A new bounce processing algorithm has been implemented (we
          might actually understand this one ;).  When an address
          starts bouncing, the member gets a "bounce score".  Hard
          (fatal) bounces score 1.0, while soft (transient) bounces
          score 0.5.

          List administrators can specify a bounce threshold above
          which a member gets disabled.  They can also specify a time
          interval after which, if no bounces are received from the
          member, the member's bounce score is considered stale and is
          thrown away.

        o A new cron script, cron/disabled, periodically sends
          notifications to members who are bounce disabled.  After a
          certain number of warnings the member is deleted from the
          list.  List administrators can control both the number of
          notifications and the amount of time between notifications.

          Notifications include a confirmation cookie that the member
          can use to re-enable their subscription, via email or web.

        o New configuration variables to support the bounce processing
          are DEFAULT_BOUNCE_SCORE_THRESHOLD,
          DEFAULT_BOUNCE_INFO_STALE_AFTER,
          DEFAULT_BOUNCE_YOU_ARE_DISABLED_WARNINGS,
          DEFAULT_BOUNCE_YOU_ARE_DISABLED_WARNINGS_INTERVAL.

    - Privacy and security
        o Sender filters can now be regular expressions.  If a line
          starts with ^ it is taken as a (raw string) regular
          expression, otherwise it is a literal email address.

        o Fixes in 2.0.8 ported forward: prevent cross-site scripting
          exploits.

    - Mail delivery
        o Aliases have all been changed so that there's more
          consistency between the alias a message gets delivered to,
          and the script & queue runner that handles the message.

          I've also renamed the mail wrapper script to `mailman' from
          `wrapper' to avoid collisions with other MLM's.  You /will/
          need to regenerate your alias files with bin/genaliases, and
          you may need to update your smrsh (Sendmail) configs.a

          Bounces always go to listname-bounces now, since
          administration has been separated from bounce processing.
          listname-admin is obsolete.

        o VERP support!  This greatly improves the accuracy of bounce
          detection.  Configuration variables which control this feature
          include VERP_DELIVERY_INTERVAL, VERP_PERSONALIZED_DELIVERIES,
          VERP_PASSWORD_REMINDERS, VERP_REGEXP, and VERP_FORMAT.  The
          latter two must be tuned to your MTA.

        o A new alias mailman-loop@dom.ain is added which directs all
          output to the file $prefix/data/owner-bounces.mbox.  This is
          used when sending messages to the site list owners, as the
          final fallback for bouncing messages.

        o New configuration variable POSTFIX_STYLE_VIRTUAL_DOMAINS
          which should be set if you are using the Postfix MTA and
          want Mailman to play nice with Postfix-style virtual
          domains.

    - Miscellaneous
        o Better interoperability with Python 2.2.

        o MailList objects now record the date (in seconds since
          epoch) that they were created.  This is in a hidden
          attribute `created_at'.

        o bin/qrunner grows a -s/--subproc switch which is usually
          used only when it's started from mailmanctl.

        o bin/newlist grows a -l/--language option so that the list's
          preferred language can be set from the command line.

        o cron changes: admin reminders go out at 8am local time instead
          of 10pm local time.

    - Pipermail archiver
        o MIME attachments are scrubbed out into separate files which
          can be viewed by following a link in the original article.
          Article contains an indication of the size of the
          attachment, its type, and other useful information.

        o New script bin/cleanarch which can be used to `clean' an
          .mbox archive file by fixing unescaped embedded Unix From_
          lines.

        o New configuration variable ARCHIVE_SCRUBBER in
          Defaults.py.in which names the module that Pipermail should
          use to scrub articles of MIME attachments.

        o New configuration variable ARCHIVE_HTML_SANITIZER which
          describes how the scrubber should handle text/html
          attachments.

        o PUBLIC_ARCHIVE_URL has change its semantics.  It is now an
          absolute url, with the hostname and listname parts
          interpolated into it on a per-list basis.

        o Pipermail should now provide the proper character set in the
          Content-Type: header for archived articles.

    - Internationalization
        o Czech translations by Dan Ohnesorg.

        o The Hungarian charset has be fixed to be iso-8859-2.

        o The member options login page now has a language selection
          widget.

    - Building, configuration
        o email-0.96 package is required (see the misc directory).

        o New recipes for integrating Mailman and Sendmail,
          contributed by David Champion.


2.1 alpha 3 (22-Oct-2001)

    - Realname support
        o Mailman now tracks a member's Real Name in addition to their
          email address.

        o List members can now supply their Real Names when
          subscribing via the web.  Their Real Names are parsed from
          any thru-email subscriptions.

        o Members can change their Real Names on their options page,
          and admins can change members' Real Names on the membership
          pages.  Mass subscribing accepts "email@dom.ain (Real Name)"
          and "Real Name <email@dom.ain>" entries, for both
          in-text-box and file-upload mass subscriptions.

    - Filtering and Privacy
        o Reply-To: munging has been enhanced to allow a wider range
          of list policies.  You can now pre-strip any Reply-To:
          headers before adding list-specific ones (i.e. you can
          override or extend existing Reply-To: headers).  If
          stripping, the old headers are no longer saved on
          X-Reply-To:

        o New sender moderation rules.  The old `posters',
          `member_only_posting', `moderated' and `forbidden_posters'
          options have been removed in favor of a new moderation
          scheme.  Each member has a personal moderation bit, and
          non-member postings can be automatically accepted, held for
          approval, rejected (bounced) or discarded.

        o When membership rosters are private, responses to
          subscription (and other) requests are made more generic so
          that these processes can't be covertly mined for hidden
          addresses.  If a subscription request comes in for a user
          who is already subscribed, the user is notified of potential
          membership mining.

        o When a held message is approved via the admindb page, an
          X-Moderated: header is added to the message.

        o List admins can now set an unsubscribe policy which requires
          them to approve of member unsubscriptions.

    - Web U/I
        o All web confirmations now require a two-click procedure,
          where the first click gives them a page that allows them to
          confirm or cancel their subscription.  It is bad form for an
          email click (HTTP GET) to have side effects.

        o Lots of improvements for clarity.

        o The Privacy category has grown three subcategories.

        o The General options page as a number of subsection headers.

        o The Passwords and Languages categories are now on separate
          admin pages.

        o The admin subcategories are now formated as two columns in
          the top and bottom legends.

        o When creating a list through the web, you can now specify
          the initial list of supported languages.

        o The U/I for unsubscribing a member on the admin's membership
          page should be more intuitive now.

        o There is now a separate configuration option for whether the
          goodbye_msg is sent when a member is unsubscribed.

    - Performance
        o misc/mailman is a Unix init script, appropriate for
          /etc/init.d, and containing chkconfig hooks for systems that
          support it.

        o bin/mailmanctl has been rewritten; the `restart' command
          actually works now.  It now also accepts -s, -q, and -u
          options.

        o bin/qrunner has been rewritten too; it can serve the role of
          the old cron/qrunner script for those who want classic
          cron-invoked mail delivery.

        o Internally, messages are now stored in the qfiles directory
          primarily as pickles.  List configuration databases are now
          stored as pickles too (i.e. config.pck).  bin/dumpdb knows
          how to display both pickles and marshals.

    - Mail delivery
        o If a user's message is held for approval, they are sent a
          notification message containing a confirmation cookie.  They
          can use this confirmation cookie to cancel their own
          postings (if they haven't already been approved).

        o When held messages are forwarded to an explicit address
          using the admindb page, it is done so  in a message/rfc822
          encapsulation.

        o When a message is first held for approval, the notification
          sent to the list admin is a 3-part multipart/mixed.  The
          first part holds the notification message, the second part
          hold the original message, and the third part hold a cookie
          confirmation message, to which the admin can respond to
          approve or discard the message via email.

        o In the mail->news gateway, you can define mail headers that
          must be modified or deleted before the message can be posted
          to the nntp server.

        o The list admin can send an immediate urgent message to the
          entire list membership, bypassing digest delivery.  This is
          done by adding an Urgent: header with the list password.
          Urgent messages with an invalid password are rejected.

        o Lists can now optionally personalize email messages, if the
          site admin allows it.  Personalized messages mean that the
          To: header includes the recipient's address instead of the
          list's address, and header and footer messages can contain
          user-specific information.  Note that only regular
          deliveries can currently be personalized.

        o Message that come from Usenet but that have broken MIME
          boundaries are ignored.

        o If the site administrator agrees, list owners have the
          ability to disable RFC 2369 List-* headers.

        o There is now an API for an external process to post a
          message to a list.  This posting process can also specify an
          explicit list of recipients, in effect turning the mailing
          list into a "virtual list" with a fluid membership.  See
          Mailman/Post.py for details.

    - Building/testing/configuration
        o mimelib is no longer required, but you must install the
          email package (see the tarball in the misc directory).

        o An (as yet) incomplete test suite has been added.  Don't try
          running it in a production environment!

        o Better virtual host support by adding a mapping from the
          host name given in cgi's HTTP_HOST/SERVER_NAME variable to
          the email host used in list addresses.  (E.g. www.python.org
          maps to @python.org).

        o Specifying urls to external public archivers is more
          flexible.

        o The filters/ subdirectory has been removed.

        o There is now a `site list' which is a mailing list that must
          be created first, and from which all password reminders
          appear to come from.  It is recommended that this list be
          called "mailman@your.site".

        o bin/move_list is no longer necessary (see the FAQ for
          detailed instructions on renaming a list).

        o A new script bin/fix_url.py can be used with bin/withlist to
          change a list's web_page_url configuration variable (since
          it is no longer modifiable through the web).

    - Internationalization
        o Support for German, Hungarian, Italian, Japanese, and
          Norwegian have been added.

    - Miscellaneous
        o Lots of new bounce detectors.  Bounce detectors can now
          discard temporary bounce messages by returning a special
          Stop value.

        o bin/withlist now sports a -q/--quiet flag.

        o bin/add_members has a new -a/--admin-notify flag which can
          be used to inhibit list owner notification for each
          subscription.

    - Membership Adaptors
        o Internally, mailing list memberships are accessed through a
          MemberAdaptor interface.  This would allow for integrating
          membership databases with external sources (e.g. Zope or
          LDAP), although the only MemberAdaptor currently implemented
          is a "classic" adaptor which stores the membership
          information on the MailList object.

        o There's a new pipeline handler module called FileRecips.py
          which could be used to get all regular delivery mailing list
          recipients from a Sendmail-style :include: file (see List
          Extensibility bullet below).

          This work was sponsored by Control.com

    - List Extensibility
        o A framework has been added which can be used to specialize
          and extend specific mailing lists.  If there is a file
          called lists/<yourlist>/extend.py, it is execfile()'d after
          the MailList object is instantiated.  The file should
          contain a function extend() which will be called with the
          MailList instance.  This function can do all sorts of deep
          things, like modify the handler pipeline just for this list,
          or even strip out particular admin GUI elements (see below).

        o All the admin page GUI elements are now separate
          components.  This provides greater flexibility for list
          customization.  Also, each GUI element will be given an
          opportunity to handle admin CGI form data.

          This work was sponsored by Control.com

    - Topic Filters
        o A new feature has been added called "Topic Filters".  A list
          administrator can create topics, which are essentially
          regular expression matches against Subject: and Keyword:
          headers (including such pseudo-headers if they appear in the
          first few lines of the body of a message).

          List members can then `subscribe' to various topics, which
          allows them to filter out any messages that don't match a
          topic, or to filter out any message that does match a
          topic.  This can be useful for high volume lists where not
          everyone will be interested in every message.

          This work was sponsored by Control.com

2.1 alpha 2 (11-Jul-2001)

    - Building
        o mimelib 0.4 is now required.  Get it from
          http://mimelib.sf.net.  If you've installed an earlier
          version of mimelib, you must upgrade.

        o /usr/local/mailman is now the default installation
          directory.  Use configure's --prefix switch to change it
          back to the default (/home/mailman) or any other
          installation directory of your choice.

    - Security
        o Better definition of authentication domains.  The following
          roles have been defined: user, list-admin, list-moderator,
          creator, site-admin.

        o There is now a separate role of "list moderator", which has
          access to the pending requests (admindb) page, but not the
          list configuration pages.

        o Subscription confirmations can now be performed via email or
          via URL.  When a subscription is received, a unique (sha)
          confirm URL is generated in the confirmation message.
          Simply visiting this URL completes the subscription process.

        o In a similar manner, removal requests (via web or email
          command) no longer require the password.  If the correct
          password is given, the removal is performed immediately.  If
          no password is given, then a confirmation message is
          generated.

    - Internationalization
        o More I18N patches.  The basic infrastructure should now be
          working correctly.  Spanish templates and catalogs are
          included, and English, French, Hungarian, and Big5 templates
          are included.

        o Cascading specializations and internationalization of
          templates.  Templates are now search for in the following
          order: list-specific location, domain-specific location,
          site-wide location, global defaults.  Each search location
          is further qualified by the language being displayed.  This
          means that you only need to change the templates that are
          different from the global defaults.

          Templates renamed: admlogin.txt => admlogin.html
          Templates added: private.html

    - Web UI
        o Redesigned the user options page.  It now sits behind an
          authentication so user options cannot be viewed without the
          proper password.  The other advantage is that the user's
          password need not be entered on the options page to
          unsubscribe or change option values.  The login screen also
          provides for password mail-back, and unsubscription w/
          confirmation.

          Other new features accessible from the user options page
          include: ability to change email address (with confirmation)
          both per-list and globally for all list on virtual domain;
          global membership password changing; global mail delivery
          disable/enable; ability to suppress password reminders both
          per-list and globally; logout button.

          [Note: the handle_opts cgi has gone away]

        o Color schemes for non-template based web pages can be defined
          via mm_cfg.

        o Redesign of the membership management page.  The page is now
          split into three subcategories (Membership List, Mass
          Subscription, and Mass Removal).  The Membership List
          subcategory now supports searching for member addresses by
          regular expression, and if necessary, it groups member
          addresses first alphabetically, and then by chunks.

          Mass Subscription and Mass Removal now support file upload,
          with one address per line.

        o Hyperlinks from the logos in the footers have been removed.
          The sponsors got too much "unsubscribe me!" spam from
          desperate user of Mailman at other sites.

        o New buttons on the digest admin page to send a digest
          immediately (if it's non-empty), to start a new digest
          volume with the next digest, and to select the interval with
          which to automatically start a new digest volume (yearly,
          monthly, quarterly, weekly, daily).

          DEFAULT_DIGEST_VOLUME_FREQUENCY is a new configuration
          variable, initially set to give a new digest volume monthly.

        o Through-the-web list creation and removal, using a separate
          site-wide authentication role called the "list creator and
          destroyer" or simply "list creator".  If the configuration
          variable OWNERS_CAN_DELETE_THEIR_OWN_LISTS is set to 1 (by
          default, it's 0), then list admins can delete their own
          lists.

          This feature requires an adaptor for the particular MTA
          you're using.  An adaptor for Postfix is included, as is a
          dumb adaptor that just emails mailman@yoursite with the
          necessary Sendmail style /etc/alias file changes.  Some MTAs
          like Exim can be configured to automatically recognize new
          lists.  The adaptor is selected via the MTA option in
          mm_cfg.py

    - Email UI
        o In email commands, "join" is a synonym for
          "subscribe". "remove" and "leave" are synonyms for
          "unsubscribe".  New robot addresses are support to make
          subscribing and unsubscribing much easier:

          mylist-join@mysite
          mylist-leave@mysite

        o Confirmation messages have a shortened Subject: header,
          containing just the word "confirm" and the confirmation
          cookie.  This should help for MUAs that like to wrap long
          Subject: lines, messing up confirmation.

        o Mailman now recognizes an Urgent: header, which, if it
          contains the list moderator or list administrator password,
          forces the message to be delivered immediately to all
          members (i.e. both regular and digest members).  The message
          is also placed in the digest.  If the password is incorrect,
          the message will be bounced back to the sender.

    - Performance
        o Refinements to the new qrunner subsystem which preserves
          FIFO order of messages.

        o The qrunner is no longer started from cron.  It is started
          by a Un*x init-style script called bin/mailmanctl (see
          below).  cron/qrunner has been removed.

    - Command line scripts
        o bin/mailmanctl script added, which is used to start, stop,
          and restart the qrunner daemon.

        o bin/qrunner script added which allows a single sub-qrunner
          to run once through its processing loop.

        o bin/change_pw script added (eases mass changing of list
          passwords).

        o bin/update grows a -f switch to force an update.

        o bin/newlang renamed to bin/addlang; bin/rmlang removed.

        o bin/mmsitepass has grown a -c option to set the list
          creator's password.  The site-wide `create' web page is
          linked to from the admin overview page.

        o bin/newlist's -o option is removed.  This script also grows
          a way of spelling the creation of a list in a specific
          virtual domain.

        o The `auto' script has been removed.

        o bin/dumpdb has grown -m/--marshal and -p/--pickle options.

        o bin/list_admins can be used to print the owners of a mailing list.

        o bin/genaliases regenerates from scratch the aliases and
          aliases.db file for the Postfix MTA.

    - Archiver
        o New archiver date clobbering option, which allows dates to
          only be clobber if they are outrageously out-of-date
          (default setting is 15 days on either side of received
          timestamp).  New configuration variables:

          ARCHIVER_CLOBBER_DATE_POLICY
          ARCHIVER_ALLOWABLE_SANE_DATE_SKEW

          The archived copy of messages grows an X-List-Received-Date:
          header indicating the time the message was received by
          Mailman.

        o PRIVATE_ARCHIVE_URL configuration variable is removed (this
          can be calculated on the fly, and removing it actually makes
          site configuration easier).

    - Miscellaneous
        o Several new README's have been added.

        o Most syslog entries for the qrunner have been redirected to
          logs/error.

        o On SIGHUP, qrunner will re-open all its log files and
          restart all child processes.  See "bin/mailmanctl restart".

    - Patches and bug fixes
        o SF patches and bug fixes applied: 420396, 424389, 227694,
          426002, 401372 (partial), 401452.

        o Fixes in 2.0.5 ported forward:
            Fix a lock stagnation problem that can result when the
            user hits the `stop' button on their browser during a
            write operation that can take a long time (e.g. hitting
            the membership management admin page).

        o Fixes in 2.0.4 ported forward:
            Python 2.1 compatibility release.  There were a few
            questionable constructs and uses of deprecated modules
            that caused annoying warnings when used with Python 2.1.
            This release quiets those warnings.

        o Fixes in 2.0.3 ported forward:
            Bug fix release.  There was a small typo in 2.0.2 in
            ListAdmin.py for approving an already subscribed member
            (thanks Thomas!).  Also, an update to the OpenWall
            security workaround (contrib/securelinux_fix.py) was
            included.  Thanks to Marc Merlin.

2.1 alpha 1 (04-Mar-2001)

    - Python 2.0 or newer required.  Also required is `mimelib' a new
      library for handling MIME documents.  This will be bundled in
      future releases, but for now, you must download and install it
      (using Python's distutils) from

      http://barry.wooz.org/software/Code/mimelib-0.2.tar.gz

      You need mimelib 0.2 or better.

    - Redesigned qrunner subsystem.  Now there are multiple message
      queues, and considerable flexibility in file formats for
      integration with external systems.  The current crop of queues
      include:

      archive -- for posting messages to an archiver
      commands -- for incoming email commands and bounces
      in -- for list-destined incoming email
      news -- for messages outgoing to a nntp server
      out -- for messages outgoing to a smtp server
      shunt -- for messages that trigger unexpected exceptions in Mailman
      virgin -- for messages that are generated by Mailman

      cron/qrunner is now a long running script that forks off
      sub-runners for each of the above queues.  qrunner still plays
      nice with cron, but it is expected to be started by init at some
      point in the future.  Some support exists for parallel
      processing of messages in the queues.

    - Support for internationalization support merged in.  Original
      work done by Juan Carlos Rey Anaya and Victoriano Giralt.  I've
      tested about 90% of the web side, 50% of the email, and 50% of
      the command line / cron scripts.

      New scripts: bin/newlang, bin/rmlang

    - New delivery script `auto' for automatic integration with the
      Postfix MTA.

    - A bunch of new bounce detectors.

    Changes ported from Mailman 2.0.2 and 2.0.1:

    - A fix for a potential privacy exploit where a clever list
      administrator could gain access to user passwords.  This doesn't
      allow them to do much more harm to the user then they normally
      could, but they still shouldn't have access to the passwords.

    - In the admindb page, don't complain when approving a
      subscription of someone who's already on the list (SF bug
      #222409 - Thomas Wouters).

      Also, quote for HTML the Subject: text printed for held
      messages, otherwise messages with e.g. "Subject: </table>" could
      royally screw page formatting.

    - Docstring fix bin/newlist to remove mention of "immediate"
      argument (Thomas Wouters).

    - Fix for bin/update when PREFIX != VAR_PREFIX (SF bug #229794 --
      Thomas Wouters).

    - Bug fix release, namely fixes a buglet in bin/withlist affecting
      the -l and -r flags; also a problem that can cause qrunner to
      stop processing mail after disk-full events (SourceForge bug
      127199).

2.0 final (21-Nov-2000)

    No changes from rc3.

2.0 release candidate 3 (16-Nov-2000)

    - By popular demand, Reply-To: munging policy is now to always
      override any Reply-To: header in the original message, if
      reply_goes_to_list is set to "This list" or "Explicit Address"

    - bin/newlist given -q/--quiet flag instead of the <immediate>
      positional argument

    - Hopefully last fix to DEFAULT_URL not ending in a slash
      sensitivity

    - 2.0rc2 buglets fixed:
        o newlist argument parsing
        o updating with unlocked lists
        o HyperArch.py traceback when there's no
          Content-Transfer-Encoding: header

    - SourceForge bugs fixed:
        122358 (qmail-to-mailman.py listname case folding)

    - SourceForge patches applied:
        102373 (qmail-to-mailman.py listname case folding)

2.0 release candidate 2 (10-Nov-2000)

    - Documentation updates: start in the doc/ directory.

    - bin/withlist accepts additional command line arguments when used
      with the --run flag; bin/mmsitepass and bin/newlist accept
      -h/--help flags

    - bin/newlist has a -o/--output flag to append /etc/aliases
      suggestions to a specified file

    - SourceForge bugs fixed:
        116615 (README.BSD update), 117015 (duplicate messages on
        moderated posts), 117548 (exception in HyperArch.py), 117682
        (typos), 121185 (vsnprintf signature), 121591 and 122017
        (bogus link after web unsubscribe), 121811 (`subscribe' in
        Subject: doesn't get archived)

    - SourceForge patches applied:
        101812 (securelinux_fix.py contrib), 102097 (fix for bug
        117548), 102211 (additional args for withlist), 102268 (case
        insensitive Content-Transfer-Encoding:)

2.0 release candidate 1 (23-Oct-2000)

    - Bug fixes and security patches.

    - Better html rendition of articles in non us-ascii charsets
      (Jeremy Hylton).  See VERBATIM_ENCODING variable in
      Defaults.py.in for customization.

2.0 beta 6 (22-Sep-2000)

    - Building
        o Tested with Python 1.5.2, Python 1.6, and Python 2.0 beta 1.
          Conducted on RH Linux 6.1 only, but should work
          cross-platform.

        o Configure now accepts --with-username, --with-groupname,
          --with-var-prefix flags.  See `configure --help' or the
          INSTALL file for details.

        o Setting the CFLAGS environment variable before invoking
          configure now works.

        o The icons are now copied into $prefix/icons at install time.
          Patch by David Champion.

    - Standards
        o Compliance with RFC 2369 (List-*: headers).  Patch by
          Darrell Fuhriman.  List-ID: header is kept for historical
          reasons.

        o Fixes by Jeremy Hylton to Pipermail in support of non-ASCII
          charsets, based on the Content-Type: and encoded-words in
          the original message.  Mail headers are now decoded as per
          RFC 2047.

        o Many more bounce formats are detected: Microsoft's SMTPSVC,
          Compuserve, GroupWise, SMTP32, and the more generic
          SimpleMatch (which catches lots of similar but slightly
          different formats).

    - Defaults
        o Email addresses can now be obscured in Pipermail archives by
          setting mm_cfg.ARCHIVER_OBSCURES_EMAILADDRS to 1 (obscuring
          is turned off by default).  Patch provided by Chris Snell.

        o The default NNTP host can now be set by editing
          mm_cfg.DEFAULT_NNTP_HOST.  Patch by David Champion.

        o The default archiving mode (public/private) can now be set
          by editing mm_cfg.DEFAULT_ARCHIVE.  Patch by Ted Cabeen.

    - Web UI
        o The variable details pages in the administrators interface
          is now `live', i.e. there's a submit button on the details
          page.

        o A link to the administrative interface is placed in the
          footer of the general user pages (authentication still
          required, of course!)

        o The user options change results page has a link back to the
          user's main page.

        o In the admindb page (for dealing with held postings), the
          default forward address is now listname-owner instead of
          listname-admin.  This avoids bounce detection on the
          forwarded message.

    - Miscellaneous
        o Fixed config.db corruption problem when disk-full errors are
          encountered.

        o Command line scripts accept list names case-insensitively.

        o bin/remove_members takes a -a flag to remove all members of
          a list in one fell swoop.

        o List admin passwords must be non-empty.

        o Mailman generated passwords are slightly more mnemonic, and
          shouldn't have confusing character selections (i.e. `i'
          only, but no `1' or `l').

        o Crossposting to two gated mailing lists should be fixed.

        o Many other bug fixes and minor web UI improvements.

2.0 beta 5 (01-Aug-2000)

    - Bug fix release.  This includes a fix for a small security hole
      which could be exploited to gain mailman group access by a local
      user (not a mail or web user).

    - As part of the fix for the "cookie reauthorization" bug, only
      session cookies are used now.  This means that administrative
      and private archive cookies expire only when the browser session
      is quit, however an explicit "Logout" button has been added.

2.0 beta 4 (06-Jul-2000)

    - Bug fix release.

2.0 beta 3 (29-Jun-2000)

    - Delivery mechanism (qrunner) refined to support immediate
      queuing, queuing directly from MTA, and queuing on any error
      along the delivery pipeline.  This means 1) that huge lists
      can't time out the MTA's program delivery channel; 2) it is much
      harder to completely lose messages; 3) eventually, qrunner will
      be elaborated to meter delivery to the MTA so as not to swamp
      it.  The tradeoff is in more disk I/O since every message coming
      into the system (and most that are generated by the system) live
      on disk for some part of their journey through Mailman.

      For now, see the Default.py variables QRUNNER_PROCESS_LIFETIME
      and QRUNNER_MAX_MESSAGES for primitive resource management.

      The API to the pipeline handler modules has changed.  See
      Mailman/Handlers/HandlerAPI.py for details.

    - Revamped admindb web page: held messages are split into headers
      and bodies so they are easier to vette; admins can now also
      preserve a held message (for spam evidence gathering) or forward
      the message to a specified email address; disposition of held
      messages can be deferred; held messages have a more context
      meaningful default rejection message.

    - Change to the semantics for `acceptable_aliases' list
      configuration variable, based on suggestions by Harald Meland.

    - New mm_cfg.py variables NNTP_USERNAME and NNTP_PASSWORD can be
      set on a site-wide basis if connection to your nntpd requires
      authentication.

    - The list attribute `num_spawns' has been removed.  The mm_cfg.py
      variables MAX_SPAWNS, and DEFAULT_NUM_SPAWNS removed too.

    - LIST_LOCK_LIFETIME cranked to 5 hours and LIST_LOCK_TIMEOUT
      shortened to 10 seconds.  QRUNNER_LOCK_LIFETIME cranked up to 10
      hours.  This should decrease the changes for bogus and harmful
      lock breaking.

    - Resent-to: is now one of the headers checked for explicit
      destinations.

    - Tons more bounce formats are recognized.  The API to the bounce
      modules has changed.

    - A rewritten LockFile module which should fix most (hopefully all)
      bugs in the locking machinery.  Many improvements suggested by
      Thomas Wouters and Harald Meland.

    - Experimental support (disabled by default) for delivering SMTP
      chunks to the MTA via multiple threads.  Your Python executable
      must have been compiled with thread support enabled, and you
      must set MAX_DELIVERY_THREADS in mm_cfg.py.  Note that this may
      not improve your overall system performance.

    - Some changes and additions to scripts: bin/find_member now
      supports a -w/--owner flag to match regexps against mailing list
      owners; bin/find_member now supports multiple regexps;
      cron/gate_news command line option changes; new script
      bin/dumbdb for debugging purposes; bin/clone_member can now also
      remove the old address and change change the list owner
      addresses.

    - The News/Mail gateway admin page has a button that lets you do
      an explicit catchup of the newsgroup.

    - The CVS repository has been moved out to SourceForge.  For more
      information, see the project summary at

      http://sourceforge.net/project/?group_id=103

    - Lots 'o bug fixes and some performance improvements.

2.0 beta 2 (07-Apr-2000)

    - Rewritten gate_news cron script which should be more efficient
      and avoid race and locking problems.  Each list now maintains
      its own watermark, and when you use the admin CGI script to turn
      on gating from Usenet->mail, an automatic mass catch up is done
      to avoid flooding the mailing list.  cron/gate_news's command
      line interface has also changed.  See its docstring for
      details.

    - A new cron script called qrunner has been added to retry message
      deliveries that fail because of temporary smtpd problems.

    - New command line script called bin/list_lists which does exactly
      that: lists all the mailing lists on the system (much like the
      listinfo CGI does).

    - bin/withlist is now directly executable, however if you want to
      use python -i, you must still explicitly invoke it.
      bin/withlist also now cleans up after itself by unlocking any
      locked lists.  It does NOT save any dirty lists though - you
      must do this explicitly.

    - $prefix permissions (and all subdirs) must now be 02775.
      bin/check_perms has been updated to fix all the subdir
      permissions.

    - "make update" (a.k.a. bin/update) is run automatically when you
      do a "make install"

    - The CGI driver script now puts information about the Python
      environment into the logs/error file (but not the diagnostic web
      page).

    - Bug fixes and some performance improvements

2.0 beta 1 (19-Mar-2000)

    - Python 1.5.2 (or newer) is now required.

    - A new bundled auto-responder has been added.  You can now
      configure an autoresponse text for each list's primary
      addresses:

        listname@yourhost.com -- the general posting address
        listname-request@...  -- the automated "request bot" address
        listname-admin@...    -- the human administrator address

    - The standard UI now includes three logos at the bottom of the
      page: Dragon's Mailman logo, the Python Powered logo, and the
      GNU logo.  All point to their respective home pages.

    - It is now possible to set the Reply-To: field on lists to an
      arbitrary address.  NOTE: Reply-To: munging is generally
      considered harmful!  However for some read-only lists, it is
      useful to direct replies to a parallel discussion list.

    - There is a new message delivery architecture which uses a
      pipeline processor for incoming and internally generated
      messages.  Mailman no longer contains a bundled bulk-mailer;
      instead message delivery is handled completely by the MTA.  Most
      MTAs give a high enough priority to connections from the
      localhost that mail will not be lost because of system load, but
      this is not guaranteed (or handled) by Mailman currently.  Be
      careful also if your smtpd is on a different host than the
      Mailman host.  In practice, mail lossage has not be observed.

      For this reason cron/run_queue is no longer needed (see the
      UPGRADING file for details).

      Also, you can choose whether you want direct smtp delivery, or
      delivery via the command line to a sendmail-compatible daemon.
      You can also easily add your own delivery module.  See
      Mailman/Defaults.py for details.

    - A similar pipeline architecture for the parsing of bounce
      messages has been added.  Most common bounce formats are now
      handled, including Qmail, Postfix, and DSN.  It is now much
      easier to add new bounce detectors.

    - The approval pending architecture has also been revamped.
      Subscription requests and message posts waiting for admin
      approval are no longer kept in the config.db file, but in a
      separate requests.db file instead.

    - Finally made consistent the use of Sender:/From:/From_ in the
      matching of headers for such things as member-post-only.  Now,
      if USE_ENVELOPE_SENDER is true, Sender: will always be chosen
      over From:, however the default has been changed to
      USE_ENVELOPE_SENDER false so that From: is always chosen over
      Sender:.  In both cases, if no header is found, From_ (i.e. the
      envelope sender is used).  Note that the variable is now
      misnamed!  Most people want From: matching anyway and any are
      easily spoofable.

    - New scripts bin/move_list, bin/config_list

    - cron/upvolumes_yearly, cron/upvolumes_monthly, cron/archive,
      cron/run_queue all removed.  Edit your crontab if you used these
      scripts.  Other scripts removed: contact_transport, deliver,
      dumb_deliver.

    - Several web UI improvements, especially in the admin page.

    - Remove X-pmrqc: headers to prevent return reciepts for Pegasus
      mail users.

    - Security patch when using external archivers.

    - Honor "X-Archive: No" header by not putting this message in the
      archive.

    - Changes to the log file format.

    - The usual bug fixes.

1.1 (05-Nov-1999)

    - All GIFs removed.  See http://www.gnu.org/philosophy/gif.html
      for the reason why.

    - Improvements to the Pipermail archiver which make things faster.
      Primary change is that the .txt files are not gzipped on every
      posted message.  Instead, use the new cron script `nightly_gzip'
      to gzip the .txt file in batches (this means that the .txt file
      will lag behind the on-line archives a little).

    - From the C drivers programs, Python is invoked with the -S
      option.  This tells Python to avoid importing the site module,
      which can improve start up time of the Python process
      considerably.  Note that the command line script invocation has
      not been changed.

    - New configuration variables PUBLIC_EXTERNAL_ARCHIVER and
      PRIVATE_EXTERNAL_ARCHIVER which can contain a shell command
      string for os.popen().  This can be used to invoke an external
      archiver instead of the bundled Pipermail archiver.  See
      Defaults.py for details.

    - new script `bin/find_member' which can be used to search for a
      member by regular expression.

    - More child processes are reaped, which should eliminate most
      occurrences of zombie processes.

    - A few small miscellaneous bug fixes (including PR#99, PR#107)
      and improvements to the file locking algorithms.

1.0 (30-Jul-1999)

    - Configure script now allows $PREFIX (by default /home/mailman)
      to be permissions 02755.  Also, configure now tests for
      vsnprintf()

    - Workaround, taken from GNU screen, for systems missing
      vsnprintf()

    - Return-Receipt-To: and Disposition-Notification-To: headers are
      always removed from posted messages (they can be used to troll
      for list membership).

    - Workaround for MSIE4.01 (and possibly other versions) bug in the
      handling of cookies.

    - A small collection of other bug fixes.

1.0rc3 (10-Jul-1999)

    - new script bin/check_perms which checks (and optionally fixes)
      the permissions and group ownerships of the files in your
      Mailman installation.

    - Removed a bottleneck in the archiving code that was causing
      performance problems on highly loaded servers.

    - The code that saves a list's state and configuration database
      has been made more robust.

    - Additional exception handlers have been added in several places
      to alleviate problems with Mailman bombing out when it really
      would be better to print/log a helpful message.

    - The "password" mail command will now mail back the sender's
      subscription password when given with no arguments.

    - The embarrassing subject-prefixing bug present in rc2 has been
      fixed.

    - A small (but nice :) collection of other squashed bugs.

1.0rc2 (14-Jun-1999)

    - A security flaw in the CGI cookie mechanisms was discovered --
      the Mailman-issued cookies were easily spoofable, implying that
      e.g. admin access to all Mailman lists via the web interface
      could be compromised.  This flaw has now been fixed.

    - Handling of SMTP errors has been improved.

    - Both "Mass Subscription" via web admin interface and
      bin/add_members have been greatly sped up.

    - autoconf check for syslog has been revamped, and is now verified
      to work on SCO OpenServer 5.  If syslog can't be found, the C
      wrappers will compile, but without any syslog calls.

    - Various other bug fixes.

1.0rc1 (04-May-1999)

    - There is a new Mailman logo, contributed by The Dragon De
      Monsyne.  Please read the INSTALL file for information about
      installing the logo in a place your Web server can find it.

    - USE_ENVELOPE_SENDER is now set to 0 by default.  Turning this on
      caused problems for too many users; lists restricted to
      member-only posts were not matching the addresses correctly.

    - A revamped bin/withlist to be a little more useful.

    - A revamped cron/mailpasswds which groups users by virtual hosts.

    - The usual assortment of bug fixes.

1.0b11 (03-Apr-1999)

    - Bug fixes and improvements for case preservation of subscribed
      addresses.  The DATA_FILE_VERSION has been bumped to 14.

    - New script bin/withlist, useful for interactive debugging.

1.0b10 (26-Mar-1999)

    - New script bin/sync_members which can be used to synchronize a
      list's membership against a flat (e.g. sendmail :include: style)
      file.

    - bin/add_members and bin/remove_members now accept addresses on
      the command line with `-' as the value for the -d and -n
      options.

    - Added variable USE_ENVELOPE_SENDER to Defaults.py for site-wide
      configuration of address matching scheme.  With this variable
      set to true, the envelope sender (e.g. Unix "From_" header) is
      used to match addresses, otherwise the From: header is used.
      Envelope sender matching seems not to work on many systems.
      This variable is currently defaulted to 1, but may change to 0
      for the final release.

    - Reorganization of the membership management admin page.  Also
      member addresses are linked to their options page.  Only the
      `General' category has the admin password change form.

    - Major reorganization of email command handling and responses.
      `notmetoo' is the preferred email command instead of `norcv',
      although the latter is still accepted as an argument.  If more
      than 5 errors are found in the message, command processing is
      halted.

    - User options page now shows the user their case-preserved
      subscribed address as well.

    - The usual assortment of bug fixes.

1.0b9 (01-Mar-1999)

    - New bin scripts: clone_member, list_members, add_members (a
      consolidation of convertlist and populate_new_list which have
      been removed).

    - Two new readmes have been added: README.LINUX and README.QMAIL

    - New configure option --with-cgi-ext which can be used if your
      Web server requires extensions on CGI scripts.  The extension
      must include a dot (e.g. --with-cgi-ext=".cgi").

    - Many bug fixes, including the setgid problem that was causing
      mail to be lost on some versions of Linux.

1.0b8 (14-Jan-1999)

     - Bug fixes and workarounds for certain Linuxes.

     - Illegal addresses are no longer allowed to be subscribed, from
       any interface.

1.0b7 (31-Dec-1998)

     - Many, many bug fixes.  Some performance improvements for large
       lists.  Some improvements in the Web interfaces.  Some security
       improvements.  Improved compatibility with Python 1.5.

     - bin/convert_list and bin/populate_new_list have been replaced
       by bin/add_members.

     - Admins can now get notification on subscriptions and
       unsubscriptions.  Posts are now logged.

     - The username portion of email addresses are now case-preserved
       for delivery purposes.  All other address comparisions are
       case-insensitive.

     - New default SMTP_MAX_RCPTS that limits the number of "RCPT TO"
       SMTP commands that can be given for a single message.  Most
       MTAs have some hard limit.

     - "Precedence: bulk" header and "List-id:" header are now added
       to all outgoing messages.  The latter is not added if the
       message already has a "List-id:" header.  See RFC 2046 and
       draft-chandhok-listid-02 for details.

     - The standard (as of Python 1.5.2) smtplib.py is now used.

     - The install process now compiles all the .py files in the
       installation.

     - Versions of the Mailman papers given at IPC7 and LISA-98 are
       now included.

1.0b6 (07-Nov-1998)

     - Archiving is (finally) back in.

     - Administrivia filter added.

     - Mail queue mechanism revamped with better concurrency control.

     - For recipients that have estmp MTAs, set delivery notification
       status so that only delivery failure notices are sent out,
       inhibiting 4 hour and N day warning notices.

     - Now expire old unconfirmed subscription requests, rather than
       keeping them forever.

     - Added proposed standard List-Id: header, and our own
       X-MailmanVersion header.

     - Prevent havoc from attempts to subscribe a list to itself.  (!)

     - Refine mail command processing to prevent loops.

     - Pending subscription DB redone with better locking and cleaner
       interface.

     - posters functionality expanded.

     - Subscription policy more flexible, sensible, and
       site-configurable.

     - Various and sundry bug fixes.

1.0b5 (27-Jul-1998)

    - New file locking that should be portable and work w/ NFS.

    - Better use of packages.

    - Better error logging and reporting.

    - Less startup overhead.

    - Various and sundry bug fixes.


1.0b4 (03-Jun-1998)

    - A configure script for easy installation (Barry Warsaw)

    - The ability to install Mailman to locations other than
      /home/mailman (Barry Warsaw)

    - Use cookies on the admin pages (also hides admin pages from
      others) (Scott Cotton)

    - Subscription requests send a request for confirmation, which may
      be done by simply replying to the message (Scott Cotton)

    - Facilities for gating mail to a newsgroup, and for gating a
      newsgroup to a mailing list (John Viega)

    - Contact the SMTP port instead of calling sendmail (primarily for
      portability) (John Viega)

    - Changed all links on web pages to relative links where appropriate.
      (John Viega)

    - Use MD5 if crypt is not available (John Viega)

    - Lots of fixing up of bounce handling (Ken Manheimer)

    - General UI polishing (Ken Manheimer)

    - mm_html: Make it prominent when the user's delivery is disabled
      on his option page. (Ken Manheimer)

    - mallist:DeleteMember() Delete the option setings if any. (Ken
      Manheimer)

1.0b3 (03-May-1998)

    - mm_message:Deliverer.DeliverToList() added missing newline
      between the headers and message body.  Without it, any sequence
      of initial body lines that _looked_ like headers ("Sir: Please
      excuse my impertinence, but") got treated like headers.

    - Fixed typo which broke subscription acknowledgement message
      (thanks to janne sinkonen for pointing this out promptly after
      release).  (Anyone who applied my intermediate patch will
      probably see this one trigger patch'es reversed-patch
      detector...)

    - Fixed cgi-wrapper.c so it doesn't segfault when invoked with
      improper uid or gid, and generally wrappers are cleaned up a
      bit.

    - Prevented delivery-failure notices for misdirected subscribe-
      confirmation requests from bouncing back to the -request addr,
      and then being treated as failing requests.

      Implemented two measures.  Set the reply-to for the
      confirmation- request to the -request addr, and the sender to be
      the list admin.  This way, bounces go to list admin instead of
      to -request addr.  (Using the errors-to header wasn't
      sufficient.  Thanks, barry, for pointing out the use of sender
      here.)  Second, ignore any mailcommands coming from postmaster
      or non-login system type accounts (mailer-daemon, daemon,
      postoffice, etc.)

    - Reenabled admin setting of web_page_url - crucial for having
      lists use alternate names of a host that occupies multiple
      addresses.

    - Fixed and refined admin-options help mechanism.  Top-level visit
      to general-category (where the "general" isn't in the URL) was
      broken.  New help presentation shows the same row that shows on
      the actual options page.

    - cron/crontab.in crontab template had wrong name for senddigests.

    - Default digest format setting, as distributed, is now non-MIME,
      on urging of reasoned voices asserting that there are still
      enough bad MIME implementations in the world to be a nuisance to
      too many users if MIME is the default.  Sigh.

    - MIME digests now preserve the structure of MIME postings,
      keeping attachments as attachments, etc.  They also are more
      structured in general.

    - Added README instructions explaining how to determine the right
      UID and GID settings for the wrapper executables, and improved
      some of the explanations about exploratory interaction
      w/mailman.

    - Removed the constraint that subscribers have their domain
      included in a static list in the code.  We might want to
      eventually reincorporate the check for the sake of a warning
      message, to give a heads up to the subscriber, but try delivery
      anyway...

    - Added missing titles to error docs.

    - Improved several help details, including particularly explaining
      better how real_name setting is used.

    - Strengthened admonition against setting reply_goes_to_list.

    - Added X-BeenThere header to postings for the sake of prevention
      of external mail loops.

    - Improved handling of bounced messages to better recognize
      members address, and prevent duplicate attempts to react (which
      could cause superfluous notices to administrator).

    - Added __delitem__ method to mm_message.OutgoingMessage, to fix
      the intermediate patch posted just before this one.

    - Using keyword substitution format for more message text (ie,
      "substituting %(such)s into text" % {'such': "something"}) to
      make the substitutions less fragile and, presumably, easier to
      debug.

    - Removed hardwired (and failure-prone) /tmp file logging from
      answer.majordomo_mail, and generally spiffed up following janne
      sinkkonen's lead.

1.0b2 (13-Apr-1998)
1.0b1 (09-Apr-1998)

  Web pages much more polished
   - Better organized, text more finely crafted
   - Easier, more refined layout
   - List info and admin interface overviews, enumerate all public lists
     (via, e.g., http://www.python.org/mailman/listinfo - sans the
     specific list)
   - Admin interface broken into sections, with help elaboration for
     complicated configuration options

  Mailing List Archives
   - Integrated with a newer, *much* improved, external pipermail - to be
     found at http://starship.skyport.net/crew/amk/maintained/pipermail.html
   - Private archives protected with mailing list members passwords,
     cookie-fied.

  Spam prevention
   - New spam prevention measures catch most if not all spam without
     operator intervention or general constraints on who can post to
     list:
       require_explicit_destination option imposes hold of any postings
       that do not have the list name in any of the to or cc header
       destination addresses.  This catches the vast majority of random
       spam.
     Other options (forbidden_posters, bounce_matching_headers) provide
     for filtering of known transgressors.
   - Option obscure_addresses (default on) causes mailing list subscriber
     lists on the web to be slightly mangled so they're not directly
     recognizable as email address by web spiders, which might be
     seeking targets for spammers.

  Site configuration arrangement organized - in mailman/mailman/modules:
   - When installing, create a mailman/modules/mm_cfg.py (if there's not
     one already there), using mm_cfg.py.dist as a template.
     mm_default.py contains the distributed defaults, including
     descriptions of the values.  mm_cfg.py does a 'from mm_defaults.py
     import *' to get the distributed defaults.  Include settings in
     mm_cfg.py for any values in mm_defaults.py that need to be
     customized for your site, after the 'from .. import *'.
   See mm_cfg.py.dist for more details.

  Logging
   - Major operations (subscription, admin approval, bounce,
     digestification, cgi script failure tracebacks) logged in files
     using a reliable mechanism
   - Wrapper executables log authentication complaints via syslog

  Wrappers
   - All cgi-script wrapper executables combined in a single source,
     easier to configure.  (Mail and aliases wrappers separate.)

  List structure version migration
   - Provision for automatic update of list structures when moving to a
     new version of the system.  See modules/versions.py.

  Code cleaning
   - Many more module docstrings, __version__ settings, more function
     docstrings.
   - Most unqualified exception catches have been replaced with more
     finely targeted catches, to avoid concealing bugs.
   - Lotsa long lines wrapped (pet peeve:).

  Random details (not complete, sorry):
   - make archival frequency a list option
   - Option for daily digest dispatch, in addition to size threshhold
   - make sure users only get one periodic password notifcation message for
     all the lists they're on (repaired 1.0b1.1 varying-case mistake)
   - Fix rmlist sans-argument bug causing deletion of all lists!
   - doubled generated random passwords to four letters
   - Cleaned lots and lots of notices
   - Lots and lots of html page cleanup, including table-of-contents, etc
   - Admin options sections - don't do the "if so" if the ensuing list
     is empty
   - Prevent list subject-prefix cascade
   - Sources under CVS
   - Various spam filters - implicit-destination, header-field
   - Adjusted permissions for group access
   - Prevent redundant subscription from redundant vetted requests
   - Instituted centralize, robustish logging
   - Wrapper sources use syslog for logging (john viega)
   - Sorting of users done on presentation, not in list.
   - Edit options - give an error for non-existent users, not an options page.
   - Bounce handling - offer 'disable' option, instead of remove, and
     never remove without notifying admin
   - Moved subscribers off of listinfo (and made private lists visible
     modulo authentication)
   - Parameterize default digest headers and footers and create some
   - Put titles on cgi result pages that do not get titles (all?)
   - Option for immediate admin notifcation via email of pending
     requests, as well as periodic
   - Admin options web-page help
   - Enabled grouped and cascading lists despite implicit-name constraint
   - Changed subscribers list so it has its own script (roster)
   - Welcome pages: http://www.python.org/mailman/{admin,listinfo}/

0.95 (25-Jan-1997)
  - Fixed a bug in sending out digests added when adding disable mime option.
  - Added an option to not notify about bounced posts.
  - Added hook for pre-posting filters.  These could be used to
    auto-strip signatures.  I'm using the feature to auto-strip footers
    that are auto-generated by mail received from another mailing list.

0.94 (22-Jan-1997)
  - Made admin password work ubiquitously in place of a user password.
  - Added an interface for getting / setting user options.
  - Added user option to disable mime digests (digested people only)
  - Added user option to not receive your own posts (nondigested people only)
  - Added user option to ack posts
  - Added user option to disable list delivery to their box.
  - Added web interface to user options
  - Config number of sendmail spawns on a per-list basis
  - Fixed extra space at beginning of each message in digests...
  - Handled comma separated emails in bounce messages...
  - Added a FindUser() function to MailList.  Used it where appropriate.
  - Added mail interface to setting list options.
  - Added name links to the templates options page
  - Added an option so people can hide their names from the subscription list.
  - Added an answer_majordomo_mail script for people switching...

0.93 (18/20-Jan-1997)
  -  When delivering to list, don't call sendmail directly.  Write to a file,
     and then run the new deliver script, which forks and exits in the parent
     immediately to avoid hanging when delivering mail for large lists, so that
     large lists don't spend a lot of time locked.
  -  GetSender() no longer assumes that you don't have an owner-xxx address.
  -  Fixed unsubscribing via mail.
  -  Made subscribe via mail generate a password if you don't supply one.
  -  Added an option to clobber the date in the archives to the date the list
     resent the post, so that the archive doesn't get mail from people sending
      bad dates clumped up at the beginning or end.
  -  Added automatic error message processing as an option.  Currently
     logging to /tmp/bounce.log
  -  Changed archive to take a list as an argument, (the old way was broken)
  -  Remove (ignore) spaces in email addresses
  -  Allow user passwords to be case insensitive.
  -  Removed the cleanup script since it was now redundant.
  -  Fixed archives if there were no archives.
  -  Added a Lock() call to Load() and Create().  This fixes the
     problem of loading then locking.
  -  Removed all occurances of Lock() except for the ones in mailing
     list since creating a list
     now implicitly locks it.
  -  Quote single periods in message text.
  - Made bounce system handle digest users fairly.

0.92 (13/16-Jan-1997)
  -  Added Lock and Unlock methods to list to ensure each operation is atomic
  -  Added a cmd that rms all files of a mailing list (but not the aliases)
  -  Fixed subscribing an unknown user@localhost (confirm this)
  -  Changed the sender to list-admin@... to ensure we avoid mail loops.
  -  check to make sure there are msgs to archive before calling pipermail.
  -  started using this w/ real mailing lists.
  -  Added a cron script that scours the maillog for User/Host unknown errs
  -  Sort membership lists
  -  Always display digest_is_default option
  -  Don't slam the TO list unless you're sending a digest.
  -  When making digest summaries, if missing sender name, use their email.
  -  Hacked in some protection against crappy dates in pipermail.py
  -  Made it so archive/digest volumes can go up monthly for large large lists.
  -  Number digest messages
  -  Add headers/footers to each message in digest for braindead mailers
  -  I removed some forgotten debug statements that caused server errors
         when a CGI script sent mail.
  -  Removed loose_matches flag, since everything used it.
  -  Fixed a problem in pipermail if there was no From line.
  -  In upvolume_ scripts, remove INDEX files as we leave a volume.
  -  Threw a couple of scripts in bin for generating archives from majordomo's
     digest-archives.  I wouldn't recommend them for the layman, though, they
     were meant to do a job quickly, not to be usable.

0.91 (23-Dec-1996)
  -  broke code into mixins for managability
  -  tag parsing instead of lots of gsubs
  -  tweaked pipermail (see comments on pipermail header)
  -  templates are now on a per-list basis as intended.
  -  request over web that your password be emailed to you.
  -  option so that web subscriptions require email confirmation.
  -  wrote a first pass at an admin interface to configurable variables.
  -  made digests mime-compliant.
  -  added a FakeFile class that simulates enough of a file object on a
        string of text to fool rfc822.Message in non-seek mode.
  -  changed OutgoingMessage not to require its args in constructor.
  -  added an admin request DB interface.
  -  clearly separated the internal name from the real name.
  -  replaced lots of ugly, redundant code w/ nice code.
        (added Get...Email() interfaces, GetScriptURL, etc...)
  -  Wrote a lot of pretty html formatting functions / classes.
  -  Fleshed out the newlist command a lot.  It now mails the new list
        admin, and auto-updates the aliases file.
  -  Made multiple owners acceptable.
  -  Non-advertised lists, closed lists, max header length, max msg length
  -  Allowed editing templates from list admin pages.
  -  You can get to your info page from the web even if the list is closed.


Local Variables:
mode: indented-text
indent-tabs-mode: nil
End: