From olk@olk.co.kr Thu Nov 1 20:13:56 2001 From: olk@olk.co.kr (=?ks_c_5601-1987?B?wMzH9r/s?=) Date: Fri, 02 Nov 2001 05:13:56 +0900 Subject: [Mailman-Developers] =?ks_c_5601-1987?B?bWFpbG1hbi1kZXZlbG9wZXJztNQgvsiz58fPvcq0z7HuPw==?= Message-ID: This is a multi-part message in MIME format. ------=_NextPart_000_0057_01C0F02A.93A13C00 Content-Type: text/plain; charset="ks_c_5601-1987" Content-Transfer-Encoding: base64 Ojo6SGFwcHkgbWFpbDo6OiAgCUhhcHB5bWFpbCC51yCx4sW4ILmuwMcgMDItNTg4LTA1MTAJ MjAwMbPiIDEwv/kgICAgCSAgCQkgCQkJCSAJCQ0KCQkgCaLDILDHuMHB9QkJDQoJCSAJotEg uru5rrq4seIJCSAJQSBibG9uZGUgaXMgd2Fsa2luZyBkb3duIHRoZSBzdHJlZXQgd2l0aGhl ciBibG91c2Ugb3BlbiBhbmQgaGVyDQogcmlnaHQgYnJlYXN0IGhhbmdpbmcgb3V0LiANCkEg cG9saWNlbWFuIGFwcHJvYWNoZXMgaGVyIGFuZCBzYXlzLiANCiJNYSdhbSwgDQogYXJlIHlv dSBhd2FyZSB0aGF0IEkgY291bGRhcnJlc3QgeW91IGZvciBpbmRlY2VudCBleHBvc3VyZT8i DQpTaGUgc2F5cywgIldoeSwgb2ZmaWNlcj8iDQoiQmVjYXVzZSB5b3VyIGJyZWFzdCBpcyBo YW5naW5nb3V0LiINClNoZSBsb29rcyBkb3duIGFuZCBzaG91dHMuDQoiT0ggTVkgR09PRE5F U1MhIEkgbGVmdCB0aGUgYmFieSBvbnRoZSBidXMgYWdhaW4hIg0KCQkNCgkJIAmi0SDH2Lyu urix4gkJIAnH0SCx3bnfucyz4LChILrttvO/7L26sKEgyLDCpiC/rbfBIMDWsO0gv8C4pcLK IMGlsKG9v8C7ILnbwLi3ziANCrTZILXlt6+zuyCz9cC6ILvzxcK3ziCx5sC7ILDJvu6wobDt IMDWvvq02S4NCrDmsPzAzCCx17PgwMcgsdnDs7+hIL/NvK0guLvH37TZLg0KIrrOwM4sILO7 sKEgtOe9xcC7ILD6tNkgs+vD4sHLt84gw7zG98fSILz2tbUgwNa02bTCILvnvcfAuyC+y7Dt DQogsOi9xbChv+Q/Ig0Ksdez4LChILTrtOTHz7HmOiAiv9Ygsde3uMHSLCCw5rD8tNQ/Ig0K IrTnvcUgsKG9v8DMILnbv6Egs6q/zSDA1sDdvsa/5D8iDQqx17PgtMIgvsa3obimILq4tPW0 zyDAzLe4sNQgv9zDxrTZOg0KIr7GtM8hIMDMt7K89rChISEgtscgvsax4rimILn2vbq/oSC1 zrDtILO7t8Egufa3yL7uv+QhIgkJDQoJCSAJod4gYnJlYXN0ICC/yrChvb8NCqHeIGFwcHJv YWNoIH6/oSCwobHuwMwgsKG02SANCqHeIGluZGVjZW50ICC59ripvvi0wiwgssMgu+ezqr/u LCC/3LyzKMC9tvUpx9ENCqHeIGV4cG9zdXJlICCz68PiDQoJCSAJICAJCSAJCSIgV2hlcmUg RG9lcyBNeSBIZWFydA0KICBCZWF0IE5vdyANCiAtIFN1bmcgYnkgQ2VsaW5lIERpb24gLSAi CQkJIAkJCSAJCQkJIAkJCQ0KCQkgCaLDIERvbid0IGtub3cgaG93IGxvdmUgY291bGQgbGVh dmUNCiAgICAgV2l0aG91dCBhIHRyYWNlIFdoZXJlIGRvIHNpbGVudCBoZWFydHMgZ28uCQkg CQkxCTIJMwk0CTUJCTYJNwk4CTkJMTAJCQkJCQkgCaLDILvntvvAxyDI58D7tbUgs7Kx4sH2 IL7KwLogw6Qgsde3uLDUILaws68gvPYgwNa0wsH2DQogICAgvssgvPawoSC++L7uv+QuIMDM IMfjxbvH0SC4tsC9wLogvu618LfOILChvt8gx8+zqr/kCQkNCgkJIAm8rbfOwMcgu+e2+8DM IL3Evu4gufa4sCDDpCC09cDMu/Mgx9IguLvAzCC++LTCILvnwMywoSC1yCCwzcDMwdIuDQon c2lsZW50IGhlYXJ0cye29SC52bfOILyttMPHz7DUIL3Evu4gufa4sCwgx+PFu7CouLggs7K+ xiC59riwILvzxcK4piDHpcf2x9EgsM3A1LTPtNkuIA0KJ3dpdGhvdXQgYSB0cmFjZSe0wiCh uLvntvvAxyDI58D7tbUgs7Kx4sH2IL7KsO2hubbztMIgtubAuLfOICdzaWxlbnQgaGVhcnRz J8DHIMDHucy4piANCrT1v+0gsK3BtsfYIMHWsO0gwNa+7r/kLiANCiANCqHeIHdpdGhvdXQg YSB0cmFjZSC+xrmrt7EgyOfA+ywgwNrD67W1IL74wMwNCiAgorlUaGF0IGRvZyBoYXMgZ29u ZSBhd2F5IHdpdGhvdXQgYSB0cmFjZS4gKLHXILCztMIgvsa5q7exIMjnwPu1tSC++MDMILvn tvPBriC59rfItNkuKQkJIAkgIAkJIAkJCQ0KCQkgCaLDIE1heSBJIHRyeSB0aGlzIG9uPwkJ IAkJMQkyCTMJNAk1CQk2CTcJOAk5CTEwCQkJCQkJIAmiwyDH0bn4IMDUvu66wbW1ILXJse6/ 5D8JCQ0KCQkgCaLRILq7ua66uLHiIAkJCSAJCQkgCUE6IFRoaXMgaXMgdGhlIGxhdGVzdCBp biBzd2ltd2Vhci4gDQpCOiBXaGF0IGNvbG9ycyBkbyB5b3UgaGF2ZT8gDQpBOiBCZXNpZGVz IHRoaXMgb25lIGluIGJsYWNrLCB3ZSBoYXZlIHJlZCwgYmx1ZSBhbmQgZ3JlZW4uIA0KQjog Q2FuIEkgdHJ5IHRoaXMgb25lIG9uPw0KCQkNCgkJIAmi0SDH2Lyuurix4iAJCSAJQSA6IMDM sM3AzCC/7LiusKEgsKHB9rDtIMDWtMIgw9a9xSC89r+1urnAzL+hv+QuIA0KQiA6ILv2u/PA uiC+7rayILDUIMDWs6q/5D8NCkEgOiCwy8C6u/bAziDAzLDNILi7sO0gu6GwoyC79iwgxsS2 9bv2LCDDyrfPu/bAzCDA1r7uv+QuIA0KQiA6IMGmsKEgwMywzSDH0SC5+CDA1L7uusG1tSC1 ybHuv+Q/CQkNCgkJIAknv8rAuyDH0SC5+CDA1L7uuri02Se287TCIMelx/bAuiAndHJ5IG9u J8DUtM+02S4gDQondHJ5IHRvJ7TCICez67fCx8+02SfAzLDtICd0cnkgfiBpbmcntMIgJ73D x+i7777GIH7Hz7TZJ7bztMIgtubAzMH2v+QuDQogIA0Kod4gc3dpbXdlYXIgILz2v7W6uSAg ICAgICAgICAgICANCqHeIGJlc2lkZXMgILDUtNmwoSwgsde527+hDQqh3iB0cnkgb24gIH7A uyDH0SC5+CDA1L7uuri02S4JCSAJICAJCSAJCQkJIAkJCQ0KCQkgCaLDINzW4sIJCQ0KCQkg CaLRILq7ua66uLHiCQkgCe+j8ekgOiDfo++jqq+q86OsIPm8KKrKqvMpqs766yiqoqrKKaOs z94oqtspqsOqxqqkquuqzj8gICAgICAgICAgIA0K36PvoyA6IKqiISDvo/Hpqq+q86OsIKqm qsGqztDd5eAoqq2q86ququcpqs6qqtnXKKrPqqspqsqq86rAo64NCu+j8ekgOiCqx6rio6zQ 3eXgKKqtqvOqrqrnKarOqqrZ1yiqz6qrKarLqreqwarjo6yqvarOIPrrKKqiqsopLA0KICAg ICAgICAg094oqqqqqimqraq5qq6q66roo64NCt+j76MgOiDewtuwKKq3qquqvymqyqqkquij rg0KICAgICAgICAgqqaqwarO0N3l4Ciqrarzqq6q5ymqrKOs76Px6aqvqvOqzqvNq7OqzvHp KKrKqqspqsvs/Q0KICAgICAgICAgKKrPqqQpqsOqv6reqt6qwKqrqumjriANCgkJDQoJCSAJ otEgx9i8rrq4seIJCSAJtNmzqrHuIDogvt+4trTZsbosILmrvbwgsbi428C7IMbEsO0gwNa0 zz8gDQq+37i2tNkgOiC+xiEgtNmzqrHusbosIL/suK4gwf0gsd262L7uILmrtP3AzL7fLiAN CrTZs6qx7iA6ILHXxKG4uCwgsd262L7uILmrtP3EobDvLCCx1yCxuLjbLCCzyrmrxam02S4g DQq+37i2tNkgOiC+7sK/ILz2IL74vu4uIL/suK7B/SCx3brYvu6woSCzysjxwf0gsO2+58DM ILnuvNO/oSC16b7uwNawxbXnLgkJDQoJCSAJod4g3Nbiwiiq1aqvqreq5aqmKSAgurm89g0K od4g+usoqqKqyikgILG4uNsNCqHeIM/eKKrbKarrICDGxLTZDQqh3iCqpqrBqs5+ICAgv+y4 rijB/Sl+DQqh3iDQ3eXgKKqtqvOqrqrnKSAgsd262L7uDQqh3iCqqtnXKKrPqqspICC5q7T9 DQqh3iDT3iiqqqqqKaqtqrmqrqrrKKHn096qraqkKSAgs8q5q8WptNkuDQqh3iDewtuwKKq3 qquqvymqyqqkICC+7sK/ILz2IL74tNkuDQqh3iCqzaqzICCw7b7nwMwNCqHeIOz9KKrPqqQp qusgILXpvu6wobTZLg0KCQkgCSAgCQkgCQkJDQoJCSAJosMg0dGqtarzqs8g+vzwqSiqrarn qqaqwKqkKaqsIKqiquqq3qq5qqsJCSAJCTEJMgkzCTQJNQkJNgk3CTgJOQkxMAkJCQkJCSAJ osMgsei+vrTCIMf8waawoSDA1r3AtM+x7j8JCQ0KCQkgCaLRILq7ua66uLHiCQkJIAkJCSAJ 2cr1vSA6INHRqrWq86rPIPr88Kkoqq2q56qmqsCqpCmqrCCqoqrqqt6quaqrLiANCtHRICAg IDogqqiqqKOsIPr8KKqiqsspqsgg7asoqqKqzSmqrCDs6ezRKKrSqsiq6imquqrEIKqiquqq 3qq5LiANCtnK9b0gOiCqqvr8KKrLqqQpqrWq86rPIPm8KKrKqsspqvIgqreqxiCqpKreqrmq qy4NCiDR0SAgICA6IPr8KKqiqsspqs8g3asoqsGqwSmqziD85d7kKKqrqqSqt6rjKarHIKrP qr+q6aqkqsYgqqSq3qq5LgkJDQoJCSAJotEgx9i8rrq4seIJCSAJseK5q7bzIDogsei+vrTC IMf8waawoSDA1r3AtM+x7j8NCrHoICAgICAgOiC/uSwgx/yw+iC0qbOqsKEgx9EguO2+vyDA 1r3AtM+02S4gDQqx4rmrtvMgOiDH/LTUwLoguau++cC7IMfPsO0gwNa9wLTPse4/IA0Ksegg ICAgICA6IMf8wLogvsa59sH2IMi4u+e/obytIMDPx8+w7SDA1r3AtM+02S4gCQkNCgkJIAmh 3iD6/PCpKKqtqueqpqrAqqQpIMf8waah3iCqz6q/qumqryDAz8fPtNkgCQkgCQkJCQ0KCQkg oeuh66Hroeuh66Hroeuh66Hroeuh66Hroeuh66Hroeuh66Hroeuh66Hroeuh66Hroeuh66Hr oeuh66Hroeuh66Hroeuh66Hroeuh66Hroeuh66Hroeuh66HroesNCiBtYWlsbWFuLWRldmVs b3BlcnO01CAgvsiz58fPvLy/5D8gDQogIA0KIMD6yPG0wiAgwPzIrbimIMDMv+vH2LytICCw rbvnv80gMSA6IDEgt84gv9yxub7uIMfQvcDAuyDH0iAgvPYgwNa0wiCixCAgT25saW5lIEtv cmVhIKLFILbzIA0KILDtICDH1bTPtNkuICAgICAgucy4riDH47b0ud7B9iC+yrDtICDG7cH2 ILXlt8Egwcu828fVtM+02S4gICAgILrOtfAgILPKsde3r7/svcUgv+u8rbimLi4uLi4uDQog IA0KIMD6yPEgIMi4u+e/obyttMIgv9yxub7uKL+1vu4swM++7im/oSCw/L3JIMDWtMIgILi5 wLogutC16bKyILjFwM8ov/ktsd0pLCC/tb7uwK+407/NILv9yLC/oQ0KIMfKv+TH0SAgyLjI rSDH0SC5rsDlvr/AuyC5q7fht84gurizuyC15biusO0gwNa+7r/kLg0KICANCiDAp7/NICCw sMC6ILO7v+vAxyC8rbrxvbq4piC53r7Gurix4iC/+MfPvcO46SCh7CAgb2xrQG9say5jby5r ciAgIKHtt84gInllcyK287TCICANCiCzu7/rwMcgtOTA5cC7IMHWvcOx4iC52bb4tM+02S4N CiAgDQogsde4rrDtLCAgwPrI8SDA/MitIL/csbm+7iCwrcDHsKEgscOx3cfPvcUgutC16cC7 ICDAp8fYLCAxyLi/oSDH0cfYvK0gosIgILmrt+EgvcO5/LCtwMcgosK1tQ0KIL3HvcPH2CAg teW4rrDtIMDWwLi0zyDH0bn4ILXpvu66uLDtIL3NwLi9w7jpIMH2sd0gIL3Fw7vH2CDB1ry8 v+QuDQogIA0KILmrt+EgIL3DufywrcDHIL3Fw7sguea5/cC6IKK6ICDAzLD3IKK4IMC7IMWs uK/Hz73FIMjEILCtwMcgvcXDu7b1v6EgIMDWtMIgvcO5/LCtwMcgvcXDuyDG+8C7DQogwNu8 usfPvMW8rSAgurizuyDB1r3DuOkgtcu0z7TZLiAgubC30CwgwPzIrSAwMi01ODgtMDUxMCAg wLi3zrW1IL3Fw7vHz73HILz2IMDWsbi/5C4NCiAgDQogvsa5q8LJt88gIMDMIMfQvcC5/cDM IG1haWxtYW4tZGV2ZWxvcGVyc7TUwMcgyLjIrSC9x7fCIMfiu/O/oSDA28C6ICC6uMXGwMwg tce++sC4uOkgx9W0z7TZLg0KICANCiBtYWlsbWFuLWRldmVsb3BlcnO01LKytMIgIGh0dHA6 Ly93d3cua3IuZ251Lm9yZy9kaXJlY3RvcnkvbWFpbG1hbi5odG1sv6EgwNa0wiDB1rzSuKYg uriw7SC43sDPILXlt8i0wrWlv+QsICC60sfKv+TH0SDBpLq4v7S02bjpIMGkuLsgwcu828fV tM+02S4NCgkguN7AzyAgvPa9xSCwxbrOuKYgv/jHz73DuOkgb2xrQG9say5jby5rciAgt84g W05PXSC287TCILTkwOXAuyDB1r3DuOkgtNm9w7TCICDAzLexILjewM/Auw0KILXluK7B9iAg vsqw2r3AtM+02S4NCiCwqLvnx9W0z7TZLg0KCSAgCSAgICAg ------=_NextPart_000_0057_01C0F02A.93A13C00 Content-Type: text/html; charset="ks_c_5601-1987" Content-Transfer-Encoding: base64 PGh0bWw+PGhlYWQ+DQo8dGl0bGU+Ojo6SGFwcHkgbWFpbDo6OjwvdGl0bGU+DQo8bWV0YSBo dHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1l dWMta3IiPg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCjwhLS0NClRke2ZvbnQtc2l6ZTox MHB0O2ZvbnQtZmFtaWx5OrG8uLIsYXJpYWw7Y29sb3I6YmxhY2s7bGluZS1oZWlnaHQ6IDE1 cHQ7fQ0KLnRpdGxle2ZvbnQtc2l6ZToxMHB0O2ZvbnQtZmFtaWx5OrG8uLIsYXJpYWw7Y29s b3I6IzAwOTlGRjtsaW5lLWhlaWdodDogMTVwdDsgRk9OVC1XRUlHSFQ6IGJvbGQ7fQ0KLnRy YW5ze2ZvbnQtc2l6ZToxMHB0O2ZvbnQtZmFtaWx5OrG8uLIsYXJpYWw7Y29sb3I6IzY2NjY2 NjtsaW5lLWhlaWdodDogMTVwdDsgRk9OVC1XRUlHSFQ6IGJvbGQ7fQ0KLnRyYW5zXzF7Zm9u dC1zaXplOjEwcHQ7Zm9udC1mYW1pbHk6sby4sixhcmlhbDtjb2xvcjojNjY5OUNDO2xpbmUt aGVpZ2h0OiAxNXB0OyBGT05ULVdFSUdIVDogYm9sZDt9DQotLT4NCjwvc3R5bGU+DQoNCjwv aGVhZD4NCg0KPGJvZHk+DQo8dGFibGUgd2lkdGg9IjU1NyIgY2VsbHNwYWNpbmc9IjEiIGNl bGxwYWRkaW5nPSIzIiBhbGlnbj0iY2VudGVyIiBiZ2NvbG9yPSIjRDhEOEM1Ij4NCjx0cj4g DQo8dGQgYmdjb2xvcj0iI0ZGRkZGRiI+DQo8dGFibGUgd2lkdGg9IjU1NyIgYm9yZGVyPSIw IiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGFsaWduPSJjZW50ZXIiPg0KPHRy PiANCjx0ZCBhbGlnbj0icmlnaHQiPg0KPCEtLbO7v+sgvcPA2yDA1LTPtNkuLi4gLS0+DQo8 IS0ts7u/6yC9w8DbIMDUtM+02S4uLiAtLT4NCjx0YWJsZSB3aWR0aD0iNTU3IiBib3JkZXI9 IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYWxpZ249ImNlbnRlciI+DQo8 VFI+DQoJPFREPjxmb250IGNvbG9yPSIjNjY2NjY2Ij5IYXBweW1haWwgudcgseLFuCC5rsDH ICA8Zm9udCBjb2xvcj0iI0NDMzMzMyI+PGI+MDItNTg4LTA1MTA8L2I+PC9mb250PjwvZm9u dD48L1REPg0KCTxURCBhbGlnbj0icmlnaHQiPjxmb250IGNvbG9yPSIjNjY2NjY2Ij4yMDAx s+IgMTC/+SZuYnNwOzwvZm9udD48L1REPg0KPC9UUj4NCjwvVEFCTEU+DQo8L3RkPg0KICAg ICAgICAgICAgICAgICAgICA8dGQ+PC90ZD4NCjwvdHI+DQo8dHI+IA0KPHRkPjxBIEhSRUY9 Imh0dHA6Ly9tYWlsdGltZXMubmV0LyIgdGFyZ2V0PSJfYmxhbmsiPjxpbWcgc3JjPSJodHRw Oi8vbWFpbHRpbWVzLm5ldC9zYW1wbGUvaW1hZ2VzL2htX3RvcDAyXzMuZ2lmIiB3aWR0aD0i NTU3IiBoZWlnaHQ9IjYzIiBib3JkZXI9IjAiPjwvQT48L3RkPg0KICAgICAgICAgICAgICAg ICAgICA8dGQ+PC90ZD4NCjwvdHI+DQoJDQo8IS0tv7W+7rfOIL/0vu6/5C4gvcPA2yDA1LTP tNkuLi4gLS0+DQo8dHI+IA0KPHRkPiANCg0KCTx0YWJsZSB3aWR0aD0iNTU3IiBib3JkZXI9 IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYmdjb2xvcj0iQzFDMUMxIj4N Cgk8dHI+IA0KCTx0ZCB3aWR0aD0iNDkwIj48aW1nIHNyYz0iaHR0cDovL21haWx0aW1lcy5u ZXQvc2FtcGxlL2ltYWdlcy9obV90aXRsZTAxLmdpZiIgd2lkdGg9IjEzMiIgaGVpZ2h0PSIz NSI+PC90ZD4NCgk8dGQgd2lkdGg9IjY3Ij4NCgk8Rk9STSBNRVRIT0Q9UE9TVCBBQ1RJT049 Imh0dHA6Ly9tYWlsdGltZXMubmV0L3NhbXBsZS9hdWRpby5hc3A/bm93ZGF5PTIwMDEtMDkt MTgmdGI9bGVjdHVyZV9laHVtZXImbnVtPTEmY29kZT1hdWRpbyZ0dD0wMCIgdGFyZ2V0PSJh dWRpbyIgbmFtZT0iZWh1bWVyXzEiPg0KCTxpbnB1dCB0eXBlPSJpbWFnZSIgc3JjPSJodHRw Oi8vbWFpbHRpbWVzLm5ldC9zYW1wbGUvaW1hZ2VzL2J1dHRvbl9saXN0ZW4uZ2lmIiB3aWR0 aD0iNTYiIGhlaWdodD0iMTkiIGJvcmRlcj0iMCI+DQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICA8L2Zvcm0+DQo8L3RkPjwvRk9STT4NCgk8L3RyPg0KCTwvdGFibGU+ DQo8aW1nIHNyYz0iaHR0cDovL21haWx0aW1lcy5uZXQvc2FtcGxlL2ltYWdlcy9obV9saW5l LmdpZiIgd2lkdGg9IjU1NyIgaGVpZ2h0PSIxIj48YnI+DQoJPHRhYmxlIHdpZHRoPSIxMDAl IiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSI+DQoJPHRyPiAN Cgk8dGQgY2xhc3M9InRpdGxlIj48Zm9udCBjb2xvcj0iIzAwOTlmZiI+PGI+osMgsMe4wcH1 PC9iPjwvZm9udD48L3RkPg0KCTwvdHI+DQoJPC90YWJsZT4NCjxpbWcgc3JjPSJodHRwOi8v bWFpbHRpbWVzLm5ldC9zYW1wbGUvaW1hZ2VzL2htX2xpbmUuZ2lmIiB3aWR0aD0iNTU3IiBo ZWlnaHQ9IjEiPjxicj4NCgk8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNw YWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI1Ij4NCgk8dHI+IA0KCTx0ZCBjbGFzcz0idHJhbnNf MSI+PGZvbnQgY29sb3I9IiM2Njk5Y2MiPjxiPqLRILq7ua66uLHiPC9iPjwvZm9udD48L3Rk Pg0KCTwvdHI+DQoJPHRyPiANCgk8dGQgY2xhc3M9InRyYW5zIj48cCBjbGFzcz1Nc29Ob3Jt YWwgc3R5bGU9ImxpbmUtaGVpZ2h0OjE1MCU7IG1hcmdpbi10b3A6MDsgbWFyZ2luLWJvdHRv bTowOyI+PGZvbnQgY29sb3I9IiM2NjY2NjYiIHNpemU9IjMiPjxzcGFuIGxhbmc9RU4tVVMg c3R5bGU9ImZvbnQtc2l6ZToxMnB0OyI+QSBibG9uZGUgaXMgd2Fsa2luZyBkb3duIHRoZSBz dHJlZXQgd2l0aA0KaGVyIGJsb3VzZSBvcGVuIGFuZCBoZXI8L3NwYW4+PC9mb250PjwvcD4N Cg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImxpbmUtaGVpZ2h0OjE1MCU7IG1hcmdp bi10b3A6MDsgbWFyZ2luLWJvdHRvbTowOyI+PGZvbnQgY29sb3I9IiM2NjY2NjYiIHNpemU9 IjMiPjxzcGFuIGxhbmc9RU4tVVMgc3R5bGU9ImZvbnQtc2l6ZToxMnB0OyI+IHJpZ2h0IDxm b250IGNvbG9yPSJyZWQiPmJyZWFzdDwvZm9udD4gaGFuZ2luZyBvdXQuIDwvc3Bhbj48L2Zv bnQ+PC9wPg0KPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJsaW5lLWhlaWdodDoxNTAlOyBt YXJnaW4tdG9wOjA7IG1hcmdpbi1ib3R0b206MDsiPjxmb250IGNvbG9yPSIjNjY2NjY2IiBz aXplPSIzIj48c3BhbiBsYW5nPUVOLVVTIHN0eWxlPSJmb250LXNpemU6MTJwdDsiPkEgcG9s aWNlbWFuIDxmb250IGNvbG9yPSJyZWQiPmFwcHJvYWNoZXM8L2ZvbnQ+IGhlciBhbmQgc2F5 cy4gPC9zcGFuPjwvZm9udD48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ibGlu ZS1oZWlnaHQ6MTUwJTsgbWFyZ2luLXRvcDowOyBtYXJnaW4tYm90dG9tOjA7Ij48Zm9udCBj b2xvcj0iIzY2NjY2NiIgc2l6ZT0iMyI+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0iZm9udC1z aXplOjEycHQ7Ij4mcXVvdDtNYSdhbSwgPC9zcGFuPjwvZm9udD48L3A+DQoNCjxwIGNsYXNz PSJNc29Ob3JtYWwiIHN0eWxlPSJsaW5lLWhlaWdodDoxNTAlOyBtYXJnaW4tdG9wOjA7IG1h cmdpbi1ib3R0b206MDsiPjxmb250IGNvbG9yPSIjNjY2NjY2IiBzaXplPSIzIj48c3BhbiBs YW5nPUVOLVVTIHN0eWxlPSJmb250LXNpemU6MTJwdDsiPiZuYnNwO2FyZSB5b3UgYXdhcmUg dGhhdCBJIGNvdWxkDQphcnJlc3QgeW91IGZvciA8Zm9udCBjb2xvcj0icmVkIj5pbmRlY2Vu dCBleHBvc3VyZTwvZm9udD4/JnF1b3Q7PC9zcGFuPjwvZm9udD48L3A+DQo8cCBjbGFzcz1N c29Ob3JtYWwgc3R5bGU9ImxpbmUtaGVpZ2h0OjE1MCU7IG1hcmdpbi10b3A6MDsgbWFyZ2lu LWJvdHRvbTowOyI+PGZvbnQgY29sb3I9IiM2NjY2NjYiIHNpemU9IjMiPjxzcGFuIGxhbmc9 RU4tVVMgc3R5bGU9ImZvbnQtc2l6ZToxMnB0OyI+U2hlIHNheXMsICZxdW90O1doeSwgb2Zm aWNlcj8mcXVvdDs8L3NwYW4+PC9mb250PjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsIHN0 eWxlPSJsaW5lLWhlaWdodDoxNTAlOyBtYXJnaW4tdG9wOjA7IG1hcmdpbi1ib3R0b206MDsi Pjxmb250IGNvbG9yPSIjNjY2NjY2IiBzaXplPSIzIj48c3BhbiBsYW5nPUVOLVVTIHN0eWxl PSJmb250LXNpemU6MTJwdDsiPiZxdW90O0JlY2F1c2UgeW91ciBicmVhc3QgaXMgaGFuZ2lu Zw0Kb3V0LiZxdW90Ozwvc3Bhbj48L2ZvbnQ+PC9wPg0KDQo8cCBjbGFzcz1Nc29Ob3JtYWwg c3R5bGU9ImxpbmUtaGVpZ2h0OjE1MCU7IG1hcmdpbi10b3A6MDsgbWFyZ2luLWJvdHRvbTow OyI+PGZvbnQgY29sb3I9IiM2NjY2NjYiIHNpemU9IjMiPjxzcGFuIGxhbmc9RU4tVVMgc3R5 bGU9ImZvbnQtc2l6ZToxMnB0OyI+U2hlIGxvb2tzIGRvd24gYW5kIHNob3V0cy48L3NwYW4+ PC9mb250PjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSJsaW5lLWhlaWdodDox NTAlOyBtYXJnaW4tdG9wOjA7IG1hcmdpbi1ib3R0b206MDsiPjxmb250IGNvbG9yPSIjNjY2 NjY2IiBzaXplPSIzIj48c3BhbiBsYW5nPUVOLVVTIHN0eWxlPSJmb250LXNpemU6MTJwdDsi PiZxdW90O09IIE1ZIEdPT0RORVNTISBJIGxlZnQgdGhlIGJhYnkgb24NCnRoZSBidXMgYWdh aW4hJnF1b3Q7PC9zcGFuPjwvZm9udD48L3A+PC90ZD4NCgk8L3RyPg0KCTwvdGFibGU+DQo8 aW1nIHNyYz0iaHR0cDovL21haWx0aW1lcy5uZXQvc2FtcGxlL2ltYWdlcy9obV9saW5lLmdp ZiIgd2lkdGg9IjU1NyIgaGVpZ2h0PSIxIj48YnI+DQoJPHRhYmxlIHdpZHRoPSIxMDAlIiBi b3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSI+DQoJPHRyPiANCgk8 dGQgY2xhc3M9InRyYW5zXzEiPjxmb250IGNvbG9yPSIjNjY5OWNjIj48Yj6i0SDH2Lyuurix 4jwvYj48L2ZvbnQ+PC90ZD4NCgk8L3RyPg0KCTx0cj4gDQoJPHRkIGNsYXNzPSJ0cmFucyI+ PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImxpbmUtaGVpZ2h0OjE1MCU7IG1hcmdpbi10 b3A6MDsgbWFyZ2luLWJvdHRvbTowOyI+PGZvbnQgY29sb3I9IiM2NjY2NjYiPjxzcGFuIHN0 eWxlPSJmb250LXNpemU6MTJwdDsiPsfRILHdud+5zLPgsKEguu2287/svbqwoSDIsMKmIL+t t8EgwNaw7SC/wLilwsogwaWwob2/wLsgudvAuLfOIDwvc3Bhbj48L2ZvbnQ+PC9wPg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImxpbmUtaGVpZ2h0OjE1MCU7IG1hcmdpbi10b3A6 MDsgbWFyZ2luLWJvdHRvbTowOyI+PGZvbnQgY29sb3I9IiM2NjY2NjYiPjxzcGFuIHN0eWxl PSJmb250LXNpemU6MTJwdDsiPrTZILXlt6+zuyCz9cC6ILvzxcK3ziCx5sC7ILDJvu6wobDt IMDWvvq02Twvc3Bhbj48c3BhbiBsYW5nPUVOLVVTIHN0eWxlPSJmb250LXNpemU6MTJwdDsi Pi48L3NwYW4+PC9mb250PjwvcD4NCjxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ibGluZS1o ZWlnaHQ6MTUwJTsgbWFyZ2luLXRvcDowOyBtYXJnaW4tYm90dG9tOjA7Ij48Zm9udCBjb2xv cj0iIzY2NjY2NiI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB0OyI+sOaw/MDMILHXs+DA xyCx2cOzv6Egv828rSC4u8fftNk8L3NwYW4+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0iZm9u dC1zaXplOjEycHQ7Ij4uPC9zcGFuPjwvZm9udD48L3A+DQoNCjxwIGNsYXNzPU1zb05vcm1h bCBzdHlsZT0ibGluZS1oZWlnaHQ6MTUwJTsgbWFyZ2luLXRvcDowOyBtYXJnaW4tYm90dG9t OjA7Ij48Zm9udCBjb2xvcj0iIzY2NjY2NiI+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0iZm9u dC1zaXplOjEycHQ7Ij4mcXVvdDu6zsDOLCCzu7ChILTnvcXAuyCw+rTZILPrw+LBy7fOIMO8 xvfH0iC89rW1IMDWtNm0wiC7573HwLsgvsuw7Twvc3Bhbj48L2ZvbnQ+PC9wPg0KDQo8cCBj bGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibGluZS1oZWlnaHQ6MTUwJTsgbWFyZ2luLXRvcDow OyBtYXJnaW4tYm90dG9tOjA7Ij48Zm9udCBjb2xvcj0iIzY2NjY2NiI+PHNwYW4gbGFuZz1F Ti1VUyBzdHlsZT0iZm9udC1zaXplOjEycHQ7Ij4mbmJzcDuw6L3FsKG/5D8mcXVvdDs8L3Nw YW4+PC9mb250PjwvcD4NCjxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0ibGluZS1oZWlnaHQ6 MTUwJTsgbWFyZ2luLXRvcDowOyBtYXJnaW4tYm90dG9tOjA7Ij48Zm9udCBjb2xvcj0iIzY2 NjY2NiI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMnB0OyI+sdez4LChILTrtOTHz7HmPC9z cGFuPjxzcGFuIGxhbmc9RU4tVVMgc3R5bGU9ImZvbnQtc2l6ZToxMnB0OyI+OiAmcXVvdDu/ 1iCx17e4wdIsILDmsPy01D8mcXVvdDs8L3NwYW4+PC9mb250PjwvcD4NCg0KPHAgY2xhc3M9 TXNvTm9ybWFsIHN0eWxlPSJsaW5lLWhlaWdodDoxNTAlOyBtYXJnaW4tdG9wOjA7IG1hcmdp bi1ib3R0b206MDsiPjxmb250IGNvbG9yPSIjNjY2NjY2Ij48c3BhbiBsYW5nPUVOLVVTIHN0 eWxlPSJmb250LXNpemU6MTJwdDsiPiZxdW90O7TnvcUgsKG9v8DMILnbv6Egs6q/zSDA1sDd vsa/5D8mcXVvdDs8L3NwYW4+PC9mb250PjwvcD4NCg0KPHAgY2xhc3M9TXNvTm9ybWFsIHN0 eWxlPSJsaW5lLWhlaWdodDoxNTAlOyBtYXJnaW4tdG9wOjA7IG1hcmdpbi1ib3R0b206MDsi Pjxmb250IGNvbG9yPSIjNjY2NjY2Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEycHQ7Ij6x 17PgtMIgvsa3obimILq4tPW0zyDAzLe4sNQgv9zDxrTZPC9zcGFuPjxzcGFuIGxhbmc9RU4t VVMgc3R5bGU9ImZvbnQtc2l6ZToxMnB0OyI+Ojwvc3Bhbj48L2ZvbnQ+PC9wPg0KDQo8cCBz dHlsZT0ibGluZS1oZWlnaHQ6MTUwJTsgbWFyZ2luLXRvcDowOyBtYXJnaW4tYm90dG9tOjA7 Ij48Zm9udCBjb2xvcj0iIzY2NjY2NiI+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0nZm9udC1m YW1pbHk6udnFwTsgZm9udC1zaXplOjEycHQ7IG1zby1iaWRpLWZvbnQtc2l6ZToxMi4wcHQ7 bXNvLWhhbnNpLWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO21zby1iaWRpLWZvbnQt ZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOw0KbXNvLWZvbnQta2VybmluZzoxLjBwdDttc28t YW5zaS1sYW5ndWFnZTpFTi1VUzttc28tZmFyZWFzdC1sYW5ndWFnZTpLTzsNCm1zby1iaWRp LWxhbmd1YWdlOkFSLVNBJz4mcXVvdDu+xrTPISDAzLeyvPawoSEhILbHIL7GseK4piC59r26 v6Egtc6w7SCzu7fBILn2t8i+7r/kISZxdW90Ozwvc3Bhbj48L2ZvbnQ+PC90ZD4NCgk8L3Ry Pg0KCTwvdGFibGU+DQo8aW1nIHNyYz0iaHR0cDovL21haWx0aW1lcy5uZXQvc2FtcGxlL2lt YWdlcy9obV9saW5lMS5naWYiIHdpZHRoPSI1NTciIGhlaWdodD0iMSI+PGJyPg0KCTx0YWJs ZSB3aWR0aD0iNTU3IiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0i NSIgYmdjb2xvcj0iI0YzRjNFRCI+DQoJPHRyPiANCgk8dGQ+PHAgY2xhc3M9Ik1zb05vcm1h bCIgc3R5bGU9ImxpbmUtaGVpZ2h0OjE1MCU7IG1hcmdpbi10b3A6MDsgbWFyZ2luLWJvdHRv bTowOyI+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0iZm9udC1zaXplOjEycHQ7Ij6h3iANCjxi PmJyZWFzdDwvYj4gJm5ic3A7v8qwob2/PC9zcGFuPjwvcD4NCjxwIGNsYXNzPU1zb05vcm1h bCBzdHlsZT0ibGluZS1oZWlnaHQ6MTUwJTsgbWFyZ2luLXRvcDowOyBtYXJnaW4tYm90dG9t OjA7Ij48c3BhbiBsYW5nPUVOLVVTIHN0eWxlPSJmb250LXNpemU6MTJwdDsiPqHeIA0KPGI+ YXBwcm9hY2g8L2I+ICB+v6EgsKGx7sDMILChtNkgPC9zcGFuPjwvcD4NCg0KPHAgY2xhc3M9 Ik1zb05vcm1hbCIgc3R5bGU9ImxpbmUtaGVpZ2h0OjE1MCU7IG1hcmdpbi10b3A6MDsgbWFy Z2luLWJvdHRvbTowOyI+PHNwYW4gbGFuZz1FTi1VUyBzdHlsZT0iZm9udC1zaXplOjEycHQ7 Ij6h3iANCjxiPmluZGVjZW50PC9iPiAmbmJzcDu59ripvvi0wiwgssMgu+ezqr/uLCC/3Lyz KMC9tvUpx9E8L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9ImxpbmUt aGVpZ2h0OjE1MCU7IG1hcmdpbi10b3A6MDsgbWFyZ2luLWJvdHRvbTowOyI+PHNwYW4gbGFu Zz1FTi1VUyBzdHlsZT0iZm9udC1zaXplOjEycHQ7Ij6h3iANCjxiPmV4cG9zdXJlPC9iPiAm bmJzcDuz68PiPC9zcGFuPjwvcD48L3RkPg0KCTwvdHI+DQoJPC90YWJsZT4NCjwvdGQ+DQog ICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPg0KPC90cj4NCjwhLS2/tb7ut84gv/S+7r/k LiCzoSDA1LTPtNkuLi4gLS0+DQoJDQo8IS0tv8C0w8DHIMbLvNsgvcPA2y0tPg0KPHRyPiAN Cjx0ZD4gDQoJPHRhYmxlIHdpZHRoPSI1NTciIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAi IGNlbGxwYWRkaW5nPSIwIiBiZ2NvbG9yPSJDMUMxQzEiPg0KCTx0cj4gDQoJPHRkIHdpZHRo PSIxMzQiPjxpbWcgc3JjPSJodHRwOi8vbWFpbHRpbWVzLm5ldC9zYW1wbGUvaW1hZ2VzL2ht X3RpdGxlMDIuZ2lmIiB3aWR0aD0iMTMxIiBoZWlnaHQ9IjMyIj48L3RkPg0KCTx0ZCB3aWR0 aD0iMjIxIj48Yj48Zm9udCBjb2xvcj0iIzY2NjY2NiI+PGZvbnQgc2l6ZT0iMyI+JnF1b3Q7 IFdoZXJlIERvZXMgTXkgSGVhcnQ8YnI+Jm5ic3A7IEJlYXQgTm93IDxicj4mbmJzcDstIFN1 bmcgYnkgIENlbGluZSBEaW9uIC0gJnF1b3Q7PC9mb250PjwvZm9udD48L2I+PC90ZD4NCgk8 dGQgd2lkdGg9Ijc0Ij4NCgk8Rk9STSBNRVRIT0Q9UE9TVCBBQ1RJT049Imh0dHA6Ly9tYWls dGltZXMubmV0L3NhbXBsZS9hdWRpby5hc3A/bm93ZGF5PTEyJnRiPWxlY3R1cmVfcG9wZnVs bCZudW09MSZjb2RlPWF1ZGlvJnR0PTAwIiB0YXJnZXQ9ImF1ZGlvIiBuYW1lPSJwb3BfMSI+ DQoJPGlucHV0IHR5cGU9ImltYWdlIiBzcmM9Imh0dHA6Ly9tYWlsdGltZXMubmV0L3NhbXBs ZS9pbWFnZXMvYnV0dG9uX2FsbGxpc3Rlbi5naWYiIHdpZHRoPSI2NSIgaGVpZ2h0PSIxOSIg Ym9yZGVyPSIwIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9y bT4NCjwvdGQ+PC9GT1JNPg0KCTx0ZCB3aWR0aD0iNjciPg0KCTxGT1JNIE1FVEhPRD1QT1NU IEFDVElPTj0iaHR0cDovL21haWx0aW1lcy5uZXQvc2FtcGxlL3Nvbmdfd29yZC5hc3A/aWR4 PTEyJnR0PTAwIiB0YXJnZXQ9InRyYW5zIiBuYW1lPSJwb3BfMiI+DQoJPGlucHV0IHR5cGU9 ImltYWdlIiBzcmM9Imh0dHA6Ly9tYWlsdGltZXMubmV0L3NhbXBsZS9pbWFnZXMvYnV0dG9u X2x5cmljcy5naWYiIHdpZHRoPSI1NiIgaGVpZ2h0PSIxOSIgYm9yZGVyPSIwIj4NCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPg0KDQoJPC90ZD48L0ZPUk0+DQoJ PHRkIHdpZHRoPSI2MSI+DQoJPEZPUk0gTUVUSE9EPVBPU1QgQUNUSU9OPSJodHRwOi8vbWFp bHRpbWVzLm5ldC9zYW1wbGUvc29uZ190cmFucy5hc3A/aWR4PTEyJnR0PTAwIiB0YXJnZXQ9 InRyYW5zIiBuYW1lPSJwb3BfMyI+DQoJPGlucHV0IHR5cGU9ImltYWdlIiBzcmM9Imh0dHA6 Ly9tYWlsdGltZXMubmV0L3NhbXBsZS9pbWFnZXMvYnV0dG9uX3RyYW5zbGF0ZS5naWYiIHdp ZHRoPSI1NiIgaGVpZ2h0PSIxOSIgYm9yZGVyPSIwIj4NCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgPC9mb3JtPg0KDQoJPC90ZD48L0ZPUk0+DQoJPC90cj4NCgk8L3RhYmxl Pg0KPGltZyBzcmM9Imh0dHA6Ly9tYWlsdGltZXMubmV0L3NhbXBsZS9pbWFnZXMvaG1fbGlu ZS5naWYiIHdpZHRoPSI1NTciIGhlaWdodD0iMSI+PGJyPg0KCTx0YWJsZSB3aWR0aD0iNTU3 IiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSI+DQoJPHRyPiAN Cgk8dGQgd2lkdGg9IjQxNyIgY2xhc3M9InRpdGxlIj48Zm9udCBjb2xvcj0iIzAwOTlmZiIg c2l6ZT0iMyI+osMgRG9uJ3Qga25vdyBob3cgbG92ZSBjb3VsZCBsZWF2ZTxicj4gJm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7V2l0aG91dCBhIHRyYWNlIFdoZXJlIGRvIHNpbGVudCBoZWFy dHMgZ28uPC9mb250PjwvdGQ+DQoJPEZPUk0gTUVUSE9EPVBPU1QgQUNUSU9OPSJodHRwOi8v bWFpbHRpbWVzLm5ldC9zYW1wbGUvYXVkaW8uYXNwP25vd2RheT0yMDAxLTA5LTE4JnRiPWxl Y3R1cmVfcG9wJmNvZGU9dGl0bGVfYXVkaW8mdHQ9MDAiIHRhcmdldD0iYXVkaW8iIG5hbWU9 InBvcCI+DQoJPHRkIHdpZHRoPSIzNCI+IA0KCTxTRUxFQ1QgTkFNRT0ibnVtIj4NCgk8b3B0 aW9uIHZhbHVlPSIxIj4xCTxvcHRpb24gdmFsdWU9IjIiPjIJPG9wdGlvbiB2YWx1ZT0iMyI+ Mwk8b3B0aW9uIHZhbHVlPSI0Ij40CTxvcHRpb24gdmFsdWU9IjUiPjUJDQoJPG9wdGlvbiB2 YWx1ZT0iNiI+Ngk8b3B0aW9uIHZhbHVlPSI3Ij43CTxvcHRpb24gdmFsdWU9IjgiPjgJPG9w dGlvbiB2YWx1ZT0iOSI+OQk8b3B0aW9uIHZhbHVlPSIxMCI+MTANCgk8L1NFTEVDVD4NCgk8 L3RkPg0KCTx0ZCB3aWR0aD0iNTciPg0KCTxpbnB1dCB0eXBlPSJpbWFnZSIgc3JjPSJodHRw Oi8vbWFpbHRpbWVzLm5ldC9zYW1wbGUvaW1hZ2VzL2J1dHRvbl9saXN0ZW4uZ2lmIiB3aWR0 aD0iNTYiIGhlaWdodD0iMTkiIGJvcmRlcj0iMCI+PC90ZD48L0ZPUk0+DQoJPC90cj4NCgk8 dHI+IA0KCTx0ZCBjb2xzcGFuPSIzIiBjbGFzcz0idGl0bGUiPjxmb250IGNvbG9yPSIjMDA5 OWZmIj6iwyC757b7wMcgyOfA+7W1ILOyseLB9iC+ysC6IMOkILHXt7iw1CC2sLOvILz2IMDW tMLB9jxicj4mbmJzcDsmbmJzcDsmbmJzcDsgvssgvPawoSC++L7uv+QuIMDMIMfjxbvH0SC4 tsC9wLogvu618LfOILChvt8gx8+zqr/kPC9mb250PjwvdGQ+DQoJPC90cj4NCgk8L3RhYmxl Pg0KPGltZyBzcmM9Imh0dHA6Ly9tYWlsdGltZXMubmV0L3NhbXBsZS9pbWFnZXMvaG1fbGlu ZTEuZ2lmIiB3aWR0aD0iNTU3IiBoZWlnaHQ9IjEiPjxicj4NCgk8dGFibGUgd2lkdGg9IjU1 NyIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjUiIGJnY29sb3I9 IiNGM0YzRUQiPg0KCTx0cj4gDQoJPHRkPjxwIHN0eWxlPSJsaW5lLWhlaWdodDoxNTAlOyBt YXJnaW4tdG9wOjA7IG1hcmdpbi1ib3R0b206MDsiPrytt87AxyC757b7wMwgvcS+7iANCrn2 uLAgw6QgtPXAzLvzIMfSILi7wMwgvvi0wiC758DMsKEgtcggsM3AzMHSLjwvcD4NCjxwIHN0 eWxlPSJsaW5lLWhlaWdodDoxNTAlOyBtYXJnaW4tdG9wOjA7IG1hcmdpbi1ib3R0b206MDsi PidzaWxlbnQgaGVhcnRzJ7b1IA0Kudm3ziC8rbTDx8+w1CC9xL7uILn2uLAsIMfjxbuwqLi4 ILOyvsYgufa4sCC788XCuKYgx6XH9sfRILDNwNS0z7TZLiA8L3A+DQo8cCBzdHlsZT0ibGlu ZS1oZWlnaHQ6MTUwJTsgbWFyZ2luLXRvcDowOyBtYXJnaW4tYm90dG9tOjA7Ij4nd2l0aG91 dCBhIHRyYWNlJ7TCIA0Kobi757b7wMcgyOfA+7W1ILOyseLB9iC+yrDtobm287TCILbmwLi3 ziAnc2lsZW50IGhlYXJ0cyfAxyDAx7nMuKYgPC9wPg0KPHAgc3R5bGU9ImxpbmUtaGVpZ2h0 OjE1MCU7IG1hcmdpbi10b3A6MDsgbWFyZ2luLWJvdHRvbTowOyI+tPW/7SCwrcG2x9ggwdaw 7SANCsDWvu6/5C4gPC9wPg0KPHAgc3R5bGU9ImxpbmUtaGVpZ2h0OjE1MCU7IG1hcmdpbi10 b3A6MDsgbWFyZ2luLWJvdHRvbTowOyI+Jm5ic3A7PC9wPg0KPHAgc3R5bGU9ImxpbmUtaGVp Z2h0OjE1MCU7IG1hcmdpbi10b3A6MDsgbWFyZ2luLWJvdHRvbTowOyI+od4gPGI+d2l0aG91 dCBhIA0KdHJhY2U8L2I+IL7Guau3sSDI58D7LCDA2sPrtbUgvvjAzDwvcD4NCjxwIHN0eWxl PSJsaW5lLWhlaWdodDoxNTAlOyBtYXJnaW4tdG9wOjA7IG1hcmdpbi1ib3R0b206MDsiPiZu YnNwOyZuYnNwO6K5VGhhdCANCmRvZyBoYXMgZ29uZSBhd2F5IHdpdGhvdXQgYSB0cmFjZS4g KLHXILCztMIgvsa5q7exIMjnwPu1tSC++MDMILvntvPBriC59rfItNkuKTwvdGQ+DQoJPC90 cj4NCgk8L3RhYmxlPg0KPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+DQo8 L3RyPg0KPCEtLb/AtMPAxyDGy7zbILOhLS0+DQoJDQo8IS0tv8C0w8DHIL+1vu4gx9G4trXw IL3DwNstLT4NCjx0cj4gDQo8dGQ+IA0KCTx0YWJsZSB3aWR0aD0iNTU3IiBib3JkZXI9IjAi IGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYmdjb2xvcj0iQzFDMUMxIj4NCgk8 dHI+IA0KCTx0ZCB3aWR0aD0iMzA1Ij48aW1nIHNyYz0iaHR0cDovL21haWx0aW1lcy5uZXQv c2FtcGxlL2ltYWdlcy9obV90aXRsZTAzLmdpZiIgd2lkdGg9IjE2NyIgaGVpZ2h0PSIzMiI+ PC90ZD4NCgk8L3RyPg0KCTwvdGFibGU+DQo8aW1nIHNyYz0iaHR0cDovL21haWx0aW1lcy5u ZXQvc2FtcGxlL2ltYWdlcy9obV9saW5lLmdpZiIgd2lkdGg9IjU1NyIgaGVpZ2h0PSIxIj48 YnI+DQoJPHRhYmxlIHdpZHRoPSI1NTciIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNl bGxwYWRkaW5nPSI1Ij4NCgk8dHI+IA0KCTx0ZCB3aWR0aD0iNDE3IiBjbGFzcz0idGl0bGUi Pjxmb250IGNvbG9yPSIjMDA5OWZmIiBzaXplPSIzIj6iwyBNYXkgSSB0cnkgdGhpcyBvbj88 L2ZvbnQ+PC90ZD4NCgk8Rk9STSBNRVRIT0Q9UE9TVCBBQ1RJT049Imh0dHA6Ly9tYWlsdGlt ZXMubmV0L3NhbXBsZS9hdWRpby5hc3A/bm93ZGF5PTIwMDEtMDktMTgmdGI9bGVjdHVyZV9l bmdsaXNoJmNvZGU9dGl0bGVfYXVkaW8mdHQ9MDAiIHRhcmdldD0iYXVkaW8iIG5hbWU9ImVu Z2xpc2giPg0KCTx0ZCB3aWR0aD0iMzQiPiANCgk8U0VMRUNUIE5BTUU9Im51bSI+DQoJPG9w dGlvbiB2YWx1ZT0iMSI+MQk8b3B0aW9uIHZhbHVlPSIyIj4yCTxvcHRpb24gdmFsdWU9IjMi PjMJPG9wdGlvbiB2YWx1ZT0iNCI+NAk8b3B0aW9uIHZhbHVlPSI1Ij41CQ0KCTxvcHRpb24g dmFsdWU9IjYiPjYJPG9wdGlvbiB2YWx1ZT0iNyI+Nwk8b3B0aW9uIHZhbHVlPSI4Ij44CTxv cHRpb24gdmFsdWU9IjkiPjkJPG9wdGlvbiB2YWx1ZT0iMTAiPjEwPC9vcHRpb24+DQoJPC9T RUxFQ1Q+DQoJPC90ZD4NCgk8dGQgd2lkdGg9IjU3Ij4NCgk8aW5wdXQgdHlwZT0iaW1hZ2Ui IHNyYz0iaHR0cDovL21haWx0aW1lcy5uZXQvc2FtcGxlL2ltYWdlcy9idXR0b25fbGlzdGVu LmdpZiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjE5IiBib3JkZXI9IjAiPjwvdGQ+PC9GT1JNPg0K CTwvdHI+DQoJPHRyPiANCgk8dGQgY29sc3Bhbj0iMyIgY2xhc3M9InRpdGxlIj48Zm9udCBj b2xvcj0iIzAwOTlmZiI+osMgx9G5+CDA1L7uusG1tSC1ybHuv+Q/PC9mb250PjwvdGQ+DQoJ PC90cj4NCgk8L3RhYmxlPg0KPGltZyBzcmM9Imh0dHA6Ly9tYWlsdGltZXMubmV0L3NhbXBs ZS9pbWFnZXMvaG1fbGluZTEuZ2lmIiB3aWR0aD0iNTU3IiBoZWlnaHQ9IjEiPjxicj4NCgk8 dGFibGUgd2lkdGg9IjU1NyIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRp bmc9IjUiPg0KCTx0cj4gDQoJPHRkIHdpZHRoPSI1MDEiIGNsYXNzPSJ0cmFuc18xIj48Zm9u dCBjb2xvcj0iIzY2OTljYyI+PGI+otEguru5rrq4seI8L2I+PC9mb250PiA8L3RkPg0KCTx0 ZCB3aWR0aD0iNTYiPg0KCTxGT1JNIE1FVEhPRD1QT1NUIEFDVElPTj0iaHR0cDovL21haWx0 aW1lcy5uZXQvc2FtcGxlL2F1ZGlvLmFzcD9ub3dkYXk9MjAwMS0wOS0xOCZ0Yj1sZWN0dXJl X2VuZ2xpc2gmbnVtPTEmY29kZT1kaWFsb2d1ZV9hdWRpbyZ0dD0wMCIgdGFyZ2V0PSJhdWRp byIgbmFtZT0iZW5nbGlzaF8yIj4NCgk8aW5wdXQgdHlwZT0iaW1hZ2UiIHNyYz0iaHR0cDov L21haWx0aW1lcy5uZXQvc2FtcGxlL2ltYWdlcy9idXR0b25fbGlzdGVuLmdpZiIgd2lkdGg9 IjU2IiBoZWlnaHQ9IjE5IiBib3JkZXI9IjAiPg0KICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA8L2Zvcm0+DQoNCgk8L3RkPjwvRk9STT4NCgk8L3RyPg0KCTx0cj4gDQoJPHRk IGNvbHNwYW49IjIiIGNsYXNzPSJ0cmFucyI+PGZvbnQgY29sb3I9IiM2NjY2NjYiIHNpemU9 IjMiPkE6IFRoaXMgaXMgdGhlIGxhdGVzdCBpbiBzd2ltd2Vhci4gPGJyPiAgIA0KQjogV2hh dCBjb2xvcnMgZG8geW91IGhhdmU/ICA8YnI+DQpBOiBCZXNpZGVzIHRoaXMgb25lIGluIGJs YWNrLCB3ZSBoYXZlIHJlZCwgYmx1ZSBhbmQgZ3JlZW4uIDxicj4NCkI6IENhbiBJIHRyeSB0 aGlzIG9uZSBvbj88YnI+PC9mb250PjwvdGQ+DQoJPC90cj4NCgk8L3RhYmxlPg0KPGltZyBz cmM9Imh0dHA6Ly9tYWlsdGltZXMubmV0L3NhbXBsZS9pbWFnZXMvaG1fbGluZTEuZ2lmIiB3 aWR0aD0iNTU3IiBoZWlnaHQ9IjEiPjxicj4NCgk8dGFibGUgd2lkdGg9IjU1NyIgYm9yZGVy PSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjUiPg0KCTx0cj4gDQoJPHRkIGNs YXNzPSJ0cmFuc18xIj48Zm9udCBjb2xvcj0iIzY2OTljYyI+PGI+otEgx9i8rrq4seI8L2I+ PC9mb250PiA8L3RkPg0KCTwvdHI+DQoJPHRyPiANCgk8dGQgY2xhc3M9InRyYW5zIj48Zm9u dCBjb2xvcj0iIzY2NjY2NiI+QSA6IMDMsM3AzCC/7LiusKEgsKHB9rDtIMDWtMIgw9a9xSC8 9r+1urnAzL+hv+QuIDxicj4NCkIgOiC79rvzwLogvu62siCw1CDA1rOqv+Q/PGJyPg0KQSA6 ILDLwLq79sDOIMDMsM0guLuw7SC7obCjILv2LCDGxLb1u/YsIMPKt8+79sDMIMDWvu6/5C4g PGJyPg0KQiA6IMGmsKEgwMywzSDH0SC5+CDA1L7uusG1tSC1ybHuv+Q/PC9mb250Pg0KPC90 ZD4NCg0KCTwvdHI+DQoJPC90YWJsZT4NCjxpbWcgc3JjPSJodHRwOi8vbWFpbHRpbWVzLm5l dC9zYW1wbGUvaW1hZ2VzL2htX2xpbmUxLmdpZiIgd2lkdGg9IjU1NyIgaGVpZ2h0PSIxIj48 YnI+DQoJPHRhYmxlIHdpZHRoPSI1NTciIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNl bGxwYWRkaW5nPSI4IiBiZ2NvbG9yPSIjRjNGM0VEIj4NCgk8dHI+IA0KCTx0ZD48cCBzdHls ZT0ibGluZS1oZWlnaHQ6MTUwJTsgbWFyZ2luLXRvcDowOyBtYXJnaW4tYm90dG9tOjA7Ij4n v8rAuyDH0SC5+CDA1L7uuri02Se287TCIA0Kx6XH9sC6ICd0cnkgb24nwNS0z7TZLiA8L3A+ DQo8cCBzdHlsZT0ibGluZS1oZWlnaHQ6MTUwJTsgbWFyZ2luLXRvcDowOyBtYXJnaW4tYm90 dG9tOjA7Ij4ndHJ5IHRvJ7TCICez67fCx8+02SfAzLDtIA0KJ3RyeSB+IGluZye0wiAnvcPH 6LvvvsYgfsfPtNkntvO0wiC25sDMwfa/5C48L3A+DQo8cCBzdHlsZT0ibGluZS1oZWlnaHQ6 MTUwJTsgbWFyZ2luLXRvcDowOyBtYXJnaW4tYm90dG9tOjA7Ij4gJm5ic3A7PC9wPg0KPHAg c3R5bGU9ImxpbmUtaGVpZ2h0OjE1MCU7IG1hcmdpbi10b3A6MDsgbWFyZ2luLWJvdHRvbTow OyI+od4gPGI+c3dpbXdlYXI8L2I+IA0KJm5ic3A7vPa/tbq5ICZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OzwvcD4NCjxwIHN0eWxlPSJsaW5lLWhlaWdodDoxNTAlOyBtYXJnaW4tdG9wOjA7IG1hcmdp bi1ib3R0b206MDsiPqHeIDxiPmJlc2lkZXM8L2I+IA0KJm5ic3A7sNS02bChLCCx17nbv6E8 L3A+DQo8cCBzdHlsZT0ibGluZS1oZWlnaHQ6MTUwJTsgbWFyZ2luLXRvcDowOyBtYXJnaW4t Ym90dG9tOjA7Ij6h3iA8Yj50cnkgb248L2I+IA0KJm5ic3A7fsC7IMfRILn4IMDUvu66uLTZ LjwvdGQ+DQoJPC90cj4NCgk8L3RhYmxlPg0KPC90ZD4NCiAgICAgICAgICAgICAgICAgICAg PHRkPjwvdGQ+DQo8L3RyPg0KPCEtLb/AtMPAxyC/tb7uIMfRuLa18CCzoS0tPg0KCQ0KPCEt LcDPvu63ziC/9L7uv+QuIL3DwNstLT4NCjx0cj4gDQo8dGQ+IA0KCTx0YWJsZSB3aWR0aD0i NTU3IiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgYmdjb2xv cj0iQzFDMUMxIj4NCgk8dHI+IA0KCTx0ZCB3aWR0aD0iNDkwIj48aW1nIHNyYz0iaHR0cDov L21haWx0aW1lcy5uZXQvc2FtcGxlL2ltYWdlcy9obV90aXRsZTA2LmdpZiIgd2lkdGg9IjEz MiIgaGVpZ2h0PSIzNSI+PC90ZD4NCgk8dGQgd2lkdGg9IjY3Ij4NCgk8Rk9STSBNRVRIT0Q9 UE9TVCBBQ1RJT049Imh0dHA6Ly9tYWlsdGltZXMubmV0L3NhbXBsZS9hdWRpby5hc3A/bm93 ZGF5PTIwMDEtMDktMTgmdGI9bGVjdHVyZV9qaHVtZXImbnVtPTEmY29kZT1hdWRpbyZ0dD0w MCIgdGFyZ2V0PSJhdWRpbyIgbmFtZT0iamh1bWVyXzEiPg0KCTxpbnB1dCB0eXBlPSJpbWFn ZSIgc3JjPSJodHRwOi8vbWFpbHRpbWVzLm5ldC9zYW1wbGUvaW1hZ2VzL2J1dHRvbl9saXN0 ZW4uZ2lmIiB3aWR0aD0iNTYiIGhlaWdodD0iMTkiIGJvcmRlcj0iMCI+DQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+DQoNCgk8L3RkPjwvRk9STT4NCgk8 L3RyPg0KCTwvdGFibGU+DQo8aW1nIHNyYz0iaHR0cDovL21haWx0aW1lcy5uZXQvc2FtcGxl L2ltYWdlcy9obV9saW5lLmdpZiIgd2lkdGg9IjU1NyIgaGVpZ2h0PSIxIj48YnI+DQoJPHRh YmxlIHdpZHRoPSIxMDAlIiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGlu Zz0iNSI+DQoJPHRyPiANCgk8dGQgY2xhc3M9InRpdGxlIj48Zm9udCBjb2xvcj0iIzAwOTlm ZiI+PGI+osMg3NbiwjwvYj48L2ZvbnQ+PC90ZD4NCgk8L3RyPg0KCTwvdGFibGU+DQo8aW1n IHNyYz0iaHR0cDovL21haWx0aW1lcy5uZXQvc2FtcGxlL2ltYWdlcy9obV9saW5lLmdpZiIg d2lkdGg9IjU1NyIgaGVpZ2h0PSIxIj48YnI+DQoJPHRhYmxlIHdpZHRoPSIxMDAlIiBib3Jk ZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSI+DQoJPHRyPiANCgk8dGQg Y2xhc3M9InRyYW5zXzEiPjxmb250IGNvbG9yPSIjNjY5OWNjIj48Yj6i0SC6u7muurix4jwv Yj48L2ZvbnQ+PC90ZD4NCgk8L3RyPg0KCTx0cj4gDQoJPHRkIGNsYXNzPSJ0cmFucyI+PHAg c3R5bGU9ImxpbmUtaGVpZ2h0OjE1MCU7IG1hcmdpbi10b3A6MDsgbWFyZ2luLWJvdHRvbTow OyI+PGZvbnQgY29sb3I9IiM2NjY2NjYiIHNpemU9IjMiPu+j8ekgOiDfo++jqq+q86OsIA0K +bwoqsqq8ymqzjxmb250IGNvbG9yPSJyZWQiPvrrKKqiqsopPC9mb250PqOsPGZvbnQgY29s b3I9InJlZCI+z94oqtspPC9mb250PqrDqsaqpKrrqs4/IA0KJm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9mb250PjwvcD4N CjxwIHN0eWxlPSJsaW5lLWhlaWdodDoxNTAlOyBtYXJnaW4tdG9wOjA7IG1hcmdpbi1ib3R0 b206MDsiPjxmb250IGNvbG9yPSIjNjY2NjY2IiBzaXplPSIzIj7fo++jIDogqqIhIO+j8emq r6rzo6wgDQo8Zm9udCBjb2xvcj0icmVkIj6qpqrBqs7Q3eXgKKqtqvOqrqrnKTwvZm9udD6q zjxmb250IGNvbG9yPSJyZWQiPqqq2dcoqs+qqyk8L2ZvbnQ+qsqq86rAo648L2ZvbnQ+PC9w Pg0KPHAgc3R5bGU9ImxpbmUtaGVpZ2h0OjE1MCU7IG1hcmdpbi10b3A6MDsgbWFyZ2luLWJv dHRvbTowOyI+PGZvbnQgY29sb3I9IiM2NjY2NjYiIHNpemU9IjMiPu+j8ekgOiCqx6rio6zQ 3eXgKKqtqvOqrqrnKarOqqrZ1yiqz6qrKarLqreqwarjo6yqvarOIA0K+usoqqKqyiksPC9m b250PjwvcD4NCjxwIHN0eWxlPSJsaW5lLWhlaWdodDoxNTAlOyBtYXJnaW4tdG9wOjA7IG1h cmdpbi1ib3R0b206MDsiPjxmb250IGNvbG9yPSIjNjY2NjY2IiBzaXplPSIzIj4mbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8Zm9udCBj b2xvcj0icmVkIj7T3iiqqqqqKaqtqrmqrqrrPC9mb250Pqroo648L2ZvbnQ+PC9wPg0KPHAg c3R5bGU9ImxpbmUtaGVpZ2h0OjE1MCU7IG1hcmdpbi10b3A6MDsgbWFyZ2luLWJvdHRvbTow OyI+PGZvbnQgY29sb3I9IiM2NjY2NjYiIHNpemU9IjMiPt+j76MgOiA8Zm9udCBjb2xvcj0i cmVkIj7ewtuwKKq3qquqvymqyqqkPC9mb250Pqroo648L2ZvbnQ+PC9wPg0KPHAgc3R5bGU9 ImxpbmUtaGVpZ2h0OjE1MCU7IG1hcmdpbi10b3A6MDsgbWFyZ2luLWJvdHRvbTowOyI+PGZv bnQgY29sb3I9IiM2NjY2NjYiIHNpemU9IjMiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO6qmqsGqztDd5eAoqq2q86ququcpqqyjrO+j 8emqr6rzqs48Zm9udCBjb2xvcj0icmVkIj6rzauzPC9mb250PqrO8ekoqsqqqymqyzxmb250 IGNvbG9yPSJyZWQiPuz9PC9mb250PjwvZm9udD48L3A+DQo8cCBzdHlsZT0ibGluZS1oZWln aHQ6MTUwJTsgbWFyZ2luLXRvcDowOyBtYXJnaW4tYm90dG9tOjA7Ij48Zm9udCBjb2xvcj0i IzY2NjY2NiIgc2l6ZT0iMyI+PGZvbnQgY29sb3I9InJlZCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7KKrPqqQpPC9mb250PqrDqr+q 3qreqsCqq6rpo648L2ZvbnQ+IA0KPC9wPjwvdGQ+DQoJPC90cj4NCgk8L3RhYmxlPg0KPGlt ZyBzcmM9Imh0dHA6Ly9tYWlsdGltZXMubmV0L3NhbXBsZS9pbWFnZXMvaG1fbGluZS5naWYi IHdpZHRoPSI1NTciIGhlaWdodD0iMSI+PGJyPg0KCTx0YWJsZSB3aWR0aD0iMTAwJSIgYm9y ZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjUiPg0KCTx0cj4gDQoJPHRk IGNsYXNzPSJ0cmFuc18xIj48Zm9udCBjb2xvcj0iIzY2OTljYyI+PGI+otEgx9i8rrq4seI8 L2I+PC9mb250PjwvdGQ+DQoJPC90cj4NCgk8dHI+IA0KCTx0ZCBjbGFzcz0idHJhbnMiPjxm b250IGNvbG9yPSIjNjY2NjY2Ij602bOqse4gOiC+37i2tNmxuiwguau9vCCxuLjbwLsgxsSw 7SDA1rTPPyA8YnI+DQq+37i2tNkgOiC+xiEgtNmzqrHusbosIL/suK4gwf0gsd262L7uILmr tP3AzL7fLiA8YnI+DQq02bOqse4gOiCx18ShuLgsILHduti+7iC5q7T9xKGw7ywgsdcgsbi4 2ywgs8q5q8WptNkuIDxicj4NCr7fuLa02SA6IL7uwr8gvPYgvvi+7i4gv+y4rsH9ILHduti+ 7rChILPKyPHB/SCw7b7nwMwgue6807+hILXpvu7A1rDFtecuPC9mb250Pg0KPC90ZD4NCgk8 L3RyPg0KCTwvdGFibGU+DQo8aW1nIHNyYz0iaHR0cDovL21haWx0aW1lcy5uZXQvc2FtcGxl L2ltYWdlcy9obV9saW5lMS5naWYiIHdpZHRoPSI1NTciIGhlaWdodD0iMSI+PGJyPg0KCTx0 YWJsZSB3aWR0aD0iNTU3IiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGlu Zz0iNSIgYmdjb2xvcj0iI0YzRjNFRCI+DQoJPHRyPiANCgk8dGQ+PHAgc3R5bGU9ImxpbmUt aGVpZ2h0OjE1MCU7IG1hcmdpbi10b3A6MDsgbWFyZ2luLWJvdHRvbTowOyI+od4gPGI+3Nbi wiiq1aqvqreq5aqmKTwvYj4gDQombmJzcDu6ubz2PC9wPg0KPHAgc3R5bGU9ImxpbmUtaGVp Z2h0OjE1MCU7IG1hcmdpbi10b3A6MDsgbWFyZ2luLWJvdHRvbTowOyI+od4gPGI++usoqqKq yik8L2I+IA0KJm5ic3A7sbi42zwvcD4NCjxwIHN0eWxlPSJsaW5lLWhlaWdodDoxNTAlOyBt YXJnaW4tdG9wOjA7IG1hcmdpbi1ib3R0b206MDsiPqHeIDxiPs/eKKrbKarrPC9iPiANCiZu YnNwO8bEtNk8L3A+DQo8cCBzdHlsZT0ibGluZS1oZWlnaHQ6MTUwJTsgbWFyZ2luLXRvcDow OyBtYXJnaW4tYm90dG9tOjA7Ij6h3iA8Yj6qpqrBqs5+PC9iPiANCiZuYnNwOyZuYnNwO7/s uK4owf0pfjwvcD4NCjxwIHN0eWxlPSJsaW5lLWhlaWdodDoxNTAlOyBtYXJnaW4tdG9wOjA7 IG1hcmdpbi1ib3R0b206MDsiPqHeIDxiPtDd5eAoqq2q86ququcpPC9iPiANCiZuYnNwO7Hd uti+7jwvcD4NCjxwIHN0eWxlPSJsaW5lLWhlaWdodDoxNTAlOyBtYXJnaW4tdG9wOjA7IG1h cmdpbi1ib3R0b206MDsiPqHeIDxiPqqq2dcoqs+qqyk8L2I+IA0KJm5ic3A7uau0/TwvcD4N CjxwIHN0eWxlPSJsaW5lLWhlaWdodDoxNTAlOyBtYXJnaW4tdG9wOjA7IG1hcmdpbi1ib3R0 b206MDsiPqHeIDxiPtPeKKqqqqopqq2quaququsooefT3qqtqqQpPC9iPiANCiZuYnNwO7PK uavFqbTZLjwvcD4NCjxwIHN0eWxlPSJsaW5lLWhlaWdodDoxNTAlOyBtYXJnaW4tdG9wOjA7 IG1hcmdpbi1ib3R0b206MDsiPqHeIDxiPt7C27Aoqreqq6q/KarKqqQ8L2I+IA0KJm5ic3A7 vu7CvyC89iC++LTZLjwvcD4NCjxwIHN0eWxlPSJsaW5lLWhlaWdodDoxNTAlOyBtYXJnaW4t dG9wOjA7IG1hcmdpbi1ib3R0b206MDsiPqHeIDxiPqrNqrM8L2I+ICZuYnNwO7DtvufAzDwv cD4NCjxwIHN0eWxlPSJsaW5lLWhlaWdodDoxNTAlOyBtYXJnaW4tdG9wOjA7IG1hcmdpbi1i b3R0b206MDsiPqHeIDxiPuz9KKrPqqQpqus8L2I+IA0KJm5ic3A7tem+7rChtNkuPC9wPjwv dGQ+DQoJPC90cj4NCgk8L3RhYmxlPg0KPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgPHRk PjwvdGQ+DQo8L3RyPg0KPCEtLcDPvu63ziC/9L7uv+QuILOhLS0+DQoJDQo8IS0tquyqx6q3 queqpiC9w8DbLS0+DQo8dHI+IA0KPHRkPiANCgk8dGFibGUgd2lkdGg9IjU1NyIgYm9yZGVy PSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIGJnY29sb3I9IkMxQzFDMSI+ DQoJPHRyPiANCgk8dGQ+PGltZyBzcmM9Imh0dHA6Ly9tYWlsdGltZXMubmV0L3NhbXBsZS9p bWFnZXMvaG1fdGl0bGUwNC5naWYiIHdpZHRoPSIxNjciIGhlaWdodD0iMzIiPjwvdGQ+DQoJ PC90cj4NCgk8L3RhYmxlPg0KPGltZyBzcmM9Imh0dHA6Ly9tYWlsdGltZXMubmV0L3NhbXBs ZS9pbWFnZXMvaG1fbGluZS5naWYiIHdpZHRoPSI1NTciIGhlaWdodD0iMSI+PGJyPg0KCTx0 YWJsZSB3aWR0aD0iNTU3IiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGlu Zz0iNSI+DQoJPHRyPiANCgk8dGQgd2lkdGg9IjQxNyIgY2xhc3M9InRpdGxlIj48Zm9udCBj b2xvcj0iIzAwOTlmZiIgc2l6ZT0iMyI+PGI+osMg0dGqtarzqs8g+vzwqSiqrarnqqaqwKqk KaqsIKqiquqq3qq5qqs8L2I+PC9mb250PjwvdGQ+DQoJPEZPUk0gTUVUSE9EPVBPU1QgQUNU SU9OPSJodHRwOi8vbWFpbHRpbWVzLm5ldC9zYW1wbGUvYXVkaW8uYXNwP25vd2RheT0yMDAx LTA5LTE4JnRiPWxlY3R1cmVfamFwYW4mY29kZT10aXRsZV9hdWRpbyZ0dD0wMCIgdGFyZ2V0 PSJhdWRpbyIgbmFtZT0iamFwYW4iPg0KCTx0ZCB3aWR0aD0iMzQiPiANCgk8U0VMRUNUIE5B TUU9Im51bSI+DQoJPG9wdGlvbiB2YWx1ZT0iMSI+MQk8b3B0aW9uIHZhbHVlPSIyIj4yCTxv cHRpb24gdmFsdWU9IjMiPjMJPG9wdGlvbiB2YWx1ZT0iNCI+NAk8b3B0aW9uIHZhbHVlPSI1 Ij41CQ0KCTxvcHRpb24gdmFsdWU9IjYiPjYJPG9wdGlvbiB2YWx1ZT0iNyI+Nwk8b3B0aW9u IHZhbHVlPSI4Ij44CTxvcHRpb24gdmFsdWU9IjkiPjkJPG9wdGlvbiB2YWx1ZT0iMTAiPjEw PC9vcHRpb24+DQoJPC9TRUxFQ1Q+DQoJPC90ZD4NCgk8dGQgd2lkdGg9IjU3Ij4NCgk8aW5w dXQgdHlwZT0iaW1hZ2UiIHNyYz0iaHR0cDovL21haWx0aW1lcy5uZXQvc2FtcGxlL2ltYWdl cy9idXR0b25fbGlzdGVuLmdpZiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjE5IiBib3JkZXI9IjAi PjwvdGQ+PC9GT1JNPg0KCTwvdHI+DQoJPHRyPiANCgk8dGQgY29sc3Bhbj0iMyIgY2xhc3M9 InRpdGxlIj48Zm9udCBjb2xvcj0iIzAwOTlmZiI+PGI+osMgsei+vrTCIMf8waawoSDA1r3A tM+x7j88L2I+PC9mb250PjwvdGQ+DQoJPC90cj4NCgk8L3RhYmxlPg0KPGltZyBzcmM9Imh0 dHA6Ly9tYWlsdGltZXMubmV0L3NhbXBsZS9pbWFnZXMvaG1fbGluZTEuZ2lmIiB3aWR0aD0i NTU3IiBoZWlnaHQ9IjEiPjxicj4NCgk8dGFibGUgd2lkdGg9IjU1NyIgYm9yZGVyPSIwIiBj ZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjUiPg0KCTx0cj4gDQoJPHRkIHdpZHRoPSI1 MDEiIGNsYXNzPSJ0cmFuc18xIj48Zm9udCBjb2xvcj0iIzY2OTljYyI+PGI+otEguru5rrq4 seI8L2I+PC9mb250PjwvdGQ+DQoJPHRkIHdpZHRoPSI1NiI+DQoJPEZPUk0gTUVUSE9EPVBP U1QgQUNUSU9OPSJodHRwOi8vbWFpbHRpbWVzLm5ldC9zYW1wbGUvYXVkaW8uYXNwP25vd2Rh eT0yMDAxLTA5LTE4JnRiPWxlY3R1cmVfamFwYW4mbnVtPTEmY29kZT1kaWFsb2d1ZV9hdWRp byZ0dD0wMCIgdGFyZ2V0PSJhdWRpbyIgbmFtZT0iamFwYW5fMiI+DQoJPGlucHV0IHR5cGU9 ImltYWdlIiBzcmM9Imh0dHA6Ly9tYWlsdGltZXMubmV0L3NhbXBsZS9pbWFnZXMvYnV0dG9u X2xpc3Rlbi5naWYiIHdpZHRoPSI1NiIgaGVpZ2h0PSIxOSIgYm9yZGVyPSIwIj4NCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPg0KDQoJPC90ZD48L0ZPUk0+DQoJ PC90cj4NCgk8dHI+IA0KCTx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0idHJhbnMiPjxmb250IGNv bG9yPSIjNjY2NjY2IiBzaXplPSIzIj7ZyvW9IDog0dGqtarzqs8g+vzwqSiqrarnqqaqwKqk KaqsIKqiquqq3qq5qqsuIDxicj4gICAgICAgICAgICAgICAgICAgICAgICAgIA0K0dEmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDs6IKqoqqijrCD6/CiqoqrLKarIIO2rKKqiqs0pqqwg7Ons 0Siq0qrIquopqrqqxCCqoqrqqt6quS4gPGJyPg0K2cr1vSA6IKqq+vwoqsuqpCmqtarzqs8g +bwoqsqqyymq8iCqt6rGIKqkqt6quaqrLjxicj4gICAgICAgICAgICANCtHRJm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7OiD6/CiqoqrLKarPIN2rKKrBqsEpqs4g/OXe5Ciqq6qkqreq4ymq xyCqz6q/qumqpKrGIKqkqt6quS48L2ZvbnQ+PC90ZD4NCgk8L3RyPg0KCTwvdGFibGU+DQo8 aW1nIHNyYz0iaHR0cDovL21haWx0aW1lcy5uZXQvc2FtcGxlL2ltYWdlcy9obV9saW5lMS5n aWYiIHdpZHRoPSI1NTciIGhlaWdodD0iMSI+PGJyPg0KCTx0YWJsZSB3aWR0aD0iNTU3IiBi b3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNSI+DQoJPHRyPiANCgk8 dGQgY2xhc3M9InRyYW5zXzEiPjxmb250IGNvbG9yPSIjNjY5OWNjIj48Yj6i0SDH2Lyuurix 4jwvYj48L2ZvbnQ+PC90ZD4NCgk8L3RyPg0KCTx0cj4gDQoJPHRkIGNsYXNzPSJ0cmFucyI+ PGZvbnQgY29sb3I9IiM2NjY2NjYiPrHiuau28yA6ILHovr60wiDH/MGmsKEgwNa9wLTPse4/ PGJyPg0KsegmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs6IL+5LCDH/LD6 ILSps6qwoSDH0SC47b6/IMDWvcC0z7TZLiA8YnI+DQqx4rmrtvMgOiDH/LTUwLoguau++cC7 IMfPsO0gwNa9wLTPse4/ICAgPGJyPg0KsegmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDs6IMf8wLogvsa59sH2IMi4u+e/obytIMDPx8+w7SDA1r3AtM+02S48L2ZvbnQ+ PC90ZD4NCiANCgk8L3RyPg0KCTwvdGFibGU+DQo8aW1nIHNyYz0iaHR0cDovL21haWx0aW1l cy5uZXQvc2FtcGxlL2ltYWdlcy9obV9saW5lMS5naWYiIHdpZHRoPSI1NTciIGhlaWdodD0i MSI+PGJyPg0KCTx0YWJsZSB3aWR0aD0iNTU3IiBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIw IiBjZWxscGFkZGluZz0iOCIgYmdjb2xvcj0iI0YzRjNFRCI+DQoJPHRyPiANCgk8dGQ+od4g PGI++vzwqSiqrarnqqaqwKqkKTwvYj4gIMf8waYNCqHeIDxiPqrPqr+q6aqvPC9iPiAgwM/H z7TZIA0KPC90ZD4NCgk8L3RyPg0KCTwvdGFibGU+DQo8L3RkPg0KICAgICAgICAgICAgICAg ICAgICA8dGQ+PC90ZD4NCjwvdHI+DQo8IS0tquyqx6q3queqpiCzoS0tPg0KCQ0KDQoJDQoN Cg0KCQ0KDQoJPC90YWJsZT4NCjxpbWcgc3JjPSJodHRwOi8vbWFpbHRpbWVzLm5ldC9zYW1w bGUvaW1hZ2VzL2htX2xpbmUxLmdpZiIgd2lkdGg9IjU1NyIgaGVpZ2h0PSIxIj48YnI+DQoJ PHRhYmxlIHdpZHRoPSI1NTciIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRk aW5nPSI1IiBiZ2NvbG9yPSIjRjNGM0VEIj4NCgk8dHI+IA0KDQqh66Hroeuh66Hroeuh66Hr oeuh66Hroeuh66Hroeuh66Hroeuh66Hroeuh66Hroeuh66Hroeuh66Hroeuh66Hroeuh66Hr oeuh66Hroeuh66Hroeuh66Hroeuh6zwvcD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIDxwIHN0eWxlPSJsaW5lLWhlaWdodDoxNDUlOyBtYXJnaW4tdG9wOjA7IG1h cmdpbi1ib3R0b206MDsiPm1haWxtYW4tZGV2ZWxvcGVyc7TUIA0KICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgvsiz58fPvLy/5D8gPC9wPg0KICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgPHAgc3R5bGU9ImxpbmUtaGVpZ2h0OjE0NSU7IG1hcmdp bi10b3A6MDsgbWFyZ2luLWJvdHRvbTowOyI+Jm5ic3A7PC9wPg0KICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgPHAgc3R5bGU9ImxpbmUtaGVpZ2h0OjE0NSU7IG1hcmdp bi10b3A6MDsgbWFyZ2luLWJvdHRvbTowOyI+wPrI8bTCIA0KICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgPGZvbnQgY29sb3I9ImJsdWUiPsD8yK24piDAzL/rPC9mb250 PsfYvK0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCwrbvnv808Yj4g MSA6IDE8L2I+ILfOIL/csbm+7iDH0L3AwLsgx9IgDQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICC89iDA1rTCIKLEPGEgaHJlZj0iaHR0cDovL3d3dy5vbGsuY28ua3Iv aW5zdGlfZnJhbWUuaHRtIj48Yj48Zm9udCBzaXplPSIzIj4gDQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBPbmxpbmUgS29yZWE8L2ZvbnQ+PC9iPjwvYT4gosUgtvMg PC9wPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgc3R5bGU9Imxp bmUtaGVpZ2h0OjE0NSU7IG1hcmdpbi10b3A6MDsgbWFyZ2luLWJvdHRvbTowOyI+sO0gDQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDH1bTPtNkuIA0KICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ucy4 riDH47b0ud7B9iC+yrDtIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg xu3B9iC15bfBIMHLvNvH1bTPtNkuICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO7rOtfAgDQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICCzyrHXt6+/7L3FIL/rvK24pi4u Li4uLjwvcD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIHN0eWxl PSJsaW5lLWhlaWdodDoxNDUlOyBtYXJnaW4tdG9wOjA7IG1hcmdpbi1ib3R0b206MDsiPiZu YnNwOzwvcD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIHN0eWxl PSJsaW5lLWhlaWdodDoxNDUlOyBtYXJnaW4tdG9wOjA7IG1hcmdpbi1ib3R0b206MDsiPsD6 yPEgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDIuLvnv6G8rbTCIL/c sbm+7ii/tb7uLMDPvu4pv6EgsPy9ySDA1rTCIA0KICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAguLnAuiC60LXpsrIguMXAzyi/+S2x3SksIL+1vu7Ar7jTv80gu/3IsL+h PC9wPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgc3R5bGU9Imxp bmUtaGVpZ2h0OjE0NSU7IG1hcmdpbi10b3A6MDsgbWFyZ2luLWJvdHRvbTowOyI+x8q/5MfR IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyLjIrSDH0SC5rsDlvr/A uyC5q7fht84gurizuyC15biusO0gwNa+7r/kLjwvcD4NCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIDxwIHN0eWxlPSJsaW5lLWhlaWdodDoxNDUlOyBtYXJnaW4tdG9w OjA7IG1hcmdpbi1ib3R0b206MDsiPiZuYnNwOzwvcD4NCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIDxwIHN0eWxlPSJsaW5lLWhlaWdodDoxNDUlOyBtYXJnaW4tdG9w OjA7IG1hcmdpbi1ib3R0b206MDsiPsCnv80gDQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICCwsMC6ILO7v+vAxyC8rbrxvbq4piC53r7Gurix4iC/+MfPvcO46SCh7Dxm b250IHNpemU9IjQiPiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwv Zm9udD48YSBocmVmPSJtYWlsdG86b2xrQG9say5jby5rciI+PGZvbnQgc2l6ZT0iNCIgY29s b3I9ImJsdWUiPjxiPm9sa0BvbGsuY28ua3I8L2I+PC9mb250PjwvYT48Zm9udCBzaXplPSI0 Ij4gDQogICAgICAgICAgICAgICAgICAgIDwvZm9udD4gDQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICCh7bfOICZxdW90Ozxmb250IGNvbG9yPSJyZWQiIHNpemU9IjQi PnllczwvZm9udD4mcXVvdDu287TCIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDwvcD4NCiAgICAgICAgICAgICAgICAgICAgPHAgc3R5bGU9ImxpbmUtaGVpZ2h0 OjE0NSU7IG1hcmdpbi10b3A6MDsgbWFyZ2luLWJvdHRvbTowOyI+s7u/68DHILTkwOXAuyDB 1r3DseIgudm2+LTPtNkuPC9wPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgPHAgc3R5bGU9ImxpbmUtaGVpZ2h0OjE0NSU7IG1hcmdpbi10b3A6MDsgbWFyZ2luLWJv dHRvbTowOyI+Jm5ic3A7PC9wPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgPHAgc3R5bGU9ImxpbmUtaGVpZ2h0OjE0NSU7IG1hcmdpbi10b3A6MDsgbWFyZ2luLWJv dHRvbTowOyI+sde4rrDtLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IMD6yPEgwPzIrSC/3LG5vu4gsK3Ax7ChILHDsd3Hz73FILrQtenAuyANCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIMCnx9gsIDHIuL+hIMfRx9i8rSCiwjxhIGhyZWY9 Imh0dHA6Ly93d3cubWFpbHRpbWVzLm5ldC9waG9uZWxlY3R1cmUvYXBwbGljYXRpb24uYXNw Ij4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICC5q7fhIL3DufywrcDH IDwvYT6iwrW1PC9wPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAg c3R5bGU9ImxpbmUtaGVpZ2h0OjE0NSU7IG1hcmdpbi10b3A6MDsgbWFyZ2luLWJvdHRvbTow OyI+vce9w8fYIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgteW4rrDt IMDWwLi0zyDH0bn4ILXpvu66uLDtIL3NwLi9w7jpIMH2sd0gDQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICC9xcO7x9ggwda8vL/kLjwvcD4NCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIDxwIHN0eWxlPSJsaW5lLWhlaWdodDoxNDUlOyBtYXJn aW4tdG9wOjA7IG1hcmdpbi1ib3R0b206MDsiPiZuYnNwOzwvcD4NCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIDxwIHN0eWxlPSJsaW5lLWhlaWdodDoxNDUlOyBtYXJn aW4tdG9wOjA7IG1hcmdpbi1ib3R0b206MDsiPrmrt+EgDQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICC9w7n8sK3AxyC9xcO7ILnmuf3AuiA8YSBocmVmPSJodHRwOi8v d3d3Lm1haWx0aW1lcy5uZXQvcGhvbmVsZWN0dXJlL2FwcGxpY2F0aW9uLmFzcCI+orogDQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDAzLD3IKK4PC9hPiDAuyDFrLiv x8+9xSDIxCCwrcDHIL3Fw7u29b+hIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgwNa0wiC9w7n8sK3AxyC9xcO7IMb7wLs8L3A+DQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICA8cCBzdHlsZT0ibGluZS1oZWlnaHQ6MTQ1JTsgbWFyZ2luLXRv cDowOyBtYXJnaW4tYm90dG9tOjA7Ij7A27y6x8+8xbytIA0KICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgurizuyDB1r3DuOkgtcu0z7TZLiAmbmJzcDu5sLfQLCDA/Mit IDAyLTU4OC0wNTEwIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgwLi3 zrW1IL3Fw7vHz73HILz2IMDWsbi/5C48L3A+DQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA8cCBzdHlsZT0ibGluZS1oZWlnaHQ6MTQ1JTsgbWFyZ2luLXRvcDowOyBt YXJnaW4tYm90dG9tOjA7Ij4mbmJzcDs8L3A+DQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA8cCBzdHlsZT0ibGluZS1oZWlnaHQ6MTQ1JTsgbWFyZ2luLXRvcDowOyBt YXJnaW4tYm90dG9tOjA7Ij6+xrmrwsm3zyANCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIMDMIMfQvcC5/cDMIG1haWxtYW4tZGV2ZWxvcGVyc7TUwMcgyLjIrSC9x7fC IMfiu/O/oSDA28C6IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgurjF xsDMILXHvvrAuLjpIMfVtM+02S48L3A+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA8cCBzdHlsZT0ibGluZS1oZWlnaHQ6MTQ1JTsgbWFyZ2luLXRvcDowOyBtYXJn aW4tYm90dG9tOjA7Ij4mbmJzcDs8L3A+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA8cCBzdHlsZT0ibGluZS1oZWlnaHQ6MTQ1JTsgbWFyZ2luLXRvcDowOyBtYXJn aW4tYm90dG9tOjA7Ij5tYWlsbWFuLWRldmVsb3BlcnO01LKytMIgDQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmtyLmdudS5vcmcvZGlyZWN0b3J5 L21haWxtYW4uaHRtbL+hIMDWtMIgwda80rimILq4sO0guN7AzyC15bfItMK1pb/kLCANCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgILrSx8q/5MfRIMGkuri/tLTZuOkg waS4uyDBy7zbx9W0z7TZLjwvcD4NCg0KDQoJDQoNCiAgICAgICAgICAgICAgICAgICAgPHAg c3R5bGU9ImxpbmUtaGVpZ2h0OjE0NSU7IG1hcmdpbi10b3A6MDsgbWFyZ2luLWJvdHRvbTow OyI+PGZvbnQgY29sb3I9InJlZCI+uN7AzyANCiAgICAgICAgICAgICAgICAgICAgvPa9xSCw xbrOuKY8L2ZvbnQ+IL/4x8+9w7jpIDxhIGhyZWY9Im1haWx0bzpvbGtAb2xrLmNvLmtyIj5v bGtAb2xrLmNvLmtyPC9hPiANCiAgICAgICAgICAgICAgICAgICAgt84gPGZvbnQgY29sb3I9 InJlZCI+W05PXTwvZm9udD4gtvO0wiC05MDlwLsgwda9w7jpILTZvcO0wiANCiAgICAgICAg ICAgICAgICAgICAgwMy3sSC43sDPwLs8L3A+DQogICAgICAgICAgICAgICAgICAgIDxwIHN0 eWxlPSJsaW5lLWhlaWdodDoxNDUlOyBtYXJnaW4tdG9wOjA7IG1hcmdpbi1ib3R0b206MDsi PrXluK7B9iANCiAgICAgICAgICAgICAgICAgICAgvsqw2r3AtM+02S48L3A+DQogICAgICAg ICAgICAgICAgICAgIDxwIHN0eWxlPSJsaW5lLWhlaWdodDoxNDUlOyBtYXJnaW4tdG9wOjA7 IG1hcmdpbi1ib3R0b206MDsiPrCou+fH1bTPtNkuPC9wPg0KPHAgc3R5bGU9ImxpbmUtaGVp Z2h0OjE0NSU7IG1hcmdpbi10b3A6MDsgbWFyZ2luLWJvdHRvbTowOyI+CQ0KICAgICAgICAg ICAgICAgICAgICAgICAgPHRkPjwvdGQ+DQo8IS0tMy4gTkhLIG5ld3MgLiCzoSDA1LTPtNku Li4gLS0+DQo8L3RhYmxlPg0KPC90ZD4NCiAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+ DQo8L3RyPg0KDQoJDQoNCg0KDQoNCjwvaHRtbD4NCiAgICAgICAgICAgIDwvdGFibGU+DQog ICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPg0KICAgIDwvdGFibGU+DQoNCiAgICAgICAg ICAgDQogICAgPC90YWJsZT4NCjwvaHRtbD4= ------=_NextPart_000_0057_01C0F02A.93A13C00-- From mrbill@mrbill.net Thu Nov 1 20:40:36 2001 From: mrbill@mrbill.net (Bill Bradford) Date: Thu, 1 Nov 2001 14:40:36 -0600 Subject: [Mailman-Developers] Official way to "move" lists? Message-ID: <20011101144036.T2885@mrbill.net> I'm moving my stuff to a newer/faster machine in a few days; is there a better "approved and recommended" way to transfer entire lists, configs, and archives over to the new machine other than just tarballing up the entire Mailman directory and FTPing it over? E.g., can I reinstall Python and MailMan on the new machine, and only move certain directories? Bill -- Bill Bradford mrbill@mrbill.net Austin, TX From jarrell@vt.edu Thu Nov 1 21:28:52 2001 From: jarrell@vt.edu (Ron Jarrell) Date: Thu, 01 Nov 2001 16:28:52 -0500 Subject: [Mailman-Developers] Official way to "move" lists? In-Reply-To: <20011101144036.T2885@mrbill.net> Message-ID: <5.1.0.14.2.20011101162817.049b9060@lennier.cc.vt.edu> At 02:40 PM 11/1/01 -0600, you wrote: >I'm moving my stuff to a newer/faster machine in a few days; is there >a better "approved and recommended" way to transfer entire lists, configs, >and archives over to the new machine other than just tarballing up the >entire Mailman directory and FTPing it over? E.g., can I reinstall Python >and MailMan on the new machine, and only move certain directories? If your paths are going to be the same, you can just tarball up and move the lists and archives directories (assuming you don't care about the old logs). From bob@nleaudio.com Fri Nov 2 06:44:24 2001 From: bob@nleaudio.com (Bob Puff@NLE) Date: Fri, 02 Nov 2001 01:44:24 -0500 Subject: [Mailman-Developers] "Digester lucked out" in bounce Message-ID: <3BE240C8.A13A05E6@nleaudio.com> What exactly does this mean in the logs/bounce file? I see this a lot. I would have assumed that it meant an address that was bouncing now seems to work. The only problem is that Mailman isn't tied into the MTA's logs to know if the message really was delivered properly.. for all it knows, a bounce could be on the way! Bob From Markus.Jansen@pac.ericsson.se Fri Nov 2 13:43:39 2001 From: Markus.Jansen@pac.ericsson.se (Markus Jansen (PAC)) Date: Fri, 2 Nov 2001 14:43:39 +0100 Subject: [Mailman-Developers] Web Authenticfication for mailing list members outside Mailman? Message-ID: <714FEAB3880CD41183B40008C791A94703B8C7F5@ESEALNT447.al.sw.ericsson.se> Hi, I am currently running both a web site and two majordomo lists. I would like to migrate to mailman, and at the same time make parts of the Web site (Apache 1.3, Solaris) accessible only for members of = one or more mailing lists (you may see them as user groups). Is there a way to reuse Mailman cookies outside the Mailman pages, or = to place these pages in a way that they are handled though Mailman security? An additional minus on my site is that I don't have experience with = Python (yet), I am just a Perl geek :-(. Any ideas are highly appreciated ... Best regards, Markus Jansen -- Markus Jansen Markus.Jansen@ericsson.com Senior Designer, Technical Coordinator Ericsson Process & Application Consulting TTM Solutions / CM Tools VH/PAC/L/TD Phone +46 8 568 61560 V=E4stberga All=E9 36A Mobile +46 70 526 = 2548 12582 Stockholm, Sweden Fax +46 8 568 61888 From andyheath2@lineone.net Fri Nov 2 14:06:27 2001 From: andyheath2@lineone.net (Andy Heath) Date: Fri, 02 Nov 2001 14:06:27 +0000 Subject: [Mailman-Developers] Web Authenticfication for mailing list members outside Mailman? References: <714FEAB3880CD41183B40008C791A94703B8C7F5@ESEALNT447.al.sw.ericsson.se> Message-ID: <3BE2A863.B24B317A@lineone.net> Well, in the absence of universal support for LDAP or similar this is a good solution and one I currently do my self with Zope and lists. One way to do this is to use something external to mailman to extract the id's and and encrypt the passwords and put it on a crontab to generate the .htaccess files. A better approach would be a generic way to interface with mailman and I *believe* 2.1 mailman supports a much better (essentially pluggable if you're a programmer) security architecture - but, its not out there in a stable well- documented way that a non-pythoneer can pick up and modify yet so meanwhile doing it completely externally will save effort (not worth hacking 2.0.x when 2.1 is on the way). Happy to mail you the script I use if it helps - its not orginal - in fact its in a patch (badly named) on sourceforge. The solution works well for me (though with Zope, not apache). Hope this helps andy > I am currently running both a web site and two majordomo lists. > I would like to migrate to mailman, and at the same time make parts > of the Web site (Apache 1.3, Solaris) accessible only for members of one or more mailing lists > (you may see them as user groups). > Is there a way to reuse Mailman cookies outside the Mailman pages, or to place these pages > in a way that they are handled though Mailman security? > > An additional minus on my site is that I don't have experience with Python (yet), > I am just a Perl geek :-(. > > Any ideas are highly appreciated ... > > Best regards, > > Markus Jansen > > -- > Markus Jansen Markus.Jansen@ericsson.com > Senior Designer, Technical Coordinator > Ericsson Process & Application Consulting > TTM Solutions / CM Tools VH/PAC/L/TD Phone +46 8 568 61560 > Västberga Allé 36A Mobile +46 70 526 2548 > 12582 Stockholm, Sweden Fax +46 8 568 61888 > > _______________________________________________ > Mailman-Developers mailing list > Mailman-Developers@python.org > http://mail.python.org/mailman/listinfo/mailman-developers -- andy ---------------------------------------------------------------------- Andy Heath, Sheffield Hallam University participating in Ctr for Educ Tech Interoperability Stds +44 (0)114 2885738 a.k.heath@shu.ac.uk From claw@2wire.com Fri Nov 2 18:57:18 2001 From: claw@2wire.com (J C Lawrence) Date: Fri, 02 Nov 2001 10:57:18 -0800 Subject: [Mailman-Developers] Re: [Mailman-Users] why can't people see my lists? In-Reply-To: Message from James Watson of "Fri, 02 Nov 2001 13:36:37 EST." <20011102133637.C31039@exodus.futuristech.net> References: <200111012222.OAA21373@utopia.West.Sun.COM> <20011102082001.A31039@exodus.futuristech.net> <12263.1004725408@2wire.com> <20011102133637.C31039@exodus.futuristech.net> Message-ID: <12463.1004727438@2wire.com> On Fri, 2 Nov 2001 13:36:37 -0500 James Watson wrote: > On Fri, Nov 02, 2001 at 10:23:28AM -0800, J C Lawrence wrote: >> Hostnames are explicitly case insensitive. Mailman flattens the >> strings prior to comparison. Example: >> >> https://www.kanga.nu/lists/listinfo/ >> https://WwW.Kanga.Nu/lists/listinfo/ > Your browser must do the flattening. With Mozilla, the above two > urls both work for me. However, with Netscape 4.77, I get the "no > advertised lists" message when using the second url. Urk. This is bad, a bug, and needs to be fixed for 2.1. -- J C Lawrence ---------(*) Satan, oscillate my metallic sonatas. claw@kanga.nu He lived as a devil, eh? http://www.kanga.nu/~claw/ Evil is a name of a foeman, as I live. From barry@zope.com Fri Nov 2 23:50:37 2001 From: barry@zope.com (Barry A. Warsaw) Date: Fri, 2 Nov 2001 18:50:37 -0500 Subject: [Mailman-Developers] Re: [Mailman-Users] why can't people see my lists? References: <200111012222.OAA21373@utopia.West.Sun.COM> <20011102082001.A31039@exodus.futuristech.net> <12263.1004725408@2wire.com> <20011102133637.C31039@exodus.futuristech.net> <12463.1004727438@2wire.com> Message-ID: <15331.12621.703529.26344@anthem.wooz.org> >>>>> "JCL" == J C Lawrence writes: JCL> Urk. Indeed! Looks like Mozilla flattens the hostname case but Lynx does not (convenient for testing! :). JCL> This is bad, a bug, and needs to be fixed for 2.1. Fixed it is. I'll simply fold to lowercase the hostname sucked out of the cgi environment before doing the checks. Thanks for forwarding this to me. -Barry From bob@nleaudio.com Sat Nov 3 08:20:50 2001 From: bob@nleaudio.com (Bob Puff@NLE) Date: Sat, 03 Nov 2001 03:20:50 -0500 Subject: [Mailman-Developers] Bounce detection Message-ID: <3BE3A8E2.CCA89F1E@nleaudio.com> Hi Gang, Just got another 40+ bounces that the 2.0.6 bounce handlers didn't pick up... There was nothing in the logs during the time I got some of the bounces, yet it does pick up on others. I suspect it's a simple string matching issue. Looked in Mailman/Bouncers, but I don't immediately see the method or order of what modules are run. What is the first module called? Barry? Bob From liuk@publinet.it Sat Nov 3 17:01:25 2001 From: liuk@publinet.it (Luca Maranzano) Date: Sat, 3 Nov 2001 18:01:25 +0100 Subject: [Mailman-Developers] Password reminder via Web for non subscribed address hits a bug Message-ID: <20011103180125.A1752@publinet.it> Hello all, I've upgraded to latest CVS this morning, and I've found the following problem: accessing via web to http://my.server.com/mailman/options/LISTNAME and inserting an email address which is *not* subscribed to LISTNAME and then pressing on the "Remind" button generates the following error: Traceback: Traceback (most recent call last): File "/home/mailman/scripts/driver", line 96, in run_main main() File "/home/mailman/Mailman/Cgi/options.py", line 145, in main mlist.MailUserPassword(user) File "/home/mailman/Mailman/Deliverer.py", line 85, in MailUserPassword assert self.isMember(user) AssertionError: May be a check to verify if the email is subscribed is missing? Regards, luca PS: may be we are almost ready for 2.1a4 or the first beta? Barry? :) From bob@nleaudio.com Sun Nov 4 08:19:02 2001 From: bob@nleaudio.com (Bob Puff@NLE) Date: Sun, 04 Nov 2001 03:19:02 -0500 Subject: [Mailman-Developers] Bounce error hangs Mailman Message-ID: <3BE4F9F6.14AB5C4D@nleaudio.com> I just discovered a show-stopper for Mailman 2.0.6: A user on one of my lists suddenly started bouncing messages. The bounce causes qrunner to die when it gets to that message, and stops processing files after that. Here's the python errors: Nov 04 02:56:01 2001 qrunner(2605): Traceback (most recent call last): Nov 04 02:56:01 2001 qrunner(2605): File "/home/csc/mailman/cron/qrunner", line 282, in ? Nov 04 02:56:01 2001 qrunner(2605): kids = main(lock) Nov 04 02:56:01 2001 qrunner(2605): File "/home/csc/mailman/cron/qrunner", line 252, in main Nov 04 02:56:01 2001 qrunner(2605): keepqueued = dispose_message(mlist, msg, msgdata) Nov 04 02:56:01 2001 qrunner(2605): File "/home/csc/mailman/cron/qrunner", line 121, in dispose_message Nov 04 02:56:01 2001 qrunner(2605): if BouncerAPI.ScanMessages(mlist, mimemsg): Nov 04 02:56:01 2001 qrunner(2605): File "/home/csc/mailman/Mailman/Bouncers/BouncerAPI.py", line 59, in ScanMessages Nov 04 02:56:01 2001 qrunner(2605): addrs = func(msg) Nov 04 02:56:01 2001 qrunner(2605): File "/home/csc/mailman/Mailman/Bouncers/DSN.py", line 46, in process Nov 04 02:56:01 2001 qrunner(2605): if string.lower(msg.gettype()) <> 'multipart/report' or \ Nov 04 02:56:01 2001 qrunner(2605): File "/usr/local/lib/python2.2/string.py", line 54, in lower Nov 04 02:56:01 2001 qrunner(2605): return s.lower() Nov 04 02:56:01 2001 qrunner(2605): AttributeError : 'NoneType' object has no attribute 'lower' And here's an example of a bounce coming from the offending user: Received: by main.nlenet.net (mbox bob) (with Cubic Circle's cucipop (v1.31 1998/05/13) Sun Nov 4 02:46:01 2001) X-From_: postmaster@btconnect.com Sun Nov 4 02:45:50 2001 >From bob Sun Nov 4 02:45:50 2001 Return-Path: Delivered-To: bob@nlenet.net Received: from c2bapps1.btconnect.com (c2bapps1.btconnect.com [193.113.209.21]) by main.nlenet.net (Postfix) with SMTP id ED8D113D126 for ; Sun, 4 Nov 2001 02:45:49 -0500 (EST) Received: from btconnect.com by c2bapps1.btconnect.com id ; Sun, 4 Nov 2001 07:45:32 +0000 Message-Type: Delivery Report X400-Received: by /ADMD= /C=WW/; Relayed; Sun, 4 Nov 2001 07:45:31 +0000 X400-Received: by mta c2bapps1-hme1 in /ADMD= /C=WW/; Relayed; Sun, 4 Nov 2001 07:45:31 +0000 X400-MTS-Identifier: [/ADMD= /C=WW/;c2bapps1.b:026710:20011104074531] From: postmaster@btconnect.com To: bob@nleaudio.com Subject: Delivery Report (failure) for pr@allen-heath.com Date: Sun, 4 Nov 2001 07:45:32 +0000 Message-ID: <"c2bapps1.b:026710:20011104074531"@btconnect.com> Content-Identifier: test MIME-Version: 1.0 Content-Type: multipart/report; boundary="---Multi-Part-Report-Level-1-1-2672" X-Mozilla-Status: 8001 X-Mozilla-Status2: 00000000 X-UIDL: 34456246710d0000 -----Multi-Part-Report-Level-1-1-2672 This report relates to your message: Subject: test, Message-ID: <3BE4F1EC.8306C281@nleaudio.com>, To: pr@allen-heath.com of Sun, 4 Nov 2001 07:45:31 +0000 Your message was not delivered to: pr@allen-heath.com for the following reason: Diagnostic was Unable to transfer, -1 Information MTA '62.6.150.133' gives error message 5.7.1 Unable to relay for pr@allen-heath.com The Original Message follows: -----Multi-Part-Report-Level-1-1-2672 Content-Type: message/delivery-status Reporting-MTA: x400; mta c2bapps1-hme1 in /ADMD= /C=WW/ Arrival-Date: Sun, 4 Nov 2001 07:45:00 +0000 DSN-Gateway: dns; c2bapps1.btconnect.com X400-Conversion-Date: Sun, 4 Nov 2001 07:45:32 +0000 Original-Envelope-Id: [/ADMD= /C=WW/;<3BE4F1EC.8306C281@nleaudio.com>] X400-Content-Identifier: test X400-Encoded-Info: ia5-text X400-Content-Correlator: Subject: test, Message-ID: <3BE4F1EC.8306C281@nleaudio.com>, To: pr@allen-heath.com Original-Recipient: rfc822; pr@allen-heath.com Final-Recipient: x400; /RFC-822=pr(a)allen-heath.com/ADMD= /C=WW/ X400-Originally-Specified-Recipient-Number: 1 Action: failed Diagnostic-Code: Reason 1 (Unable-To-Transfer); Diagnostic -1 (Unknown) Status: 5.0.0 X400-Supplementary-Info: "MTA '62.6.150.133' gives error message 5.7.1 Unable to relay for pr(a)allen-heath.com" X400-Last-Trace: Sun, 4 Nov 2001 07:45:00 +0000 -----Multi-Part-Report-Level-1-1-2672 Content-Type: message/rfc822 Received: from ns.nlenet.net by c2bapps1 with SMTP (XT-PP); Sun, 4 Nov 2001 07:45:00 +0000 Received: from nleaudio.com (66-133-142-213.roc.frontiernet.net [66.133.142.213]) by ns.nlenet.net (Postfix) with ESMTP id E354A770C for ; Sun, 4 Nov 2001 02:44:57 -0500 (EST) Message-ID: <3BE4F1EC.8306C281@nleaudio.com> Date: Sun, 04 Nov 2001 02:44:44 -0500 From: "Bob Puff@NLE" X-Mailer: Mozilla 4.78 [en] (Win95; U) X-Accept-Language: en MIME-Version: 1.0 To: pr@allen-heath.com Subject: test Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit test, please disregard. -----Multi-Part-Report-Level-1-1-2672-- This was a bomb that kept me up till the wee hours tracing down. I looked through the bug reports, found something similar, but there was no fix! Yikes! This needs fixing asap! Bob From bob@nleaudio.com Sun Nov 4 08:47:17 2001 From: bob@nleaudio.com (Bob Puff@NLE) Date: Sun, 04 Nov 2001 03:47:17 -0500 Subject: [Mailman-Developers] My "fix" for the bounce error Message-ID: <3BE50095.D96E72F5@nleaudio.com> Here's what I came up with, after reading both the messages on sourceforge and looking at the code: def process(msg): if string.lower(msg.gettype()) <> 'multipart/report': # then return None if msg.getparam('report-type') == None: # then return None if string.lower(msg.getparam('report-type')) <> 'delivery-status': # then return None boundary = msg.getparam('boundary') msg.fp.seek(0) (This is in /Mailman/Bouncers/DSN.py) This keeps the message from clogging up Mailman, but it still doesn't handle the bounce properly. I've been getting HUNDREDS of bounces in my mailbox from this one list... Barry, are there any updates available for 2.0.6 to fix this? Bob From bob@nleaudio.com Mon Nov 5 05:31:35 2001 From: bob@nleaudio.com (Bob Puff@NLE) Date: Mon, 05 Nov 2001 00:31:35 -0500 Subject: [Mailman-Developers] Fix for Postfix bounces Message-ID: <3BE62437.E4DA71CC@nleaudio.com> I just did some more digging (after seeing no replies to my messages here), and found this: My Postfix (022801) returns "multipart/report", not "multipart/mixed" that the bounce handlers were looking for. So in fixing this, as well as bringing in some of the code from 2.1, here is the patch I applied to my Mailman/Bouncers/Postfix.py file for 2.0.6: [root@list Bouncers]# diff Postfix.py.orig Postfix.py 30c30 < if msg.gettype() <> 'multipart/mixed': --- > if msg.gettype() <> 'multipart/report' and msg.gettype() <> 'multipart/mixed': 62c62 < pcre = re.compile(r'\t\t\tthe postfix program$', re.IGNORECASE) --- > pcre = re.compile(r'\t\t\tthe\s(bns)?\s*(postfix|keftamail)', re.IGNORECASE) Does this look ok? Bob From db@bibsys.no Mon Nov 5 17:01:27 2001 From: db@bibsys.no (Daniel Buchmann) Date: Mon, 05 Nov 2001 18:01:27 +0100 Subject: [Mailman-Developers] (Current CVS version) cron/mailpasswds and edit HTML errors Message-ID: <3BE6C5E7.3918B714@bibsys.no> error in cron/mailpasswds: [mailman@testbox ~]$ cron/mailpasswds Traceback (most recent call last): File "cron/mailpasswds", line 173, in ? main() File "cron/mailpasswds", line 82, in main sitelist = MailList.MailList(mm_cfg.MAILMAN_SITE_LIST, lock=0) File "/home/mailman/Mailman/MailList.py", line 100, in __init__ self.Load() File "/home/mailman/Mailman/MailList.py", line 496, in Load raise Errors.MMUnknownListError Mailman.Errors.MMUnknownListError Error when editing HTML through the web interface (after creating a new list): Traceback (most recent call last): File "/home/mailman/scripts/driver", line 96, in run_main main() File "/home/mailman/Mailman/Cgi/edithtml.py", line 118, in main ChangeHTML(mlist, cgidata, template_name, doc) File "/home/mailman/Mailman/Cgi/edithtml.py", line 155, in ChangeHTML template_name), 'w') IOError: [Errno 2] No such file or directory: '/home/mailman/lists/testliste/no/listinfo.html' ...because the language directory does not exist. After creating this directory (/home/mailman/lists/testliste/no) with the usual 02775 permissions, the editing works fine. -Daniel, Norwegian translator. From liuk@publinet.it Mon Nov 5 18:34:06 2001 From: liuk@publinet.it (Luca Maranzano) Date: Mon, 5 Nov 2001 19:34:06 +0100 Subject: [Mailman-Developers] (Current CVS version) cron/mailpasswds and edit HTML errors In-Reply-To: <3BE6C5E7.3918B714@bibsys.no> References: <3BE6C5E7.3918B714@bibsys.no> Message-ID: <20011105193406.A18620@publinet.it> On Mon, Nov 05, 2001 at 06:01:27PM +0100, Daniel Buchmann wrote: > error in cron/mailpasswds: > > [mailman@testbox ~]$ cron/mailpasswds > Traceback (most recent call last): > File "cron/mailpasswds", line 173, in ? > main() > File "cron/mailpasswds", line 82, in main > sitelist = MailList.MailList(mm_cfg.MAILMAN_SITE_LIST, lock=0) > File "/home/mailman/Mailman/MailList.py", line 100, in __init__ > self.Load() > File "/home/mailman/Mailman/MailList.py", line 496, in Load > raise Errors.MMUnknownListError > Mailman.Errors.MMUnknownListError You haven't created the list "mailman" as stated in the INSTALL, this list is used as the from address for sending out password reminder. [snip from INSTALL] - Create a "site-wide" mailing list. This is the one that password reminders will appear to come from. Usually this should be the "mailman" mailing list, but if you need to change this, be sure to change the MAILMAN_SITE_LIST variable in mm_cfg.py (see below). % bin/newlist mailman - You should then subscribe yourself to the mailman list. This should solve your problem :) Regards, Luca From barry@zope.com Mon Nov 5 23:28:11 2001 From: barry@zope.com (Barry A. Warsaw) Date: Mon, 5 Nov 2001 18:28:11 -0500 Subject: [Mailman-Developers] (Current CVS version) cron/mailpasswds and edit HTML errors References: <3BE6C5E7.3918B714@bibsys.no> Message-ID: <15335.8331.144785.408166@anthem.wooz.org> >>>>> "DB" == Daniel Buchmann writes: DB> error in cron/mailpasswds: Luca rightly points out that the MAILMAN_SITE_LIST isn't created, however mailpasswds could be a little nicer in its error messages. Now it prints a message to logs/error, and to stderr, and exits with a non-zero value, so cron should mail a notification. DB> Error when editing HTML through the web interface (after DB> creating a new list): DB> ...because the language directory does not exist. After DB> creating this directory (/home/mailman/lists/testliste/no) DB> with the usual 02775 permissions, the editing works fine. Good catch. Fixed. Thanks, -Barry From doko@cs.tu-berlin.de Mon Nov 5 23:37:06 2001 From: doko@cs.tu-berlin.de (Matthias Klose) Date: Tue, 6 Nov 2001 00:37:06 +0100 Subject: [Mailman-Developers] mailman & roxen 1.3 webserver Message-ID: <15335.8866.487710.273570@gargle.gargle.HOWL> With CVS 20011105 and roxen 1.3 I get trying to open the "Membership-Management" tab (all other admin-tabs work fine): Bug in Mailman version 2.1a3+ We're sorry, we hit a bug! If you would like to help us identify the problem, please email a copy of this page to the webmaster for this site with a description of what happened. Thanks! Traceback: Traceback (most recent call last): File "/var/lib/mailman/scripts/driver", line 96, in run_main main() File "/usr/lib/mailman/Mailman/Cgi/admin.py", line 184, in main show_results(mlist, doc, category, subcat, cgidata) File "/usr/lib/mailman/Mailman/Cgi/admin.py", line 471, in show_results form.AddItem(membership_options(mlist, subcat, cgidata, doc, form)) File "/usr/lib/mailman/Mailman/Cgi/admin.py", line 796, in membership_options qs = cgi.parse_qs(os.environ['QUERY_STRING']) File "/usr/lib/python2.1/UserDict.py", line 14, in __getitem__ def __getitem__(self, key): return self.data[key] KeyError: QUERY_STRING Python 2.1.1 SERVER_SOFTWARE Roxen Challenger/1.3.122-20 As a "plus", german umlauts aren't correctly displayed. But this may be a roxen problem as well ... From barry@zope.com Tue Nov 6 00:29:19 2001 From: barry@zope.com (Barry A. Warsaw) Date: Mon, 5 Nov 2001 19:29:19 -0500 Subject: [Mailman-Developers] Password reminder via Web for non subscribed address hits a bug References: <20011103180125.A1752@publinet.it> Message-ID: <15335.11999.119692.679032@anthem.wooz.org> >>>>> "LM" == Luca Maranzano writes: LM> I've upgraded to latest CVS this morning, and I've found the LM> following problem: LM> accessing via web to LM> http://my.server.com/mailman/options/LISTNAME and inserting an LM> email address which is *not* subscribed to LISTNAME and then LM> pressing on the "Remind" button generates the following error: LM> May be a check to verify if the email is subscribed is LM> missing? Also, you must have private rosters set. I believe I've fixed this now in cvs. LM> PS: may be we are almost ready for 2.1a4 or the first beta? LM> Barry? :) Yes, I think so, for another alpha. I want to get one or two more small features in before I go beta, but soon! Thanks, -Barry From barry@zope.com Tue Nov 6 00:37:34 2001 From: barry@zope.com (Barry A. Warsaw) Date: Mon, 5 Nov 2001 19:37:34 -0500 Subject: [Mailman-Developers] Bounce detection References: <3BE3A8E2.CCA89F1E@nleaudio.com> Message-ID: <15335.12494.382721.120375@anthem.wooz.org> >>>>> "B" == Bob writes: B> Just got another 40+ bounces that the 2.0.6 bounce handlers B> didn't pick up... There was nothing in the logs during the time B> I got some of the bounces, yet it does pick up on others. B> I suspect it's a simple string matching issue. Looked in B> Mailman/Bouncers, but I don't immediately see the method or B> order of what modules are run. What is the first module B> called? Barry? Check out BouncerAPI.py, in the ScanMessages() function. You should see the pipeline local variable which contains the list -- in order -- of the bounce detectors that are run. BTW, when running BouncerAPI.py as a script, it provides a very crude form of bouncer testing. Run it from the installed location and give it a list of message files to scan. It'll tell you what addresses it was able to pick out, and which detector did the match. -Barry From barry@zope.com Tue Nov 6 00:47:43 2001 From: barry@zope.com (Barry A. Warsaw) Date: Mon, 5 Nov 2001 19:47:43 -0500 Subject: [Mailman-Developers] Bounce error hangs Mailman References: <3BE4F9F6.14AB5C4D@nleaudio.com> Message-ID: <15335.13103.672016.75549@anthem.wooz.org> Here's a patch to at least avoid the traceback. I'm heading out in a few minutes, but I'll try to put together a real patch when I get back. This, plus the bogus cookie value DoS warrant a 2.0.7 release. -Barry -------------------- snip snip -------------------- Index: DSN.py =================================================================== RCS file: /cvsroot/mailman/mailman/Mailman/Bouncers/DSN.py,v retrieving revision 1.7.2.1 diff -u -r1.7.2.1 DSN.py --- DSN.py 2001/07/25 18:04:42 1.7.2.1 +++ DSN.py 2001/11/06 00:46:32 @@ -43,8 +43,10 @@ def process(msg): - if string.lower(msg.gettype()) <> 'multipart/report' or \ - string.lower(msg.getparam('report-type')) <> 'delivery-status': + ctype = msg.gettype() + param = msg.getparam('report-type') or '' + if string.lower(ctype) <> 'multipart/report' or \ + string.lower(param) <> 'delivery-status': # then return None boundary = msg.getparam('boundary') From barry@zope.com Tue Nov 6 04:45:55 2001 From: barry@zope.com (Barry A. Warsaw) Date: Mon, 5 Nov 2001 23:45:55 -0500 Subject: [Mailman-Developers] Re: My "fix" for the bounce error References: <3BE50095.D96E72F5@nleaudio.com> Message-ID: <15335.27395.963084.864176@anthem.wooz.org> >>>>> "B" == Bob writes: B> I've been getting HUNDREDS of bounces in my mailbox from this B> one list... Barry, are there any updates available for 2.0.6 to B> fix this? I'm nearly certain there will be a 2.0.7 which will contain the fix. Possibly tomorrow. -Barry From barry@zope.com Tue Nov 6 04:49:34 2001 From: barry@zope.com (Barry A. Warsaw) Date: Mon, 5 Nov 2001 23:49:34 -0500 Subject: [Mailman-Developers] Fix for Postfix bounces References: <3BE62437.E4DA71CC@nleaudio.com> Message-ID: <15335.27614.614716.703787@anthem.wooz.org> >>>>> "B" == Bob writes: B> I just did some more digging (after seeing no replies to my B> messages here), and found this: B> My Postfix (022801) returns "multipart/report", not B> "multipart/mixed" that the bounce handlers were looking for. B> So in fixing this, as well as bringing in some of the code from B> 2.1, here is the patch I applied to my B> Mailman/Bouncers/Postfix.py file for 2.0.6: | [root@list Bouncers]# diff Postfix.py.orig Postfix.py | 30c30 | < if msg.gettype() <> 'multipart/mixed': | --- >> if msg.gettype() <> 'multipart/report' and msg.gettype() <> >> 'multipart/mixed': B> 62c62 < pcre = re.compile(r'\t\t\tthe postfix program$', B> re.IGNORECASE) --- >> pcre = re.compile(r'\t\t\tthe\s(bns)?\s*(postfix|keftamail)', >> re.IGNORECASE) B> Does this look ok? Of hand, yes, although I don't intend to add this fix to 2.0.7. However, if you have a sample bounce message you can send me, please do. I'll add it to the 2.1 test suite. Thanks, -Barry From bob@nleaudio.com Tue Nov 6 05:53:04 2001 From: bob@nleaudio.com (Bob Puff@NLE) Date: Tue, 06 Nov 2001 00:53:04 -0500 Subject: [Mailman-Developers] Fix for Postfix bounces References: <3BE62437.E4DA71CC@nleaudio.com> <15335.27614.614716.703787@anthem.wooz.org> Message-ID: <3BE77AC0.390FFE45@nleaudio.com> Hi Barry, > although I don't intend to add this fix to 2.0.7. Umm, I would if I were you! It definitely was a major pain to get hundreds of bounces messages in my mailbox. I never had the problem before, because I always had relatively clean lists. This latest one ended up being a fairly dirty list, and my Postfix logs show -thousands- of bounces. The kicker was that I could subscribe an address of "test@test.test", and Mailman wouldn't parse the bounce message. I'm running the first release of Postfix 022801, which I downloaded 03/01/01.. :-) I know there have been several patches since then, and perhaps this multipart/report thing may have changed, but I think it warrants parsing for. Below is a sample message. Bob Received: by main.nlenet.net (mbox bob) (with Cubic Circle's cucipop (v1.31 1998/05/13) Sun Nov 4 21:16:01 2001) X-From_: csc-admin@lists.churchsoundcheck.com Sun Nov 4 13:24:01 2001 >From bob Sun Nov 4 13:24:01 2001 Return-Path: Delivered-To: bob@nlenet.net Received: from list.nlenet.net (list.nlenet.net [208.178.159.75]) by main.nlenet.net (Postfix) with ESMTP id 352A913D126 for ; Sun, 4 Nov 2001 13:24:01 -0500 (EST) Received: from list.nlenet.net (localhost.localdomain [127.0.0.1]) by list.nlenet.net (Postfix) with ESMTP id C7C8E17C008 for ; Sun, 4 Nov 2001 13:24:01 -0500 (EST) Delivered-To: csc-admin@nlenet.net Received: by list.nlenet.net (Postfix) via BOUNCE id 975AC17C00D; Sun, 4 Nov 2001 13:23:38 -0500 (EST) Date: Sun, 4 Nov 2001 13:23:38 -0500 (EST) From: MAILER-DAEMON@nlenet.net (Mail Delivery System) Subject: Undelivered Mail Returned to Sender To: csc-admin@lists.churchsoundcheck.com MIME-Version: 1.0 Content-Type: multipart/report; report-type=delivery-status; boundary="D55B717C10F.1004898218/list.nlenet.net" Message-Id: <20011104182338.975AC17C00D@list.nlenet.net> Sender: csc-owner@lists.churchsoundcheck.com Errors-To: csc-owner@lists.churchsoundcheck.com X-BeenThere: csc@lists.churchsoundcheck.com Precedence: bulk List-Unsubscribe: , List-Id: ChurchSoundcheck Technical Team List List-Help: List-Archive: X-Mozilla-Status: 8001 This is a MIME-encapsulated message. --D55B717C10F.1004898218/list.nlenet.net Content-Description: Notification Content-Type: text/plain This is the Postfix program at host list.nlenet.net. I'm sorry to have to inform you that the message returned below could not be delivered to one or more destinations. For further assistance, please send mail to If you do so, please include this problem report. You can delete your own text from the message returned below. The Postfix program : Name service error for dazzlegraphics.com: Host not found, try again --D55B717C10F.1004898218/list.nlenet.net Content-Description: Delivery error report Content-Type: message/delivery-status Reporting-MTA: dns; list.nlenet.net Arrival-Date: Thu, 1 Nov 2001 13:14:02 -0500 (EST) Final-Recipient: rfc822; tim@dazzlegraphics.com Action: failed Status: 4.0.0 Diagnostic-Code: X-Postfix; Name service error for dazzlegraphics.com: Host not found, try again --D55B717C10F.1004898218/list.nlenet.net Content-Description: Undelivered Message Content-Type: message/rfc822 Received: from list.nlenet.net (localhost.localdomain [127.0.0.1]) by list.nlenet.net (Postfix) with ESMTP id D55B717C10F; Thu, 1 Nov 2001 13:14:02 -0500 (EST) Delivered-To: csc@nlenet.net Received: from mail.mvpctoday.org (adsl-63-195-116-77.dsl.snfc21.pacbell.net [63.195.116.77]) by list.nlenet.net (Postfix) with ESMTP id 1686717C0EE for ; Thu, 1 Nov 2001 13:13:03 -0500 (EST) Received: from youthm (dhcp7.mvpctoday.org [10.1.1.107]) by mail.mvpctoday.org (8.9.3/8.9.3) with SMTP id SAA22773 for ; Thu, 1 Nov 2001 18:11:19 GMT Message-ID: <002501c16301$0d9b4040$6b01010a@mvpctoday.org> From: "Pat Carpenter" To: (etc, etc, etc...) From barry@zope.com Tue Nov 6 16:49:56 2001 From: barry@zope.com (Barry A. Warsaw) Date: Tue, 6 Nov 2001 11:49:56 -0500 Subject: [Mailman-Developers] Upgrading from 2.0b5 to 2.1a2 References: <20010726151813.F21770@xs4all.nl> Message-ID: <15336.5300.223392.108665@anthem.wooz.org> >>>>> "TW" == Thomas Wouters writes: TW> Was this with a recent CVS Snapshot ? I checked in some TW> changes that should permanently fix all these problems, and TW> Barry checked in some changes before that that made the most TW> glaring problems go away by not starting qrunner from cron TW> anymore. Also, alpha 3 should have all those changes... From db@bibsys.no Tue Nov 6 17:19:25 2001 From: db@bibsys.no (Daniel Buchmann) Date: Tue, 06 Nov 2001 18:19:25 +0100 Subject: [Mailman-Developers] cron/checkdbs error Message-ID: <3BE81B9D.F7A45FD4@bibsys.no> If there are subscription/unsubscription requests waiting, but no moderated posts waiting for approval, cron/checkdbs gives me this error: Traceback (most recent call last): File "cron/checkdbs", line 104, in ? main() File "cron/checkdbs", line 67, in main text = text + '\n' + pending_requests(mlist) File "cron/checkdbs", line 82, in pending_requests when, addr, passwd, digest, lang = mlist.GetRecord(id) ValueError: unpack tuple of wrong size This only seems to happen on newly created lists (e.g. lists that never have had any moderated posts waiting for approval). How to produce the error: 1. Create a new list, set steps required for subscription to "Require approval" or "Confirm and approve". 2. Subscribe to the list. 3. run cron/checkdbs when the subscription request is waiting for moderator approval. From claw@2wire.com Tue Nov 6 20:42:30 2001 From: claw@2wire.com (J C Lawrence) Date: Tue, 06 Nov 2001 12:42:30 -0800 Subject: [Mailman-Developers] List CGI In-Reply-To: Message from Allan Baker of "Sat, 06 Oct 2001 11:39:05 CDT." <20011006113905.4143d315.allan@caldera.com.mx> References: <20011006113905.4143d315.allan@caldera.com.mx> Message-ID: <12787.1005079350@2wire.com> On Sat, 6 Oct 2001 11:39:05 -0500 Allan Baker wrote: > As a job assignment I'm required to make a script (its highly > likely it will be with a CGI script) so that mailman mailing lists > can be created using a web page. However my idea is not to > reinvent the wheel. Is there anything like it or do I have to > start coding? Already done for 2.1 -- J C Lawrence ---------(*) Satan, oscillate my metallic sonatas. claw@kanga.nu He lived as a devil, eh? http://www.kanga.nu/~claw/ Evil is a name of a foeman, as I live. From bob@nleaudio.com Tue Nov 6 20:52:30 2001 From: bob@nleaudio.com (Bob Puff@NLE) Date: Tue, 06 Nov 2001 15:52:30 -0500 Subject: [Mailman-Developers] List CGI References: <20011006113905.4143d315.allan@caldera.com.mx> <12787.1005079350@2wire.com> Message-ID: <3BE84D8D.84B597B8@nleaudio.com> > > As a job assignment I'm required to make a script (its highly > > likely it will be with a CGI script) so that mailman mailing lists > > can be created using a web page. However my idea is not to > > reinvent the wheel. Is there anything like it or do I have to > > start coding? > > Already done for 2.1 Well, not quite. It is complete only if you are using only one domain name on your machine. If you are doing virtual hosting, you need to modify the Postfix Virtual file (if running Postfix), adding the entries in there also. I've got a script I wrote that works, but the catch is you need "mailman" or "root" permissions to execute the newlist command. (Modifying Postfix's Virtual file takes different permissions yet.) My solution is to run a cron job as root (yeah I know, security hole) that looks in a queue for stuff to do, then does it if necessary. So I have the cgi script put the appropriate data in the queue, then the cron script (which runs every few minutes) calls the necessary script to do what needs to be done, at a privilege level that makes everything work. Bob From claw@kanga.nu Tue Nov 6 22:29:37 2001 From: claw@kanga.nu (J C Lawrence) Date: Tue, 06 Nov 2001 14:29:37 -0800 Subject: [Mailman-Developers] Re: [Mailman-Users] threaded view on archive does not work In-Reply-To: Message from Lucas Hofman of "Mon, 05 Nov 2001 08:18:55 +0100." <0111051004.AA1004944569@lysntsmail.oslo.pgs.com> References: <0111051004.AA1004944569@lysntsmail.oslo.pgs.com> Message-ID: <8259.1005085777@kanga.nu> CC'ed to -developers to note that pipermail's threading seems either broken/fragile, and to note that the mbox archives for the -users list are borked (early apparency is that Pipermail is excessively restrictive on In-Reply-To header field formats). On Mon, 05 Nov 2001 08:18:55 +0100 Lucas Hofman wrote: > On Friday 02 November 2001 09:53, J C Lawrence wrote: >> On Fri, 02 Nov 2001 10:42:33 +0100 >> exmh. Quoting the headers from this very message: >> >> In-Reply-To: Message from Lucas Hofman of >> "Fri, 02 Nov 2001 10:42:33 +0100." >> <0111021004.AA1004693972@lysntsmail.oslo.pgs.com> References: >> <0111021004.AA1004693972@lysntsmail.oslo.pgs.com> > There are gone when the message arrives at my workstation (at > least, kmail 'show all headers' does not reveal them). Neither in > the copy received from your not the one sent by the list. Which is then a problem with your mail setup, and is not specific to either the mail I send, or the mailman lists at Python.Org. Quoting the full headers from another message I sent to this forum: -->-- X-envelope-from: mailman-users-admin@python.org Tue Nov 06 12:46:03 2001 Return-path: Envelope-to: claw@localhost Delivery-date: Tue, 06 Nov 2001 12:46:03 -0800 Received: from localhost [127.0.0.1] by dingo.home.kanga.nu with esmtp (Exim 3.32 #1 (Debian)) id 161D6h-0001ns-00; Tue, 06 Nov 2001 12:46:03 -0800 Delivered-to: claw@kanga.nu Received: from kanga.nu [157.22.12.214] by localhost with IMAP (fetchmail-5.9.3) for claw@localhost (single-drop); Tue, 06 Nov 2001 12:46:03 -0800 (PST) Received: from mail.python.org (mail.python.org [63.102.49.29]) by bush.kanga.nu (Postfix) with ESMTP id 4DCEE12E27 for ; Tue, 6 Nov 2001 12:44:44 -0800 (PST) Received: from localhost.localdomain ([127.0.0.1] helo=mail.python.org) by mail.python.org with esmtp (Exim 3.21 #1) id 161D30-0000fp-00; Tue, 06 Nov 2001 15:42:14 -0500 Received: from [63.203.253.2] (helo=localhost) by mail.python.org with esmtp (Exim 3.21 #1) id 161D2h-0000bB-00 for mailman-users@python.org; Tue, 06 Nov 2001 15:41:55 -0500 Received: from 2wire.com (localhost [127.0.0.1]) by localhost (Postfix) with ESMTP id 4338E129A; Tue, 6 Nov 2001 12:41:25 -0800 (PST) In-reply-to: Message from "Leonard Jacobs" of "Tue, 06 Nov 2001 13:27:57 EST." <3BE7E55D.13726.2154F0A@localhost> References: <3BE7E55D.13726.2154F0A@localhost> X-message-flag: Are you sure that Microsoft Outlook is good enough for you to use? X-accepted-file-formats: text/plain preferred, Postscript and PDF accepted - *NO* Micosoft Office files please. X-face: ?^_yw@fA`CEX&}--=*&XqXbF-oePvxaT4(kyt\nwM9]{]N!>b^K}-Mb9 YH%saz^>nq5usBlD"s{(.h'_w|U^3ldUq7wVZz$`u>MB(-4$f\a6Eu8.e=Pf\ X-image-url: http://www.kanga.nu/~claw/kanga.face.tiff X-url: http://www.kanga.nu/~claw/ Message-id: <12753.1005079285@2wire.com> Sender: mailman-users-admin@python.org Errors-to: mailman-users-admin@python.org X-beenthere: mailman-users@python.org X-mailman-version: 2.0.6 (101270) Precedence: bulk List-help: List-post: List-subscribe: , List-id: Mailman mailing list management users List-unsubscribe: , List-archive: Subject: Re: [Mailman-Users] resolving qfiles stuck in the queue From: J C Lawrence Date: Tue, 06 Nov 2001 12:41:25 -0800 To: Ljacobs@shambhala.com Cc: mailman-users@python.org -->-- Unfortunately the mbox files for the archives at python.org are borked, but checking other posts of mine there universally show correct in-Reply-To: and References: headers. eg: -->-- >From claw@kanga.nu Thu Nov 1 18:00:37 2001 From: claw@kanga.nu (J C Lawrence) Date: Thu, 01 Nov 2001 10:00:37 -0800 Subject: [Mailman-Users] threaded view on archive does not work In-Reply-To: Message from Lucas Hofman of "Thu, 01 Nov 2001 11:30:22 +0100." <0111011004.AA1004610438@lysntsmail.oslo.pgs.com> References: <0111011004.AA1004610438@lysntsmail.oslo.pgs.com> Message-ID: <29859.1004637637@kanga.nu> -->-- > Do you have any any why your messages do not hread in the mailman > user maillist archive? No. > In other words, could it be that the mail > system at python.org does not see those headers too? No. This would appear to be another Pipermail bug. As you can see here: http://www.kanga.nu/archives/MUD-Dev-L/2001Q4/thread.php#00434 my messages thread properly under MHonArc (a tool I know handles thread headers properly). -- J C Lawrence ---------(*) Satan, oscillate my metallic sonatas. claw@kanga.nu He lived as a devil, eh? http://www.kanga.nu/~claw/ Evil is a name of a foeman, as I live. From totschnig.michael@uqam.ca Wed Nov 7 01:03:40 2001 From: totschnig.michael@uqam.ca (totschnig.michael@uqam.ca) Date: Tue, 06 Nov 2001 20:03:40 -0500 Subject: [Mailman-Developers] mangling of subject header by outlook or mailman Message-ID: <861yjb1jf7.fsf@cmo.uqam.ca> Hello, I have hit a strange problem with subject headers on a fairly recent (cvs) mailman system. The problem is that when people using outlook respond on the list to a message containing 8-bit characters, the message mailman sends out is unpleasantly mangled. I do not have access to a windows system with the same outlookk version that causes the problem installed, so I could not track the problem down to see if it is generated by outlook or mailman. Maybe anybody has seen the same problem. here are the exact syptoms. When I have a thread starting with a header (in raw form) Subject: [Cmo-discussion] =?iso-8859-1?Q?N=E9tiquette?= the answer written by outlook gets the following two header lines after being distributed by mailman: Subject: [Cmo-discussion] =?iso-8859-1?Q?Re:_=5BCmo-discussion=5D_N=E9tiquette?=; Subject: [Cmo-discussion] =?iso-8859-1?Q?Re:_=5BCmo-discussion=5D_N=E9tiquette?= and the problem gets worse and worse with any subseqent reply in the thread. can anyone tell me how to find the offending part in this, and if there is a remedy in mailman. Regards, Michael From news@bcn3net.com Wed Nov 7 19:43:23 2001 From: news@bcn3net.com (BCN Ltd) Date: Wed, 7 Nov 2001 19:43:23 -0000 Subject: [Mailman-Developers] Software Development £10 per hour! Message-ID: BCN Mailer
BCN Ltd
Software Development - From £10 per hour

BCN Web Site

About Us
BCN builds corporate Intranets and Knowledge Management Solutions for small and medium sized organisations. We have delivered solutions to companies like BSI, Unilever, Compaq, and Nomura.

What's Up This Month? 
Our team of software developers have successfully developed a major enterprise information portal solution and are now ready to tackle your requirements. Development is mainly done in our office in India but managed from the UK. This combines the benefit of off-shore pricing with on-shore project management.

The Benefits For You? 
IT development often suffers from time delays and spiraling costs. Outsourcing is a proven model for at least part of your requirements. The cost benefits are outstanding and the quality and dependability are unsurpassed.


UK Software Development with Offshore Pricing

BCN has recently successfully completed a significant software development project and for a limited period can provide you with software development capability at a fraction of normal prices.

We can provide short, medium and long term resources or undertake fixed price contracts.

Tick the relevant boxes and we will contact you immediately to discuss your specific requirements.


First Name IIS/Apache WebLogic/Coldfusion
Last Name SQL/ORACLE Unix/Win2000/XP
Company XML/Php3 VB/Asp
Phone JAVA/Jsp Powerbuilder
Email CGI/Perl HTML/Javascript
Comments     
              

Normal rates for developers are up to £650 per day for senior developers - for contracts placed during the remainder of 2001 we are offering substantial savings on these rates by going offshore or if you would prefer a fixed price contract? - no problem.

BCN capabilities will enable you to:

  • Reduce the backlog
  • Reduce programming costs
  • Increase speed of delivery
  • Flexibility in resourcing

    Send an email to simon.mercer@bcn3net.com to discuss specific projects.

  •   © Copyright BCN Ltd 1999-2001 - All rights reserved.  

    From Vanessa Lintner" This is a multi-part message in MIME format --=_NextPart_2relrfksadvnqindyw3nerasdf Content-Type: multipart/alternative; boundary="=_NextPart_2altrfkindysadvnqw3nerasdf" --=_NextPart_2altrfkindysadvnqw3nerasdf Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Hello, I have visited www.list.org and noticed that your website is not listed on some search engines. I am sure that through our service the number of people who visit your website will definitely increase. SeekerCenter is a unique technology that instantly submits your website to over 500,000 search engines and directories -- a really low-cost and effective way to advertise your site. For more details please go to SeekerCenter.net. Give your web site maximum exposure today=21 I am looking forward to hearing from you. Best Regards, Vanessa Lintner Sales & Marketing www.SeekerCenter.net --=_NextPart_2altrfkindysadvnqw3nerasdf Content-Type: text/html Content-Transfer-Encoding: quoted-printable =20 =20 =20
     =20 =20 =20 =20
    =20 =20 =20

    =20 Hello,

    I have visited www.list.org and noticed that your website is not listed on some search engines. I am sure that through our service the number of people who visit your website will definitely increase. SeekerCenter=20 is a unique technology that instantly submits your website=20 to over 500,000 search engines and directories =20 -- a really low-cost and effective way to advertise your site.=20 For more details please go to SeekerCenter.net.

    Give your website maximum exposure today=21
    Looking forward to hearing from you.

    Best=20 Regards,
    Vanessa Lintner
    Sales & Marketing
    www.SeekerCenter.net

    =20 =20 =20 =20 =20 =20
    =20 =20

    =20
         
         
    =20
    --=_NextPart_2altrfkindysadvnqw3nerasdf-- --=_NextPart_2relrfksadvnqindyw3nerasdf Content-Type: application/octet-stream; name="letter_bg.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="letter_bg.jpg" Content-ID: letter_bg.jpg /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIf IiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCAFFAXUDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2aiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKA CiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiikZlUZYgD3NAC0VCbqHOAxY+igmk89 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 --=_NextPart_2relrfksadvnqindyw3nerasdf Content-Type: application/octet-stream; name="letter_bottom01.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="letter_bottom01.jpg" Content-ID: letter_bottom01.jpg /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIf IiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCABQAUYDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2aiii gBrqWRlHBIIrkrkpDM0U6/gRkEV1F1LsjC7tpfjcew7mq11dWiWbokkbMFwq5HPtTEcoX0sHHlW/ /fFN8/R/7tr7/KKvC6iK4GkxD8ahkutGtCBqGm21vGed7UAVTcaP3W2/75FNNxo5/htv++RTn1/w ipwLSBx/eVetIuueFZJFT+z4sN/EV6UAR/aNH9LX/vkUvm6X/wA8oP8AviobrxJ4Ytpdq6VDJg9V FOfx7oCRqx0nOTjAXpQA/wAzS/8Anjb/APfsUnmaX/zxt/8Av2KSTx3oEXJ0wEeu2mt8QNAXZ/xK c7vRelADi+l4/wBTB/37o36Z/wA8IP8Av3Snx3oaZ3aWFAGQSvWmnx/oKsi/2YDv7heBQAb9MPHk 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 R/38NFP2n++36UUgP//Z --=_NextPart_2relrfksadvnqindyw3nerasdf Content-Type: application/octet-stream; name="letter_left01.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="letter_left01.jpg" Content-ID: letter_left01.jpg /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIf IiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCAC5AA4DASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDpbSVp 9Ht5XOXeMFj713dp/wAekP8AuD+VcBp3/IAsz/0yFd/aDFpFn+4P5UAcBpnPh+z7/ulr0C3/AOPa L/cH8q8/0s/8U/Zf9clr0C3/AOPaL/cH8qAPPtJ/5F+x94l/pXoVv/x7Rf7g/lXnmk/8i/Yf9clr 0O3/AOPaL/cH8qAPPNHOfDun9/3S16Hb/wDHtF/uD+Ved6N/yLun/wDXJa9Et/8Aj2i/3B/KgDzr RefDunn/AKZLXotv/wAe0X+4P5V5zon/ACLunf8AXFa9Gt/+PaL/AHB/KgDznROfDunf9cVr0a3/ AOPaL/cH8q850T/kXtP7/uVr0a3/AOPaL/cH8qAPONE/5F7Tv+uS16Pb/wDHtF/uD+VecaJ/yL2n f9clr0e3/wCPeL/cH8qAPONE/wCRe0//AK4rXo8H/HvH/uD+VecaJ/yL2nf9clr0e3/494v9wfyo A830T/kXtO/65LXpFv8A8e0X+4P5V5von/Iv6d/1yWvSLf8A49ov9wfyoA830T/kX9O/65LXpFv/ AMe0X+4P5V5von/Iv6d/1yWvSLf/AI94v9wfyoA830XP/CP6f/1zWvSLf/j2i/3B/KvN9G/5AGn/ APXNa9It/wDj2i/3B/KgDzfRgf7C0/8A65LXpFv/AMe8X+4P5VwMH/HpB/uiu+t/+PaL/cH8qAP/ 2Q== --=_NextPart_2relrfksadvnqindyw3nerasdf Content-Type: application/octet-stream; name="img454.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="img454.jpg" Content-ID: Seekercenter_img454.jpg /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsK CwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQU FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAC4AQADASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD6l8P/ ALJnwauPCmkarq3w7u55LjT4Lu4v49UufLkkeJWc4FyCpJY/wge9TQfsn/Au8g82LwPZWUJZlWTU fEtyu4gAnAjuH6ZGQSpGelen6TFKPhZpM9paal9tTQoDEYXMkTt9mXB8gMQx9mTqBSaWdSsAEbQI mgmvE8yNtP2JDaBEWTbtUAsWIOOeN3UKcYyk07Hr0qFOVLmsr+v5a/12PLk/ZN+CUN4lpJ4BtNRm c7VGl+Jbh2BAOQ0clyhHQ/d3dDnGKIf2S/g1f3X2KH4Y/YLw52x6t4jnjLcZ+VIrqVzwc8gcV6S2 uahFpNjqFl4RSfWn8wT7dGliaM7C0bAkc4kYE/Mf4uhBxr3WtarDLe3sXh5VmZtyzNasjtEAqRlm 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 G7AxxRRSEf/Z --=_NextPart_2relrfksadvnqindyw3nerasdf Content-Type: application/octet-stream; name="letter_right01.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="letter_right01.jpg" Content-ID: letter_right01.jpg /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIf IiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCAC5AB8DASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD2F7dG O5co395eKbumi++vmL/eUc/lRtmh+6fNT0PUfj3qSOVJRlTyOoPBFUITzEliYowIwa5q7YpG7LwQ a6OaFCGcZVgOSvGa5y7wYJPqP50vQDpY5VkyBkMOqnqKJIVc7gSrjow60SRLJg5KsOjDqKSOVt3l yjD9iOjU/NAMaVlRo5gASDtYdG/wNc7df8e8n1H866eUAxPkdjXMXf8Ax7yfUUhnTxyCQHAII6g9 RSuiyLtYcfypksbZ8yPhx+Texp0cgkTcMg9CD1Bo80IiZ2RGjlOSVO1v73/165y7P+jSfUfzrp5l VoW3DOBkfWuXvf8Aj1k+o/nQM6yoJVMT+cmcfxqO49frU9FCYEbsGgZlOQVJBrlr/wD49JP94fzr pG/cb4z9xwSnsfSuav8A/j0k/wB4fzoEddRRRSGRzoHhYN2GRXKah/x5y/7w/nXWS/6p/wDdNcnq H/HnL/vD+dMDr6KKKQDJf9U/+6a5LUP+POX/AHh/Outl/wBU/wDumuS1H/jyl/3h/OmB2FFFFIBk v+qf/dNcjqX/AB4zZH8Q/nXXS/6p/wDdNchqX/HhN/vD+dAHZUUUUAMl/wBU/wDumuP1L/jwl/3h /Ouwl/1T/wC6a4/Uf+QfN/vD+dAHZ0UUUAMl/wBS/wDumuP1LB0+X/eH867CX/Uv/umuO1Mf8S6b /eH86YHaUUUUgI5v9RJ/un+Vcdqf/IOm/wB5f512M3+ok/3T/KuN1P8A5Bs/1X+dMDtqKKKQDJv9 RJ/un+VcXqX/ACD5/wDeX+YrtJf9S/8AumuL1L/jwuP94fzFAHb0UUUAMl/1T/7pritS/wCPC4/3 l/mK7WX/AFT/AO6a5K4+4/1/rQB//9k= --=_NextPart_2relrfksadvnqindyw3nerasdf Content-Type: application/octet-stream; name="letter_top01.jpg" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="letter_top01.jpg" Content-ID: letter_top01.jpg /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAoHBwgHBgoICAgLCgoLDhgQDg0NDh0VFhEYIx8lJCIf IiEmKzcvJik0KSEiMEExNDk7Pj4+JS5ESUM8SDc9Pjv/2wBDAQoLCw4NDhwQEBw7KCIoOzs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozv/wAARCAAPAUYDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1/NzH 1Cyj24NKtzHnD5jPowxT4pUmXchyPpSsquMMAR71XqIWlqu0JiBaFymOSp5FZs+pXDuRE4QfSkM2 qKwftd9/z8n/AL5FH2u+/wCfk/8AfIpAb1FYP2u+/wCfk/8AfIo+133/AD8/+OigDeorB+133/Px /wCOik+2X3/Pf/x0UAb9FYBvb4f8t/8Ax0U0319/z8f+OigDoaK54397/wA/H/joo+333/Px/wCO igDoaK577fff8/H/AI6KT7fff89//HRQB0VFc79vv/8AnuP++RR/aF//AM9x/wB8igDoqK5z+0L/ AP57/wDjoqpdX3iFpQbSaHy8c7xzmgDrqK5O0vteXd9smi/2fLFWf7Qv8f679BQB0dFc5/aGof8A PYfkKT+0b89Jv/HRQB0lFc3/AGjqP/PcfkKQ6lqH/PcfkKAOlormf7S1D/nuP++RR/aWo5x54/75 FFgOmormf7T1H/nuP++RSHUtR6+eP++RQB09Fcv/AGlqP/PcfkKP7S1L/nuP++RQB1FFcv8A2nqX /Pcf98ik/tPUv+e4/wC+aAOporlv7S1P/nuP++aX+1NSA5mH5CgDqKK5y01y4S4RLg+ZG52k4wQa 6OgAooooAKKKKAP/2Q== --=_NextPart_2relrfksadvnqindyw3nerasdf-- From bob@nleaudio.com Thu Nov 8 04:53:06 2001 From: bob@nleaudio.com (Bob Puff@NLE) Date: Wed, 07 Nov 2001 23:53:06 -0500 Subject: [Mailman-Developers] threaded view on archive does not work References: <0111051004.AA1004944569@lysntsmail.oslo.pgs.com> <8259.1005085777@kanga.nu> Message-ID: <3BEA0FB2.73A1147D@nleaudio.com> There's another couple things in pipermail that I also wanted to bring up. #1. Having the link to "Download the raw archive" is IMHO a serious serurity leak. This link to the .mbox file allows the user to grab every email address that has posted to the list... even if you have Mailman "remove" them. I take this out of every install I do. How many people really want a .mbox style file anyways, with all the header junk? #2. Apparently messages like mine don't wrap properly, because Pipermail uses the
     
    to display it. Would not a better approach be to simply change the font to a fixed-width style? From what I read of the HTML spec, most all html tags within the
    s still get executed.
    
    Bob
    
    
    From bob@nleaudio.com  Thu Nov  8 05:42:05 2001
    From: bob@nleaudio.com (Bob Puff@NLE)
    Date: Thu, 08 Nov 2001 00:42:05 -0500
    Subject: [Mailman-Developers] SimpleMatch.py problem
    Message-ID: <3BEA1B2D.E3CCEF96@nleaudio.com>
    
    Hi Barry & gang,
    
    I finally figured out why my few additions to SimpleMatch.py bounce messages weren't working.  It turns out that if one of the lines in one of the previous cases matches, but the other ones don't, the search is aborted immediately, instead of testing the other patterns.  I'm sure this is a simple fix, but I'm not fluent enough in Python (yet) to take a stab at this.  The offending code is:
    
      state = 0
        while 1:
            line = msg.fp.readline()
            if not line:
                break
            if state == 0:
                for scre, ecre, acre in patterns:
                    if scre.search(line):
                        state = 1
                        break
            elif state == 1:
                mo = acre.search(line)
                if mo:
                    addrs[mo.group('addr')] = 1
                elif ecre.search(line):
                    break
        return addrs.keys() or None
      
    Bob
    
    
    From teknix@alloy.net  Thu Nov  8 07:36:29 2001
    From: teknix@alloy.net (Phillip Smith)
    Date: Thu, 8 Nov 2001 02:36:29 -0500 (EST)
    Subject: [Mailman-Developers] =?X-UNKNOWN?Q?Re=3A_=5BMailman-Developers=5D_Software_Development?=
     =?X-UNKNOWN?Q?_=A310_per_hour!?=
    In-Reply-To: 
    Message-ID: 
    
    Greetings.
    
    Can anyone explain to me why this spam E-mail made it to the list?
    I see a lot of spam being sent to this list, but in this particular case,
    one of the mailing lists I run also received the same identical message..
    which I find odd.
    
    Did they intentionally target mailman powered lists?  I find it more odd
    that for both mailman-developers and my list, subscription/confirmation is
    required, but I find no trace of any addresses with the header domains or
    From: address, which would indicate to me there is some way around the
    subscription process, or that they came up with a scheme to go through
    the sub/confirm and then unsubscribe.  Seems like a lot of trouble just to
    send spam though...
    
    Am I missing something here?
    
    -phillip
    
    
    
    From mailman-dev@dark4ce.com  Thu Nov  8 13:08:41 2001
    From: mailman-dev@dark4ce.com (Hanno Liem)
    Date: Thu, 8 Nov 2001 14:08:41 +0100
    Subject: [Mailman-Developers] Problem with mailman and postfix
    Message-ID: <20011108140841.A68369@dark4ce.com>
    
    Hi,
    
    I have consulted all the online docs, but haven't been able to find anything relating to my problem. I hope someone here can help me.
    
    For some reason, mailman is unable to send outgoing email to any mailing lists.
    
    In /var/log/maillog postfix logs:
    
    Nov  8 13:47:01 shane postfix/master[24382]: warning: process /usr/local/libexec
    /postfix/local pid 61748 exit status 1
    Nov  8 13:47:01 shane postfix/master[24382]: warning: /usr/local/libexec/postfix
    /local: bad command startup -- throttling
    
    Normal mail can be sent out by shane. Only mail from postfix hangs somewhere...
    
    Any hints would be much appreciated.
    
    kind regards,
    
    Hanno Liem
    Your Choice
    
    
    From jra@baylink.com  Thu Nov  8 17:06:13 2001
    From: jra@baylink.com (Jay R. Ashworth)
    Date: Thu, 8 Nov 2001 12:06:13 -0500
    Subject: [Mailman-Developers] threaded view on archive does not work
    In-Reply-To: <3BEA0FB2.73A1147D@nleaudio.com>; from "Bob Puff@NLE"  on Wed, Nov 07, 2001 at 11:53:06PM -0500
    References: <0111051004.AA1004944569@lysntsmail.oslo.pgs.com> <8259.1005085777@kanga.nu> <3BEA0FB2.73A1147D@nleaudio.com>
    Message-ID: <20011108120613.48451@scfn.thpl.lib.fl.us>
    
    On Wed, Nov 07, 2001 at 11:53:06PM -0500, Bob Puff@NLE wrote:
    > There's another couple things in pipermail that I also wanted to bring up.
    >
    > #1. Having the link to "Download the raw archive" is IMHO a serious
    > serurity leak. This link to the .mbox file allows the user to grab
    > every email address that has posted to the list... even if you have
    > Mailman "remove" them. I take this out of every install I do. How many
    > people really want a .mbox style file anyways, with all the header
    > junk?
    
    That'd be those of us who use a Real Mail Program to handle mail and
    want to use it to sift through archives, too.
    
    > #2. Apparently messages like mine don't wrap properly, because
    > Pipermail uses the 
     
    to display it. Would not a better > approach be to simply change the font to a fixed-width style? From > what I read of the HTML spec, most all html tags within the
    s
    > still get executed.
    
    IIRC, I grabbed such an archive from some Mailman maintained list
    somewhere, and was agahst to see that *everything* in it had been
    HTMLized and PREized.  I wish I could remember where, so I could figure
    out if it was merely horribly configured...
    
    Cheers,
    -- jra
    -- 
    Jay R. Ashworth                                                jra@baylink.com
    Member of the Technical Staff     Baylink                             RFC 2100
    The Suncoast Freenet         The Things I Think
    Tampa Bay, Florida        http://baylink.pitas.com             +1 727 804 5015
    
       "If you don't have a dream; how're you gonna have a dream come true?"
         -- Captain Sensible, The Damned (from South Pacific's "Happy Talk")
    
    
    From barry@zope.com  Thu Nov  8 19:32:06 2001
    From: barry@zope.com (Barry A. Warsaw)
    Date: Thu, 8 Nov 2001 14:32:06 -0500
    Subject: [Mailman-Developers] FAQ-o-Matic
    Message-ID: <15338.56758.381047.317350@anthem.wooz.org>
    
    A while back it was suggested that we implement an on-line interactive
    FAQ, where the community can add and expand on questions.  I've now
    adapted the Python FAQ wizard to add a Mailman FAQ wizard.  See
    
        http://www.python.org/cgi-bin/faqw-mm.py
    
    There's only 3 questions and answers there so far, but you can help
    make it a better FAQ!  I'm opening up access so that anybody can add
    or change FAQ entries.  This is an honor system, and the password is
    "Mailman".
    
    Let me know if you think we need more, or different categories.
    
    Enjoy!
    -Barry
    
    
    From eds@reric.net  Thu Nov  8 21:17:29 2001
    From: eds@reric.net (Eric Seppanen)
    Date: Thu, 8 Nov 2001 15:17:29 -0600
    Subject: [Mailman-Developers] clobber_date bug
    Message-ID: <20011108151729.A21426@thud.reric.net>
    
    Hello nice Mailman folks, thanks for the great software.  I've been
    using it for over a year to run a handful of small mailing lists and
    I've always been impressed with the quality.
    
    I just noticed a small bug.  On an active list, I turned on the
    clobber_date setting (to apply the "resent" time to messages stored in
    the archives), and I noticed that it messed up the order of a bunch of
    messages in the archive.
    
    The reason is that clobber_date doesn't put the timezone information in
    the Date: field.  So it looks as though the messages are dated GMT
    instead of GMT-6, and the messages from this morning appear after those
    from the afternoon.
    
    Example message without clobber_date:
      Date: Thu, 8 Nov 2001 10:48:20 -0600
    
    Example message with clobber_date:
      Date: Thu Nov  8 13:33:00 2001
      X-Original-Date: Thu, 08 Nov 2001 13:31:30 -0600
    
    Thanks,
    Eric
    
    
    From Dan Mick   Thu Nov  8 21:59:30 2001
    From: Dan Mick  (Dan Mick)
    Date: Thu, 8 Nov 2001 13:59:30 -0800 (PST)
    Subject: [Mailman-Developers] clobber_date bug
    Message-ID: <200111082158.NAA21634@utopia.West.Sun.COM>
    
    > Hello nice Mailman folks, thanks for the great software.  I've been
    > using it for over a year to run a handful of small mailing lists and
    > I've always been impressed with the quality.
    > 
    > I just noticed a small bug.  On an active list, I turned on the
    > clobber_date setting (to apply the "resent" time to messages stored in
    > the archives), and I noticed that it messed up the order of a bunch of
    > messages in the archive.
    > 
    > The reason is that clobber_date doesn't put the timezone information in
    > the Date: field.  So it looks as though the messages are dated GMT
    > instead of GMT-6, and the messages from this morning appear after those
    > from the afternoon.
    > 
    > Example message without clobber_date:
    >   Date: Thu, 8 Nov 2001 10:48:20 -0600
    > 
    > Example message with clobber_date:
    >   Date: Thu Nov  8 13:33:00 2001
    >   X-Original-Date: Thu, 08 Nov 2001 13:31:30 -0600
    
    While clobber_date doesn't process the existing date, it
    seems to replace it by the local date (namely
    the output of ctime(time()).  That seems correct to me.
    Are you certain your local TZ is set properly?
    
    
    
    From eds@reric.net  Thu Nov  8 22:08:44 2001
    From: eds@reric.net (Eric Seppanen)
    Date: Thu, 8 Nov 2001 16:08:44 -0600
    Subject: [Mailman-Developers] clobber_date bug
    In-Reply-To: <200111082158.NAA21634@utopia.West.Sun.COM>; from dmick@utopia.West.Sun.COM on Thu, Nov 08, 2001 at 01:59:30PM -0800
    References: <200111082158.NAA21634@utopia.West.Sun.COM>
    Message-ID: <20011108160844.A21833@thud.reric.net>
    
    On Thu, Nov 08, 2001 at 01:59:30PM -0800, Dan Mick wrote:
    > > 
    > > The reason is that clobber_date doesn't put the timezone information in
    > > the Date: field.  So it looks as though the messages are dated GMT
    > > instead of GMT-6, and the messages from this morning appear after those
    > > from the afternoon.
    > > 
    > > Example message without clobber_date:
    > >   Date: Thu, 8 Nov 2001 10:48:20 -0600
    > > 
    > > Example message with clobber_date:
    > >   Date: Thu Nov  8 13:33:00 2001
    > >   X-Original-Date: Thu, 08 Nov 2001 13:31:30 -0600
    > 
    > While clobber_date doesn't process the existing date, it
    > seems to replace it by the local date (namely
    > the output of ctime(time()).  That seems correct to me.
    > Are you certain your local TZ is set properly?
    
    Using python 1.5.2, ctime() is giving local time without timezone info.
    If I use asctime(gmtime(time)) I seem to get the correct result.
    
    [eds@ike eds]$ python
    Python 1.5.2 (#1, Dec 21 2000, 15:29:08)  [GCC egcs-2.91.66
    19990314/Linux (egcs- on linux-i386
    Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
    >>> time.ctime(time.time())
    'Thu Nov  8 16:01:44 2001'
    >>> time.tzname
    ('CST', 'CDT')
    >>> time.timezone /3600
    6
    >>> time.asctime(time.gmtime(time.time()))
    'Thu Nov  8 22:06:05 2001'
    
    So it looks like my options are to use asctime(gmtime(time)) or write a
    routine that parses time.timezone into "-0600".
    
    
    From Dan Mick   Thu Nov  8 22:23:58 2001
    From: Dan Mick  (Dan Mick)
    Date: Thu, 8 Nov 2001 14:23:58 -0800 (PST)
    Subject: [Mailman-Developers] clobber_date bug
    Message-ID: <200111082223.OAA22771@utopia.West.Sun.COM>
    
    > > While clobber_date doesn't process the existing date, it
    > > seems to replace it by the local date (namely
    > > the output of ctime(time()).  That seems correct to me.
    > > Are you certain your local TZ is set properly?
    > 
    > Using python 1.5.2, ctime() is giving local time without timezone info.
    
    Good point.  It's the correct time, but it's not fully-qualified.
    I get it.
    
    > If I use asctime(gmtime(time)) I seem to get the correct result.
    > 
    > [eds@ike eds]$ python
    > Python 1.5.2 (#1, Dec 21 2000, 15:29:08)  [GCC egcs-2.91.66
    > 19990314/Linux (egcs- on linux-i386
    > Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
    > >>> time.ctime(time.time())
    > 'Thu Nov  8 16:01:44 2001'
    > >>> time.tzname
    > ('CST', 'CDT')
    > >>> time.timezone /3600
    > 6
    > >>> time.asctime(time.gmtime(time.time()))
    > 'Thu Nov  8 22:06:05 2001'
    
    Well, sorta.  You really want that TZ information appended.
    
    > So it looks like my options are to use asctime(gmtime(time)) or write a
    > routine that parses time.timezone into "-0600".
    
    Luckily 'altzone' is defined in time, so  
    
    "+%02d%02d" % (time.altzone / 3600, time.altzone % 3600)
    
    seems to do it.  But it sure looks like a bug to me.
    
    
    
    
    
    From eds@reric.net  Thu Nov  8 23:08:01 2001
    From: eds@reric.net (Eric Seppanen)
    Date: Thu, 8 Nov 2001 17:08:01 -0600
    Subject: [Mailman-Developers] clobber_date bug
    In-Reply-To: <200111082223.OAA22771@utopia.West.Sun.COM>; from dmick@utopia.West.Sun.COM on Thu, Nov 08, 2001 at 02:23:58PM -0800
    References: <200111082223.OAA22771@utopia.West.Sun.COM>
    Message-ID: <20011108170801.A22137@thud.reric.net>
    
    On Thu, Nov 08, 2001 at 02:23:58PM -0800, Dan Mick wrote:
    > 
    > > So it looks like my options are to use asctime(gmtime(time)) or write a
    > > routine that parses time.timezone into "-0600".
    > 
    > Luckily 'altzone' is defined in time, so  
    > 
    > "+%02d%02d" % (time.altzone / 3600, time.altzone % 3600)
    
    Well, that's not totally right either.  It doesn't look as though 'time'
    has a function to tell us if we're in the DST timezone or the non-DST
    timezone, so there's no way to tell if we're supposed to use 'timezone'
    or 'altzone'.  So it looks to me like using 'gmtime' is the only way to
    get the right info under all circumstances.
    
    To be totally RFC 822/2822 compliant, you could convert to GMT (using
    gmtime) and then blindly append "+0000".  But since (in 2.0.6) this only
    happens to messages on the way to being archived, it doesn't seem 
    terribly likely that message will ever be resent again.  So as long as
    the archiver is happy I'm not too concerned.
    
    Ugh.  I just noticed that RFC 2822 requires day-month-year-time order,
    while ctime and asctime produce month-day-time year order.  So looks to
    me like this is most correct:
    
    time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime(time.time()))
    
    
    
    
    From Dan Mick   Thu Nov  8 23:41:45 2001
    From: Dan Mick  (Dan Mick)
    Date: Thu, 8 Nov 2001 15:41:45 -0800 (PST)
    Subject: [Mailman-Developers] clobber_date bug
    Message-ID: <200111082340.PAA28098@utopia.West.Sun.COM>
    
    > On Thu, Nov 08, 2001 at 02:23:58PM -0800, Dan Mick wrote:
    > > 
    > > > So it looks like my options are to use asctime(gmtime(time)) or write a
    > > > routine that parses time.timezone into "-0600".
    > > 
    > > Luckily 'altzone' is defined in time, so  
    > > 
    > > "+%02d%02d" % (time.altzone / 3600, time.altzone % 3600)
    > 
    > Well, that's not totally right either.  It doesn't look as though 'time'
    > has a function to tell us if we're in the DST timezone or the non-DST
    > timezone, so there's no way to tell if we're supposed to use 'timezone'
    > or 'altzone'. 
    
    Well, there's the ninth return value of localtime().  But I'm too
    lazy to write the code to use it (as you can surely tell by
    the fact that I'm too lazy to tell the difference between
    altzone and timezone.. ;)
    
    
    > So it looks to me like using 'gmtime' is the only way to
    > get the right info under all circumstances.
    > 
    > To be totally RFC 822/2822 compliant, you could convert to GMT (using
    > gmtime) and then blindly append "+0000".  But since (in 2.0.6) this only
    > happens to messages on the way to being archived, it doesn't seem 
    > terribly likely that message will ever be resent again.  So as long as
    > the archiver is happy I'm not too concerned.
    > 
    > Ugh.  I just noticed that RFC 2822 requires day-month-year-time order,
    > while ctime and asctime produce month-day-time year order.  So looks to
    > me like this is most correct:
    > 
    > time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime(time.time()))
    
    
    
    
    From kaja@daimi.au.dk  Fri Nov  9 16:17:44 2001
    From: kaja@daimi.au.dk (Kaja P. Christiansen)
    Date: Fri, 9 Nov 2001 17:17:44 +0100
    Subject: [Mailman-Developers] Re: [Mailman-Users] FAQ-o-Matic
    In-Reply-To: <15338.56758.381047.317350@anthem.wooz.org>
    References: <15338.56758.381047.317350@anthem.wooz.org>
    Message-ID: <15340.424.7205.533860@daimi.au.dk>
    
    Barry A. Warsaw writes:
    
     >     http://www.python.org/cgi-bin/faqw-mm.py
     > 
     > There's only 3 questions and answers there so far, but you can help
     > make it a better FAQ!  I'm opening up access so that anybody can add
     > or change FAQ entries.  This is an honor system, and the password is
     > "Mailman".
     > 
     > Let me know if you think we need more, or different categories.
    
    At the time of this writing, there are already 10 questions/answers!
    I think it would great with more categories. A possible list could for 
    example be (numbers in parenthesis refer to the current questions):
    
    Introduction (or General) (1.1,1.2,1.3)
    Installation (initial, upgrading, applying patches)
    Configuring your MTA (from README's for postfix, exim, ...)
    List administration (1.5,1.8)
    Troubleshooting (1.4, 1.7, 1.9, 1.10)
    Internationalization
    Documentation
    
    
    Kaja
    
    
    
    From barry@zope.com  Fri Nov  9 16:56:16 2001
    From: barry@zope.com (Barry A. Warsaw)
    Date: Fri, 9 Nov 2001 11:56:16 -0500
    Subject: [Mailman-Developers] clobber_date bug
    References: <20011108151729.A21426@thud.reric.net>
    Message-ID: <15340.2736.351712.795244@anthem.wooz.org>
    
    >>>>> "ES" == Eric Seppanen  writes:
    
        ES> I just noticed a small bug.  On an active list, I turned on
        ES> the clobber_date setting (to apply the "resent" time to
        ES> messages stored in the archives), and I noticed that it messed
        ES> up the order of a bunch of messages in the archive.
    
        ES> The reason is that clobber_date doesn't put the timezone
        ES> information in the Date: field.  So it looks as though the
        ES> messages are dated GMT instead of GMT-6, and the messages from
        ES> this morning appear after those from the afternoon.
    
    You're right that in Mailman 2.0.x, time.ctime() is used and that
    simply doesn't produce a proper RFC 2822 date.
    
    In Mailman 2.1 however, we use email.Utils.formatdate() which is
    supposed to produce a valid RFC 2822 date, homed at GMT.  However, I
    realized that with email-0.94, email.Utils.formatdate() is simply an
    alias for rfc822.formatdate(), and the latter has not been updated to
    RFC 2822.  Although legal, rfc822.formatdate() produces dates with
    obs-zone (obsolete zone designations, e.g. GMT) instead of the now
    preferred numeric offsets from -0000.
    
    So while MM2.1's clobber_date code should be technically correct, I
    think it would be better to update email.Utils.formatdate().  Below is
    what I plan on checking into CVS.
    
    Note that this adds an optional argument `localtime' which formats the
    date based on the local timezone's daylight savings time information.
    For backwards compatibility, we use -0000 by default.  Also, in MM2.1
    I plan on leaving clobber_date to use -0000.
    
    -Barry
    
    -------------------- snip snip --------------------
    def formatdate(timeval=None, localtime=0):
        """Returns a formatted time as specified by RFC 2822, e.g.:
    
        Fri, 09 Nov 2001 01:08:47 -0000
    
        Optional timeval if given is a float time as accepted by localtime() or
        gmtime().  Optional localtime is a flag that when true, interprets and
        returns a time relative to the local timezone instead of UTC.
        """
        # Note: we cannot use strftime() because that honors the locale and RFC
        # 2822 requires that day and month names be the English abbreviations.
        if timeval is None:
            timeval = time.time()
        if localtime:
            now = time.localtime(timeval)
            # Calculate timezone offset, based on whether the local zone has
            # daylight savings time, and whether DST is in effect.
            if time.daylight and now[-1]:
                offset = time.altzone
            else:
                offset = time.timezone
            zone = '%+03d%02d' % (offset / -3600, offset % 60)
        else:
            now = time.gmtime(timeval)
            # Timezone offset is always -0000
            zone = '-0000'
        return '%s, %02d %s %04d %02d:%02d:%02d %s' % (
            ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'][now[6]],
            now[2],
            ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
             'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][now[1] - 1],
            now[0], now[3], now[4], now[5],
            zone)
    
    
    From barry@zope.com  Fri Nov  9 22:41:36 2001
    From: barry@zope.com (Barry A. Warsaw)
    Date: Fri, 9 Nov 2001 17:41:36 -0500
    Subject: [Mailman-Developers] RELEASE Mailman 2.0.7
    Message-ID: <15340.23456.886142.932986@anthem.wooz.org>
    
    Hi all,
    
    I'm releasing Mailman 2.0.7 which fixes two potential, though obscure
    security or denial-of-service attacks, along with a few other minor
    bug fixes.  Details:
    
    - If you are running Python 1.5.2, it is possible for someone to
      carefully craft some cookie data, and then trick Mailman into
      accepting that data, that will crash your Python interpreter.
    
      If you are not running Python 1.5.2, you should be invulnerable to
      the crash, however it is still possible for someone to even more
      carefully craft some cookie data that could cause arbitrary class
      constructors to be executed on the server.
    
      While I believe it is difficult to exploit this, Mailman 2.0.7
      closes this hole completely, by disabling the Cookie.py module's
      default unpickling of cookie data.
    
    - It is possible that Mailman's bounce handler could receive a bounce
      message that looked like a DSN report, but was incorrectly
      formatted.  Under Mailman 2.0.6's bounce detector, you would get a
      traceback for a message that would never be removed from the queue,
      thus potentially wedging your qrunner until the offending message
      was manually deleted.
    
      Mailman 2.0.7 fixes the DSN.py bounce detector.
    
    There are a few other useful bug fixes in this release, described in
    the NEWS excerpt below.  I recommend anybody running a version of
    Mailman up to, and including 2.0.6 to upgrade to 2.0.7.
    
    I'm releasing this version only as a tarball -- no patch file is
    provided at this time.  As of this moment, only the SourceForge site
    is up-to-date, although I expect www.list.org and www.gnu.org to
    follow soon.  The release information is available on SourceForge at:
    
        http://sourceforge.net/project/shownotes.php?release_id=60758
    
    and the file can be downloaded from:
    
        http://sourceforge.net/project/showfiles.php?group_id=103&release_id=60758
    
    See also:
    
        http://www.gnu.org/software/mailman
        http://www.list.org
        http://mailman.sf.net
    
    Cheers
    -Barry
    
    -------------------- snip snip --------------------
    2.0.7 (09-Nov-2001)
    
        Security fixes:
    
        - Closed a hole in cookie management whereby some carefully
          crafted untrusted cookie data could crash Mailman if used with
          Python 1.5.2, or cause some unintended class constructors to be
          run on the server.
    
        - In the DSN.py bounce handler, a message that was DSN-like, but
          which was missing a "report-type" parameter could cause a
          non-deletable bounce message to crash Mailman forever, requiring
          manual intervention.
    
        Bug fixes:
    
        - Stray % signs in headers and footers could cause crashes.  Now
          they'll just cause an [INVALID HEADER] or [INVALID FOOTER]
          string to be added.
    
        - The mail->news gateway has been made more robust in the face of
          duplicate headers, and reserved headers that some news servers
          reject.  If the message is still rejected, it is saved in
          $prefix/nntp instead of discarded.
    
        - Hand-crafted invalid chunk number in membership management
          display could cause a traceback.
    
    
    
    From barry@zope.com  Sat Nov 10 03:56:14 2001
    From: barry@zope.com (Barry A. Warsaw)
    Date: Fri, 9 Nov 2001 22:56:14 -0500
    Subject: [Mailman-Developers] cron/checkdbs error
    References: <3BE81B9D.F7A45FD4@bibsys.no>
    Message-ID: <15340.42334.721866.746328@anthem.wooz.org>
    
    >>>>> "DB" == Daniel Buchmann  writes:
    
        DB> If there are subscription/unsubscription requests waiting, but
        DB> no moderated posts waiting for approval, cron/checkdbs gives
        DB> me this error:
    
        DB> This only seems to happen on newly created lists (e.g. lists
        DB> that never have had any moderated posts waiting for approval).
    
    Fixed, thanks.
    
    
    From marc_news@valinux.com  Sat Nov 10 01:34:47 2001
    From: marc_news@valinux.com (Marc MERLIN)
    Date: Fri, 9 Nov 2001 17:34:47 -0800
    Subject: [Mailman-Developers] Having more than 16,000 lists
    In-Reply-To: <15322.8042.967043.536680@anthem.wooz.org>; from barry@zope.com on Fri, Oct 26, 2001 at 10:43:54PM -0400
    References: <87hesmbysl.fsf@nausicaa.interq.or.jp>  <20011026181219.O12632@magic.merlins.org> <15322.8042.967043.536680@anthem.wooz.org>
    Message-ID: <20011109173447.B32688@gandalf.merlins.org>
    
    On Fri, Oct 26, 2001 at 10:43:54PM -0400, Barry A. Warsaw wrote:
    >     MM> Just for the record, Sourceforge just hit the 16,000 lists
    >     MM> limit today and broke because ext2fs doesn't support more than
    >     MM> 32,000 links to a directory (archives/private had 32,000
    >     MM> archive dirs) I'm told freebsd's UFS has similar problems.
    > 
    > Wow, neat!  Not for you, but neat. :)
     
    BTW, I ended up removing all the HTML archive directories since I've turned
    off HTML archiving anyway.
    That gives  us a little  while (more  than six months  if we are  lucky :-D)
    before we hit the 32,000 lists mark.
    
    I'm thinking  about an optional  modification to mailman which  only affects
    list  creation that  creates  the mailman/foo/l/li/listname  dirs, and  then
    symlinks all this to mailman/foo/listname
    Yeah, symlinks aren't great, but the advantage is that it requires no other
    changes to the mailman code
    
    >     MM> Of course, that can be fixed with Residerfs/XFS/name your FS
    >     MM> here or archives/private/l/li/listname{,.mbox} but my point
    >     MM> was that if you create a directory for each attachment, you're
    >     MM> going to hit the 32,000 limit very quickly.
    > 
    > Ah, so /that's/ why we have /home/groups/m/ma/mailman... :)
     
    Yep :-)
    (it's also to allow for splitting  over more file servers and partitions and
    dealing with amanda  (backup software) very unfortunate  limitation of being
    unable to backup more than a tape's worth of data per partition)
     
    >     MM> As far as I know, most FS don't handle hundreds of thousands
    >     MM> of files in the same dir very well, but at least they handle
    >     MM> it.
    > 
    > Don't worry, we're not talking about a directory for each attachment,
    > but a directory for each message with an attachment.  Hmm, maybe we
    > /should/ worry!  32k messages with attachments sure doesn't seem all
    > that many.
    
    We'd hit that pretty quickly on SF.net :-)
    
    Marc
    -- 
    Microsoft is to operating systems & security ....
                                          .... what McDonalds is to gourmet cooking
      
    Home page: http://marc.merlins.org/   |   Finger marc_f@merlins.org for PGP key
    
    
    From bob@nleaudio.com  Sun Nov 11 21:31:11 2001
    From: bob@nleaudio.com (Bob Puff@NLE)
    Date: Sun, 11 Nov 2001 16:31:11 -0500
    Subject: [Mailman-Developers] Bounce handler problem - another one in 2.0.6
    Message-ID: <3BEEEE1F.D3100DD4@nleaudio.com>
    
    Just discovered this one:
    
    A user was subscribed to the list using some capital letters in their email address.
    Emails to ther user were bouncing, and the bounce handler did properly detect the user's address.
    However, the bounce log shows "User not a member", and shows the email in lower case.
    Other than the case, the address -is- exactly the same.  So, I assume that the mixed case is 
    the reason the bounce handler is not taking the guy out.
    
    Ideas?  Fixes?
    
    Bob
    
    
    From bob@nleaudio.com  Mon Nov 12 07:03:30 2001
    From: bob@nleaudio.com (Bob Puff@NLE)
    Date: Mon, 12 Nov 2001 02:03:30 -0500
    Subject: [Mailman-Developers] Mod to list_members to show nomail, digest types
    Message-ID: <3BEF7442.7C20EEE6@nleaudio.com>
    
    Hey gang,
    
    A while back someone requested a way to get the listing of nomail list members.  I recently needed not
    only that, but also the ability to sort out digest mime users, and digest plain text users.
    Below is a replacement list_members program (that goes in $prefix/bin) that adds four new commands 
    with which to accomplish this:
    
      -x = exclude nomail members
      -n = list only nomail members
      -m = list digest mime members
      -l = list plain text digest members
    
    This script was modified from the 2.0.6 Mailman code - NOT tested with 2.1!!!  Enjoy!
    
    Bob
    
    ========cut here=============
    #! /usr/bin/env python
    #
    # Copyright (C) 1998,1999,2000 by the Free Software Foundation, Inc.
    #
    # This program is free software; you can redistribute it and/or
    # modify it under the terms of the GNU General Public License
    # as published by the Free Software Foundation; either version 2
    # of the License, or (at your option) any later version.
    # 
    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    # GNU General Public License for more details.
    # 
    # You should have received a copy of the GNU General Public License
    # along with this program; if not, write to the Free Software 
    # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
    
    """List all the members of a mailing list.
    
    Usage: %(program)s [-o file] [-r] [-d] [-p] [-h] listname
    
    Where:
    
        -o file or --output file
            Write output to specified file instead of standard out.
    
        -r or --regular
            Print just the regular (non-digest) members.
    
        -d or --digest
            Print just the digest members.
    
        -x or --exclude
            Exclude all nomail members from list
        
        -n or --nomail
            Print only the nomail members
    
        -l or --plain
            Print only plain text digest members
    
        -m or --mime
            Print only mime digest members
    
        -p or --preserve
            Output member addresses case preserved the way they were added to the
            list.  Otherwise, addresses are printed in all lowercase.
    
        -h or --help
            Print this help message and exit.
    
        listname is the name of the mailing list to use.
    
    Note that if neither -r or -d is supplied, both regular members are printed
    first, followed by digest members, but no indication is given as to address
    status.
    
    """
    
    import sys
    import string
    import getopt
    
    import paths
    from Mailman import MailList
    from Mailman import Errors
    from Mailman import Defaults
    from Mailman import mm_cfg
    
    
    program = sys.argv[0]
    
    rmem = {}
    dmem = {}
    
    def usage(status, msg=''):
        print __doc__ % globals()
        if msg:
            print msg
        sys.exit(status)
    
    
    
    def main():
        try:
            opts, args = getopt.getopt(
                sys.argv[1:],
                'dprnmxlo:h',
                ['digest', 'regular', 'preserve', 'nomail', 'mime', 'xclude', 'plain', 'output=', 'help'])
        except getopt.error, msg:
            usage(1, msg)
    
        if len(args) <> 1:
            usage(1)
    
        listname = string.lower(args[0])
        outfile = None
        regular = None
        digest = None
        preserve = None
        nomail = None
        mimef = None
        xclude = None
        plaint = None
    
        for opt, arg in opts:
            if opt in ('-h', '--help'):
                usage(0)
            elif opt in ('-o', '--output'):
                outfile = arg
            elif opt in ('-r', '--regular'):
                regular = 1
            elif opt in ('-d', '--digest'):
                digest = 1
            elif opt in ('-p', '--preserve'):
                preserve = 1
            elif opt in ('-n', '--nomail'):
                nomail = 1
            elif opt in ('-m', '--mime'):
                mimef = 1
            elif opt in ('-x', '--exclude-nomail'):
                xclude = 1
            elif opt in ('-l', '--plain'):
                plaint = 1
        if plaint:
            digest = 1
        if mimef:
            digest = 1
        if regular is None and digest is None:
            regular = digest = 1
        if xclude is None and nomail is None:
            xclude = nomail = 1
        if mimef is None and plaint is None:
            mimef = plaint = 1 
    
        if outfile:
            try:
                fp = open(outfile, 'w')
            except IOError:
                print 'Could not open file for writing:', outfile
                sys.exit(1)
        else:
            fp = sys.stdout
    
        try:
            mlist = MailList.MailList(listname, lock=0)
        except Errors.MMListError, e:
            print 'No such list "%s"\n%s' % (listname, e)
            sys.exit(1)
    
        # filters for recipient calculation
        def delivery_enabled_p(x, s=mlist, v=mm_cfg.DisableDelivery):
            return not s.GetUserOption(x, v)
        def delivery_disabled_p(x, s=mlist, v=mm_cfg.DisableDelivery):
            return s.GetUserOption(x, v)
        def likes_mime_p(x, s=mlist, v=mm_cfg.DisableMime):
            return not s.GetUserOption(x, v)
        def hates_mime_p(x, s=mlist, v=mm_cfg.DisableMime):
            return s.GetUserOption(x, v)   
    
        if preserve:
             for addr in mlist.GetDeliveryMembers():
                 rmem[addr] = addr
             for addr in mlist.GetDigestDeliveryMembers():
                 dmem[addr] = addr
        else:
             for addr in mlist.GetMembers():
                 rmem[addr] = addr
             for addr in mlist.GetDigestMembers():
                 dmem[addr] = addr
    
        rmembers = filter(delivery_enabled_p, rmem.keys())
        rnomembers = filter(delivery_disabled_p, rmem.keys())
        dmem2 = filter(delivery_enabled_p, dmem.keys())
        dmembers = filter(hates_mime_p, dmem2)
        dmime = filter(likes_mime_p, dmem2)
        dmem2 = filter(delivery_disabled_p, dmem.keys())
        dnomembers = filter(hates_mime_p, dmem2)
        dnomime = filter(likes_mime_p, dmem2)
    
        stdout = sys.stdout
        try:
            sys.stdout = fp
            if regular:
                if xclude:
                    for addr in rmembers:
                        print addr
                if nomail:
                    for addr in rnomembers:
                        print addr
            if digest:
                if xclude:
                    if plaint:
                        for addr in dmembers:
                            print addr
                    if mimef:
                        for addr in dmime:
                            print addr
                if nomail:
                    if plaint:
                        for addr in dnomembers:
                            print addr
                    if mimef:
                        for addr in dnomime:
                            print addr
    
        finally:
            sys.stdout = stdout
    
    
    if __name__ == '__main__':
        main()
    
    
    From totschnig.michael@uqam.ca  Mon Nov 12 11:37:14 2001
    From: totschnig.michael@uqam.ca (totschnig.michael@uqam.ca)
    Date: Mon, 12 Nov 2001 06:37:14 -0500
    Subject: [Mailman-Developers] Re: mangling of subject header by outlook or mailman
    In-Reply-To: <861yjb1jf7.fsf@cmo.uqam.ca> (totschnig.michael@uqam.ca's
     message of "Tue, 06 Nov 2001 20:03:40 -0500")
    References: <861yjb1jf7.fsf@cmo.uqam.ca>
    Message-ID: <86y9lccj9x.fsf@cmo.uqam.ca>
    
    Hello,
    
    sorry for following up to my own message, but with the help of a
    friend using outlook, I could gather data that helps describe the
    problem more precisely.
    
    1) when sending a mail to a mailman list with the title
    "test de deboguage des =E9 et =E8 dans le header subject" which gets
    encoded by Pine as=20
    
    Subject: =3D?ISO-8859-1?Q?test_de_deboguage_des_=3DE9_et_=3DE8_dans_le?=3D
     =3D?ISO-8859-1?Q?_header_subject?=3D
    
    2) mailman generates=20
    
    Subject: [Test] =3D?ISO-8859-1?Q?test_de_deboguage_des_=3DE9_et_=3DE8_dan=
    s_le?=3D
     =3D?ISO-8859-1?Q?_header_subject?=3D
    
    3) a user of outlookexpress 5 replies both directly and via the
    list. the direct reply has the following header:
       =20
    Subject: =3D?iso-8859-1?Q?Re:_=3D5BTest=3D5D_test_de_deboguage_des_=3DE9_=
    et_=3DE8_dans_le_he?=3D
    	=3D?iso-8859-1?Q?ader_subject?=3D
    
    which still gets correctly decoded by mail readers.
    
    4) but the mail transmitted by mailman gets the following headers.=20
    
    Subject: [Test] =3D?iso-8859-1?Q?Re:_=3D5BTest=3D5D_test_de_deboguage_des=
    _=3DE9_et_=3DE8_dans_le_he?=3D
    	=3D?iso-8859-1?Q?ader_subject?=3D;
    	Subject: [Test] =3D?iso-8859-1?Q?Re:_=3D5BTest=3D5D_test_de_deboguage_de=
    s_=3DE9_et_=3DE8_dans_le_he?=3D
    	=3D?iso-8859-1?Q?ader_subject?=3D;
    		=3D?iso-8859-1?Q?ader_subject?=3D
    
    i do not know the standards about encoding of headers, but i think
    there is a problem with the header generated by mailman. i rgret not
    being component enough to contribute more to debug it.
    
    regards, michael
    
    
    From tkikuchi@is.kochi-u.ac.jp  Mon Nov 12 13:19:16 2001
    From: tkikuchi@is.kochi-u.ac.jp (Tokio Kikuchi)
    Date: Mon, 12 Nov 2001 22:19:16 +0900
    Subject: [Mailman-Developers] Re: mangling of subject header by outlook or
     mailman
    References: <861yjb1jf7.fsf@cmo.uqam.ca> <86y9lccj9x.fsf@cmo.uqam.ca>
    Message-ID: <3BEFCC54.7BD9A756@is.kochi-u.ac.jp>
    
    Hi,
    
    totschnig.michael@uqam.ca wrote:
    > 
    
    > 3) a user of outlookexpress 5 replies both directly and via the
    > list. the direct reply has the following header:
    > 
    > Subject: =?iso-8859-1?Q?Re:_=5BTest=5D_test_de_deboguage_des_=E9_et_=E8_dans_le_he?=
    >         =?iso-8859-1?Q?ader_subject?=
    > 
    > which still gets correctly decoded by mail readers.
    
    How other mailers do with this phase of subject ?
    
    This problem has long been known to Japanese mailing list owners
    and we solved this problem by decoding the MIME header _before_
    adding the list prefix and then re-encoding the subject into MIME.
    
    I wrote a module to convert the incoming Japanese mail into EUC
    while decoding the MIME headers. All the outgoing messages should
    be encoded in MIME scheme and I also wrote one to do this.
    They are integrated into Japanese Mailman;
       http://mm.tkikuchi.net/mailman-2.0.7+J2.20011112.tar.gz
    
    May be we should `canonicalize' all the message upon entering 
    the Mailman processing pipeline and encode into appropriate charset
    when going out through SMTP/NNTP/HTTP.
    
    How about canonicalizing into Unicode, since Japanese and Chinese
    must be properly treated ?
    
    --
    Tokio
    
    
    From db@bibsys.no  Mon Nov 12 13:34:15 2001
    From: db@bibsys.no (Daniel Buchmann)
    Date: Mon, 12 Nov 2001 14:34:15 +0100
    Subject: [Mailman-Developers] A few bugs and some thoughts
    Message-ID: <3BEFCFD7.6FE1C5BF@bibsys.no>
    
    [this is all about latest CVS, MM2.1a3+]
    
    1. A bug:
       If digest-mode is disabled for a list, and a member
       tries to turn it on, a Mailman bug appears:
    
    Traceback (most recent call last):
      File "/home/mailman/scripts/driver", line 96, in run_main
        main()
      File "/home/mailman/Mailman/Cgi/options.py", line 456, in main
        mlist.setMemberOption(user, flag, newval)
      File "/home/mailman/Mailman/OldStyleMemberships.py", line 242, in
    setMemberOption
        raise Errors.CantDigestError
    CantDigestError
    
       And the same occurs the other way around (if only digest mode
       is enabled, and a member tries to turn it off):
    
    Traceback (most recent call last):
      File "/home/mailman/scripts/driver", line 96, in run_main
        main()
      File "/home/mailman/Mailman/Cgi/options.py", line 456, in main
        mlist.setMemberOption(user, flag, newval)
      File "/home/mailman/Mailman/OldStyleMemberships.py", line 254, in
    setMemberOption
        raise Errors.MustDigestError
    MustDigestError
    
       IMHO, I think a user should not be able to choose between normal and
       digest mode if only one of them are available. (The choice shouldn't
       appear at all on their personal memberpage.)
    
    
    2. Another bug?:
       Held postings for a list are not deleted when the list
       is deleted (e.g. with the rmlist command.)
       A .pck file for each held posting is still around in the
       data/ directory. Maybe this is true for pending subscriptions as well?
    
    
    3. A feature request:
       It would be really great if the text boxes on the [Sender filters]
       page in addition could accept domain names (or maybe regexps?) instead
       of email address only. Example:
       I have several lists where posters would only come from the .no domain.
       To reduce spam, non-member postings are held for approval.
       If I could set Mailman to auto-approve postings from .no, and
       auto-discard all other postings, the list moderators of these lists
       would be _very_ happy... ;)
    
    4. I'm also experiencing the same problem as totschnig.michael@uqam.ca in
       hist post "mangling of subject header by outlook or mailman".
       I have Mailman 2.1a3+ on two different linux boxes. I have a test list
       with the same name and the same config on both. The problem only
       occurs on one of them! Both Mailman installations are the same version
       (latest CVS) with the same config.
       If anyone has any idea of where I might look for differences in the two
       installations, let me know... maybe I could find out what causes it..
       :)
    
    
    From bob@nleaudio.com  Mon Nov 12 18:46:08 2001
    From: bob@nleaudio.com (Bob Puff@NLE)
    Date: Mon, 12 Nov 2001 13:46:08 -0500
    Subject: [Mailman-Developers] Other Bounce issues with 2.0.6
    Message-ID: <3BF018F0.818F132C@nleaudio.com>
    
    Hi Gang,
    
    Ok, here's an interesting situation:
    On 11/03, hotmail was down for a bit, bouncing messages.  Mailman bounce logs confirm this.  They came back up, and all was well.
    
    On 11/08, 5 days later, they had the same problem - bounced some messages.  Later they fixed the problem.
    
    However, Mailman saw the bounces coming in 5 days later, and did its thing removing the people.  It didn't realize that there were no bounces in between.
    
    How long is the bounce database held?  In other words, what happens if a single bounce happens, then 7 days go by, and another single bounce occurs.  Will it see this and disable the user?  Or does it only look at the 5th day?  What happens on a busy list?  What about a list that gets a post every couple weeks?
    
    Bob
    
    
    From brandon@roguetrader.com  Mon Nov 12 22:12:48 2001
    From: brandon@roguetrader.com (brandon@roguetrader.com)
    Date: Mon, 12 Nov 2001 15:12:48 -0700
    Subject: [Mailman-Developers] Problem with lockfiles and time in the future
    Message-ID: <20011112151248.A22140@mojo.cold.org>
    
    I am having a very odd situation with lock files.  My entire mailman
    system suddenly stopped working a few days ago, and I have tracked it
    down to the lockfiles.  In the logs, nothing is able to get a lock.
    What I have noticed is the timestamp on the lock file is exactly 10
    hours in the future from the current time, when it tried to get the
    lock.  This is not a problem with cron or the OS time setting, as I
    setup another job in cron exactly like qrunner but through bourne
    shell, and it reports time properly, so something from python on down
    is causing it to do this oddly.  Does anybody have any idea what this
    could be?  Where I can start digging?  I am running mailman 2.0.6 on
    Solaris 8, x86.
    
    -Brandon Gillespie
    
    (BTW, please CC me on any response as I am not on the mailing list)
    
    
    From Dan Mick   Mon Nov 12 22:24:04 2001
    From: Dan Mick  (Dan Mick)
    Date: Mon, 12 Nov 2001 14:24:04 -0800 (PST)
    Subject: [Mailman-Developers] Problem with lockfiles and time in the future
    Message-ID: <200111122224.OAA18230@utopia.West.Sun.COM>
    
    The lock date is set into the future on purpose, so that eventually
    stale locks can be automatically reclaimed.
    
    Some process died holding a lock.  Remove it and drive on if you're
    sure that process is dead.
    
    > I am having a very odd situation with lock files.  My entire mailman
    > system suddenly stopped working a few days ago, and I have tracked it
    > down to the lockfiles.  In the logs, nothing is able to get a lock.
    > What I have noticed is the timestamp on the lock file is exactly 10
    > hours in the future from the current time, when it tried to get the
    > lock.  This is not a problem with cron or the OS time setting, as I
    > setup another job in cron exactly like qrunner but through bourne
    > shell, and it reports time properly, so something from python on down
    > is causing it to do this oddly.  Does anybody have any idea what this
    > could be?  Where I can start digging?  I am running mailman 2.0.6 on
    > Solaris 8, x86.
    > 
    > -Brandon Gillespie
    > 
    > (BTW, please CC me on any response as I am not on the mailing list)
    > 
    > _______________________________________________
    > Mailman-Developers mailing list
    > Mailman-Developers@python.org
    > http://mail.python.org/mailman/listinfo/mailman-developers
    
    
    
    From brandon@roguetrader.com  Mon Nov 12 22:40:15 2001
    From: brandon@roguetrader.com (brandon@roguetrader.com)
    Date: Mon, 12 Nov 2001 15:40:15 -0700
    Subject: [Mailman-Developers] Re: Problem with lockfiles and time in the future
    Message-ID: <20011112154015.A22389@mojo.cold.org>
    
    Dan Mick said:
    > The lock date is set into the future on purpose, so that eventually
    > stale locks can be automatically reclaimed.
    > 
    > Some process died holding a lock.  Remove it and drive on if you're
    > sure that process is dead.
    
    I have tried that actually, and have nuked the lockfiles and re-run
    the processes, still no go; new locks appear and the processes just
    hang again, eventually printing something to the logfile saying that
    it cannot get a lock.  I am totally at loss now, if you are saying the
    future timestamp is intentional.
    
    -Brandon Gillespie
    
    
    From cdy@algonet.se  Tue Nov 13 10:31:58 2001
    From: cdy@algonet.se (Calle Dybedahl)
    Date: 13 Nov 2001 11:31:58 +0100
    Subject: [Mailman-Developers] Re: [Mailman-Announce] RELEASE Mailman 2.0.7
    In-Reply-To: <15340.23456.886142.932986@anthem.wooz.org>
    References: <15340.23456.886142.932986@anthem.wooz.org>
    Message-ID: <86itcfezc1.fsf@tezcatlipoca.algonet.se>
    
    >>>>> "BAW" == Barry A Warsaw  writes:
    
    > I'm releasing Mailman 2.0.7 which fixes two potential, though obscure
    > security or denial-of-service attacks, along with a few other minor
    > bug fixes.  Details:
    
    Hello. Remember me? I nagged you a few months ago about getting some
    code we had written into Mailman. I got the impression that I'd hear
    from you or the FSF again regarding giving the copyright to the FSF,
    but I haven't heard anything so far. Did the issue fall by the
    wayside, or did something go wrong? Is it still any point in giving
    you code that was written for 2.0?
    -- 
          Calle Dybedahl | UNIX-admin | Telenordia Internet | cdy@algonet.se
    
    
    From totschnig.michael@uqam.ca  Tue Nov 13 15:34:02 2001
    From: totschnig.michael@uqam.ca (totschnig.michael@uqam.ca)
    Date: Tue, 13 Nov 2001 10:34:02 -0500
    Subject: [Mailman-Developers] Re: mangling of subject header by outlook or  mailman
    In-Reply-To: <3BEFCC54.7BD9A756@is.kochi-u.ac.jp> (Tokio Kikuchi's message
     of "Mon, 12 Nov 2001 22:19:16 +0900")
    References: <861yjb1jf7.fsf@cmo.uqam.ca> <86y9lccj9x.fsf@cmo.uqam.ca>
     <3BEFCC54.7BD9A756@is.kochi-u.ac.jp>
    Message-ID: <86lmhay9at.fsf@cmo.uqam.ca>
    
    Hello,
    
    Tokio Kikuchi  a =E9crit:
    
    >> 3) a user of outlookexpress 5 replies both directly and via the
    >> list. the direct reply has the following header:
    >>=20
    >> Subject: =3D?iso-8859-1?Q?Re:_=3D5BTest=3D5D_test_de_deboguage_des_=3D=
    E9_et_=3DE8_dans_le_he?=3D
    >>         =3D?iso-8859-1?Q?ader_subject?=3D
    >>=20
    >> which still gets correctly decoded by mail readers.
    >
    > How other mailers do with this phase of subject ?
    
    I tested pine and gnus:
    
    pine creates:
    
    Subject: Re: [Test] =3D?ISO-8859-1?Q?test_de_deboguage_des_=3DE9_et_=3DE8=
    _dans_le
     ?=3D =3D?ISO-8859-1?Q?_header_subject?=3D
    
    which seems delivered unchanged by Mailman:
    
    Subject: Re: [Test] =3D?ISO-8859-1?Q?test_de_deboguage_des_=3DE9_et_=3DE8=
    _dans_le
     ?=3D =3D?ISO-8859-1?Q?_header_subject?=3D
    
    gnus creates (if configured to strip list-identifiers) :
    
    Subject: Re: test de deboguage des =3D?iso-8859-1?q?=3DE9?=3D et
     =3D?iso-8859-1?q?=3DE8?=3D dans le header subject
    
    which when delivered by mailman becomes
    
    Subject: [Test] Re: test de deboguage des =3D?iso-8859-1?q?=3DE9?=3D et
     =3D?iso-8859-1?q?=3DE8?=3D dans le header subject
    
    >
    > This problem has long been known to Japanese mailing list owners
    > and we solved this problem by decoding the MIME header _before_
    > adding the list prefix and then re-encoding the subject into MIME.
    >
    > I wrote a module to convert the incoming Japanese mail into EUC
    > while decoding the MIME headers. All the outgoing messages should
    > be encoded in MIME scheme and I also wrote one to do this.
    > They are integrated into Japanese Mailman;
    >    http://mm.tkikuchi.net/mailman-2.0.7+J2.20011112.tar.gz
    
    this seems the right thing to do also for latin-1 or other encodings ,
    is there any chance of getting it integrated to the mainstream
    mailman? But I have no idea of the complexity of the task.
    
    Michael
    
    
    
    From jmasterson@modwest.com  Tue Nov 13 17:46:05 2001
    From: jmasterson@modwest.com (John Masterson)
    Date: Tue, 13 Nov 2001 09:46:05 -0800
    Subject: [Mailman-Developers] hanging subscribe requests
    Message-ID: <00c801c16c6b$11c63f30$8100000a@magnafix>
    
    Hello,
    
    I've posted my problem twice to mail-users to no avail. I apologize in
    advance if this is not the appropriate forum for this report.
    
    Running Redhat 6.2, Python 2.1.1, Mailman 2.0.6, Apache 1.3.20
    
    The Mailman web interface mostly works fine. However, when someone attempts
    to subscribe to a list, the page hangs and spins and results in "Document
    contains no data" (Netscape) or "Cannot find server/DNS error" (IE).
    
    This generally starts 1-3 python subscribe processes which persist for 30
    seconds or so and then fire off the confirmation of (1-3) subscription
    notice(s).
    
    This behavior can be experienced here:
    
    http://www.montananorml.org/mailman/listinfo/mtnorml-list
    
    Thanks for any tips. We have recompiled, reinstalled, etc, several times.
    
    
    --
    John Masterson
    Modwest
    Powerful, Affordable Web Hosting
    http://www.modwest.com
    406.541.4678
    
    
    
    From che@debian.org  Wed Nov 14 10:21:43 2001
    From: che@debian.org (Ben Gertzfield)
    Date: Wed, 14 Nov 2001 19:21:43 +0900
    Subject: [Mailman-Developers] [PATCH] Header q-p/base64 RFC 2047 encoding for email module
    Message-ID: <87u1vxr6tk.fsf@nausicaa.interq.or.jp>
    
    The following patch to the email module implements the RFC
    2047-specified Base64 and quoted-printable (called "B" and "Q"
    encoding by the RFC) for header-safe encoding of 8-bit strings, for
    From:, To:, Subject:, and other fields.  
    
    It includes charset information within the encoded strings themselves,
    which, along with the special line-wrapping algorithm needed for B and
    Q encoding, make this a very useful general feature for
    internationalized Python email programs.
    
    Most MIME-aware mail readers in use today understand the RFC 2047
    convention, and in the East Asian world, it's 100% necessary to send
    subject and address fields in Base64 encoding.
    
    Mailman needs this functionality in order to send out localized
    emails from the virgin queue; without it, it's very possible that 
    8-bit characters will be blindly placed into the Subject: and To:
    fields.  This also allows localized List-Id fields, as a bonus!
    
    This patch adds the following functions to email.Utils:
    
    encode_address(real_name, address, charset="iso-8859-1", encoding=QP):
        MIME-encode a header field intended for an address (from, to, cc, etc.)
    
    encode_header(header, charset="iso-8859-1", encoding=QP):
        MIME-encode a general email header field (eg. Subject).
    
    encode_header_chunks(header_chunks):
        MIME-encode a header with many different charsets and/or encodings.
    
    It also adds the following support functions to email.Encoders.  
    
    header_qencode(header, charset="iso-8859-1", maxlinelen=75):
        Encode a header line with quoted-printable (like) encoding.
    
    header_bencode(header, charset, maxlinelen=75):
        Encode a header line with Base64 encoding and a charset specification.
    
    I needed to re-implement the quoted-printable algorithm in
    header_qincode because the "Q" encoding specified by RFC 2045 is
    different in a few key areas from the one implemented in quopri.py,
    and the line-wrapping at 75 characters got too hairy with just
    quopri.py.
    
    Patch follows, against email 0.95. (Sorry, I tried CVS, but I didn't
    want to install Python 2.2 beta just yet.)
    
    I will work on integrating this into Mailman tomorrow.
    
    diff -ruN email.orig/Encoders.py email/Encoders.py
    --- email.orig/Encoders.py	Tue Oct  2 04:29:38 2001
    +++ email/Encoders.py	Wed Nov 14 19:07:24 2001
    @@ -6,8 +6,10 @@
     
     import base64
     import quopri
    +from binascii import b2a_base64
     from cStringIO import StringIO
     
    +CRLFSPACE = "\015\012 "
     
     
     # Helpers
    @@ -24,6 +26,15 @@
             return value[:-1]
         return value
     
    +def _max_append(list, str, maxlen):
    +    if len(list) == 0:
    +        list.append(str)
    +        return
    +    
    +    if len(list[-1] + str) < maxlen:
    +        list[-1] += str
    +    else:
    +        list.append(str)
     
     def _bencode(s):
         # We can't quite use base64.encodestring() since it tacks on a "courtesy
    @@ -78,3 +89,91 @@
     
     def encode_noop(msg):
         """Do nothing."""
    +
    +
    +def header_qencode(header, charset="iso-8859-1", maxlinelen=75):
    +    """Encode a header line with quoted-printable (like) encoding.
    +
    +    Defined in RFC 2045, this "Q" encoding is similar to
    +    quoted-printable, but used specifically for email header fields to
    +    allow charsets with mostly 7 bit characters (and some 8 bit) to
    +    remain more or less readable in non-RFC 2045 aware mail clients.    
    +
    +    The resulting string will be in the form:
    +
    +    "=?charset?q?I_f=E2rt_in_your_g=E8n=E8ral_dire=E7tion?=\r\n
    +      =?charset?q?Silly_=C8nglish_Kn=EEghts?="
    +
    +    with each line wrapped safely at, at most, maxlinelen characters.
    +    It is safe to use verbatim in any email header field, as the
    +    wrapping is performed in a quoted-printable aware way and each
    +    linefeed is a \r\n.
    +
    +    charset defaults to "iso-8859-1", and maxlinelen defaults to 75
    +    characters.
    +    """
    +    quoted = []
    +
    +    # =? plus ?q? plus ?= is 7 characters
    +    maxlen = maxlinelen - len(charset) - 7
    +    
    +    for c in header:
    +        # Space may be represented as _ instead of =20 for readability
    +        if c == ' ':
    +            _max_append(quoted, "_", maxlen)
    +        # These characters can be included verbatim
    +        elif ((c >= 'a' and c <= 'z') or (c >= 'A' and c <= 'Z') or
    +              (c >= '0' and c <= '9') or (c in ('!', '*', '+', '-', '/'))):
    +            _max_append(quoted, c, maxlen)
    +        # Otherwise, replace with hex value like =E2
    +        else:
    +            _max_append(quoted, "=%02X" % (ord(c)), maxlen)
    +
    +    encoded = ""
    +
    +    for q in quoted:
    +        # Any chunk past the fir7st must start with "\r\n "
    +        if len(encoded) > 0:
    +            encoded += CRLFSPACE
    +        encoded += "=?%s?q?%s?=" % (charset, q)
    +
    +    return encoded
    +
    +def header_bencode(header, charset, maxlinelen=75):
    +    """Encode a header line with Base64 encoding and a charset specification.
    +    
    +    Defined in RFC 2045, this Base64 encoding is identical to normal
    +    Base64 encoding, except that each line must be intelligently
    +    wrapped (respecting the Base64 encoding), and subsequent lines must
    +    start with a space.  
    +
    +    The resulting string will be in the form:
    +
    +    "=?charset?b?WW/5ciBtYXp66XLrIHf8eiBhIGhhbXBzdGHuciBBIFlv+XIgbWF6euly?=\r\n
    +      =?charset?b?6yB3/HogYSBoYW1wc3Rh7nIgQkMgWW/5ciBtYXp66XLrIHf8eiBhIGhh?="
    +      
    +    with each line wrapped at, at most, maxlinelen characters. It is
    +    safe to use verbatim in any email header field, as the wrapping is
    +    performed in a quoted-printable aware way and each linefeed is a
    +    \r\n.
    +
    +    charset defaults to "iso-8859-1", and maxlinelen defaults to 75
    +    characters.
    +    """
    +    base64ed = []
    +
    +    maxlen = ((maxlinelen - len(charset) - 7) / 4) * 3
    +    num_lines = (len(header) / maxlen) + 1
    +
    +    for i in xrange(0, num_lines):
    +        base64ed.append(b2a_base64(header[i*maxlen:(i+1)*maxlen]))
    +
    +    encoded = ""
    +
    +    for b in base64ed:
    +        if len(encoded) > 0:
    +            encoded += CRLFSPACE
    +        # We ignore the last character of each line, which is a \n.
    +        encoded += "=?%s?b?%s?=" % (charset, b[:-1])
    +
    +    return encoded
    diff -ruN email.orig/Utils.py email/Utils.py
    --- email.orig/Utils.py	Sat Nov 10 02:07:44 2001
    +++ email/Utils.py	Wed Nov 14 19:16:00 2001
    @@ -17,11 +17,16 @@
     import base64
     
     # Intrapackage imports
    -from Encoders import _bencode, _qencode
    +from Encoders import _bencode, _qencode, header_qencode, header_bencode
     
     COMMASPACE = ', '
     UEMPTYSTRING = u''
     
    +CRLFSPACE = "\015\012 "
    +
    +# Flags for types of header encodings
    +QP     = 1  # Quoted-Printable
    +BASE64 = 2  # Base64
     
     
     # Helpers
    @@ -56,6 +61,16 @@
             return value[:-1]
         return value
     
    +def _chunk_append(chunks, header, goodlinelen=75):
    +    if len(chunks) == 0:
    +        chunks.append(header)
    +        return
    +    
    +    for chunk in header.split(CRLFSPACE):
    +        if len(chunks[-1] + chunk) < goodlinelen:
    +            chunks[-1] += " " + chunk
    +        else:
    +            chunks.append(chunk)
     
     
     def getaddresses(fieldvalues):
    @@ -156,3 +171,90 @@
              'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'][now[1] - 1],
             now[0], now[3], now[4], now[5],
             zone)
    +
    +def encode_address(real_name, address, charset="iso-8859-1", encoding=QP):
    +    """MIME-encode a header field intended for an address (from, to, cc, etc.)
    +
    +    Given an 8-bit string containing a real name, an email address,
    +    and optionally the real name's character set, and the encoding
    +    you wish to use with it, return a 7-bit MIME-encoded string
    +    suitable for use in a From, To, Cc, or other email header
    +    field.
    +    
    +    The encoding can be email.Utils.QP (quoted-printable, for
    +    ASCII-like character sets like iso-8859-1), email.Utils.BASE64
    +    (Base64, for non-ASCII like character sets like KOI8-R and
    +    iso-2022-jp), or None (no encoding).
    +    
    +    The charset defaults to "iso-8859-1", and the encoding defaults
    +    to email.Utils.QP.
    +    
    +    The resulting string will be in the format:
    +    
    +    "=?charset?q?Kevin_Phillips_B=F6ng?= "
    +    
    +    and can be included verbatim in an email header field.  Even
    +    very long addresses are handled properly with this method:
    +    
    +    "=?charset?q?T=E4rquin_Fintimlinbinhinbimlim_Bus_St=F6p_Poontang_Poont?=\r\n
    +      =?charset?q?ang_Ol=E9_Biscuit-Barrel?=\r\n
    +      "
    +    """       
    +    
    +    return encode_header_chunks([ [real_name, charset, encoding],
    +                                  ["<%s>" % address, None, None] ])
    +
    +def encode_header(header, charset="iso-8859-1", encoding=QP):
    +    """MIME-encode a general email header field (eg. Subject).
    +
    +    Given an 8-bit header string, and optionally its charset and the
    +    encoding you wish to use, return a 7-bit MIME-encoded string
    +    suitable for use in a general email header (but most useful for
    +    the Subject: line).
    +
    +    The encoding can be email.Utils.QP (quoted-printable, for
    +    ASCII-like character sets like iso-8859-1), email.Utils.BASE64
    +    (Base64, for non-ASCII like character sets like KOI8-R and
    +    iso-2022-jp), or None (no encoding).
    +    
    +    The charset defaults to "iso-8859-1", and the encoding defaults
    +    to email.Utils.QP.
    +    """
    +    return encode_header_chunks([[header, charset, encoding]])
    +
    +def encode_header_chunks(header_chunks):
    +    """MIME-encode a header with many different charsets and/or encodings.
    +
    +    Given a list of triplets [ [string, charset, encoding] ], return a
    +    MIME-encoded string suitable for use in a header field.  Each triplet
    +    may have different charsets and/or encodings, and the resulting header
    +    will accurately reflect each setting.
    +
    +    Each encoding can be email.Utils.QP (quoted-printable, for
    +    ASCII-like character sets like iso-8859-1), email.Utils.BASE64
    +    (Base64, for non-ASCII like character sets like KOI8-R and
    +    iso-2022-jp), or None (no encoding).
    +    
    +    Each triplet will be represented on a separate line; the resulting
    +    string will be in the format:
    +
    +    "=?charset1?q?Mar=EDa_Gonz=E1lez_Alonso?=\r\n
    +      =?charset2?b?SvxyZ2VuIEL2aW5n?="
    +    """
    +    chunks = []
    +    
    +    for header, charset, encoding in header_chunks:
    +        encoded = ""
    +        encoding_char = ""
    +
    +        if encoding is None:
    +            _chunk_append(chunks, header)
    +        else:
    +            if encoding is QP:
    +                _chunk_append(chunks, header_qencode(header, charset))
    +                    
    +            elif encoding is BASE64:
    +                _chunk_append(chunks, header_bencode(header, charset))
    +
    +    return CRLFSPACE.join(chunks)
    +
    
    -- 
    Brought to you by the letters A and H and the number 10.
    "Wuzzle means to mix."
    Debian GNU/Linux maintainer of Gimp and Nethack -- http://www.debian.org/
    
    
    From joel@webbgroup.net  Wed Nov 14 14:19:58 2001
    From: joel@webbgroup.net (Joel Webb)
    Date: Wed, 14 Nov 2001 14:19:58 +0000
    Subject: [Mailman-Developers] Pros Only: Archive problem with 2.0.7
    Message-ID: <200111141419.fAEEJx907682@mail.webbgroup.net>
    
    I am trying to get the archive html page to work, however the reason it doesn't work
    is because it is looking for the raw html file.
    
    Inside the Defaults it is set at:
    Archive_to_Mbox=2 
    
    which is archiving both Mbox and html archiving. Is this a bug, or do I not have
    something setup correctly?
    -- 
    Respectfully,
    
    Joel Webb
    WebbGroup Network Systems LLC
    www.webbgroup.net
    336.841.7241
    
    
    From roy@lamrim.com  Fri Nov 16 02:48:33 2001
    From: roy@lamrim.com (Roy Harvey)
    Date: Thu, 15 Nov 2001 18:48:33 -0800
    Subject: [Mailman-Developers] Re: [Mailman-Announce] RELEASE Mailman 2.0.7
    In-Reply-To: <15340.23456.886142.932986@anthem.wooz.org>
    Message-ID: <3.0.5.32.20011115184833.0081aa90@lamrim.com>
    
    Barry --
    
    Thanks for the update, I haven't pulled the newest version, but wanted to
    alert you to a possible bug:
    
    	List-Help: 
    	List-Post: 
    	List-Subscribe: ,
    	
    	List-Id: Lam Rim Radio Mailing List 
    	List-Unsubscribe: ,
    	
    	List-Archive: 
    
    Please note the last line URL with the double "/" after private.
    
    Thanks again for the great software!
    
    Roy
    
    At 05:41 PM 11/9/01 -0500, you wrote:
    >
    >Hi all,
    >
    >I'm releasing Mailman 2.0.7 which fixes two potential, though obscure
    >security or denial-of-service attacks, along with a few other minor
    >bug fixes.  Details:
    >
    >- If you are running Python 1.5.2, it is possible for someone to
    >  carefully craft some cookie data, and then trick Mailman into
    >  accepting that data, that will crash your Python interpreter.
    >
    >  If you are not running Python 1.5.2, you should be invulnerable to
    >  the crash, however it is still possible for someone to even more
    >  carefully craft some cookie data that could cause arbitrary class
    >  constructors to be executed on the server.
    >
    >  While I believe it is difficult to exploit this, Mailman 2.0.7
    >  closes this hole completely, by disabling the Cookie.py module's
    >  default unpickling of cookie data.
    >
    >- It is possible that Mailman's bounce handler could receive a bounce
    >  message that looked like a DSN report, but was incorrectly
    >  formatted.  Under Mailman 2.0.6's bounce detector, you would get a
    >  traceback for a message that would never be removed from the queue,
    >  thus potentially wedging your qrunner until the offending message
    >  was manually deleted.
    >
    >  Mailman 2.0.7 fixes the DSN.py bounce detector.
    >
    >There are a few other useful bug fixes in this release, described in
    >the NEWS excerpt below.  I recommend anybody running a version of
    >Mailman up to, and including 2.0.6 to upgrade to 2.0.7.
    >
    >I'm releasing this version only as a tarball -- no patch file is
    >provided at this time.  As of this moment, only the SourceForge site
    >is up-to-date, although I expect www.list.org and www.gnu.org to
    >follow soon.  The release information is available on SourceForge at:
    >
    >    http://sourceforge.net/project/shownotes.php?release_id=60758
    >
    >and the file can be downloaded from:
    >
    >
    http://sourceforge.net/project/showfiles.php?group_id=103&release_id=60758
    >
    >See also:
    >
    >    http://www.gnu.org/software/mailman
    >    http://www.list.org
    >    http://mailman.sf.net
    >
    >Cheers
    >-Barry
    >
    >-------------------- snip snip --------------------
    >2.0.7 (09-Nov-2001)
    >
    >    Security fixes:
    >
    >    - Closed a hole in cookie management whereby some carefully
    >      crafted untrusted cookie data could crash Mailman if used with
    >      Python 1.5.2, or cause some unintended class constructors to be
    >      run on the server.
    >
    >    - In the DSN.py bounce handler, a message that was DSN-like, but
    >      which was missing a "report-type" parameter could cause a
    >      non-deletable bounce message to crash Mailman forever, requiring
    >      manual intervention.
    >
    >    Bug fixes:
    >
    >    - Stray % signs in headers and footers could cause crashes.  Now
    >      they'll just cause an [INVALID HEADER] or [INVALID FOOTER]
    >      string to be added.
    >
    >    - The mail->news gateway has been made more robust in the face of
    >      duplicate headers, and reserved headers that some news servers
    >      reject.  If the message is still rejected, it is saved in
    >      $prefix/nntp instead of discarded.
    >
    >    - Hand-crafted invalid chunk number in membership management
    >      display could cause a traceback.
    >
    >
    >_______________________________________________
    >Mailman-announce mailing list
    >Mailman-announce@python.org
    >http://mail.python.org/mailman/listinfo/mailman-announce
    >
    >
    
    
    From bxb1280@yahoo.com  Sun Nov 18 07:48:02 2001
    From: bxb1280@yahoo.com (bxb1280)
    Date: Sun, 18 Nov 2001 15:48:2 +0800
    Subject: [Mailman-Developers] hi
    Message-ID: 
    
    vtkusers=A3=AChi=A3=A1
    
    Has anyone sucessfully use vtk to render to read, and render=
     DICOM3 file
    format? Please advise on how could it be done?
    
                        
    
                bxb1280
                bxb1280@yahoo.com
    
    
    _________________________________________________________
    Do You Yahoo!?
    Get your free @yahoo.com address at http://mail.yahoo.com
    
    
    
    From bxb1280@sina.com  Sun Nov 18 07:35:07 2001
    From: bxb1280@sina.com (bxb)
    Date: Sun, 18 Nov 2001 15:35:07 +0800
    Subject: [Mailman-Developers] Dear all
    Message-ID: <000a01c17003$8d38b080$1c00a8c0@168.0.1>
    
    This is a multi-part message in MIME format.
    
    ------=_NextPart_000_0007_01C17046.99E18580
    Content-Type: text/plain;
    	charset="gb2312"
    Content-Transfer-Encoding: quoted-printable
    
    
    Has anyone sucessfully use vtk to render to read, and render DICOM3 file
    format? Please advise on how could it be done?
    
    ------=_NextPart_000_0007_01C17046.99E18580
    Content-Type: text/html;
    	charset="gb2312"
    Content-Transfer-Encoding: quoted-printable
    
    
    
    
    
    
    
    
    
     
    Has anyone sucessfully use vtk to render to read, = and render=20 DICOM3 file
    format? Please advise on how could it be=20 done?
    ------=_NextPart_000_0007_01C17046.99E18580-- From che@debian.org Mon Nov 19 11:40:11 2001 From: che@debian.org (Ben Gertzfield) Date: Mon, 19 Nov 2001 20:40:11 +0900 Subject: [Mailman-Developers] [PATCH] Proof-of-concept: proper MIME i18n mails from Mailman Message-ID: <87wv0nhtus.fsf@nausicaa.interq.or.jp> I've done it! Finally, I got to finish the work I had intended on doing for so long: adding proper MIMEification of i18n mails produced within Mailman. This works for both the subject and the body of any mail produced from the UserNotification module. This code is split up into a patch to the email module, including a new Charset class to maintain details on each character set's characteristics in the email world, and a patch to Mailman to use the new functionality. This email includes the first patch, to the email module. I will send a separate email with the patch to Mailman to use this new code. This is not the final version of the patch, but I'm really excited that I finally got even multibyte character sets like Japanese working properly that I wanted to post my progress. Right now, any mail generated by Mailman will be internationalized properly, including encoding the header and body with Quoted-Printable or Base64 as appropriate. I tested it by setting DEFAULT_SERVER_LANGUAGE = 'ja' in mm_cfg.py and running 'newlist', and it sent out the following: Received: from localhost (HELO nausicaa.interq.or.jp) (127.0.0.1) by localhost with SMTP; 19 Nov 2001 10:03:27 -0000 MIME-Version: 1.0 Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit Subject: =?iso-2022-jp?b?GyRCJCIkSiQ/JE4/NyQ3JCQlYSE8JWobKEI=?= =?iso-2022-jp?b?GyRCJXMlMCVqJTklSBsoQjogbGFuZ3Rlc3Q0?= From: mailman-admin@nausicaa.interq.or.jp To: ben@gmo.jp Message-ID: Sender: langtest4-admin@nausicaa.interq.or.jp Errors-To: langtest4-admin@nausicaa.interq.or.jp X-BeenThere: langtest4@nausicaa.interq.or.jp X-Mailman-Version: 2.1a3+ Precedence: bulk (snip rest of headers and properly encoded Japanese body) You'll notice that the Subject line has been converted from the EUC-JP encoding used in Mailman's Japanese localization to ISO-2022-JP, used in emails. It's also been split *SAFELY* on the magic 76 character boundry -- we have to make sure we split on a *CHARACTER* boundary, not a byte boundary, when splitting Japanese strings, as multibyte characters will get messed up if they're split between bytes. Also, the MIME-Version, Content-Type, and CTE headers are added correctly. The body was also encoded correctly in ISO-2022-JP, but I didn't want to include it and confuse other folks' possibly-not-Japanese-aware mail readers. I'm using the wonderful Japanese unicode codec for python from http://pseudo.grad.sccs.chukyo-u.ac.jp/~kajiyama/python/ to convert to and from EUC-JP/ISO-2022-JP, through Unicode. It works splendidly, and is the perfect solution to split multibyte character sets on character (not byte) boundaries for wrapping long header lines. My code deals with ASCII-like character sets by using quoted-printable for them, but I noticed that a few of the translations wuss out from using 8-bit characters! The Spanish translation uses HTML escapes, which makes it useless for emails: [ben@nausicaa:~/src/mailman/mailman/messages/es/LC_MESSAGES]% grep eacute mailman.po " también puede crear una lista de\n" " podría hacer que otras pantallas estén desincronizadas. \n" " Asegurese de recargar cualquier otra página que esté " "También puede " (snip) These should be looked at. This code is mostly-tested, but I had to change a *lot* of UserNotification calls, so I'm not sure if I guessed the lang parameter right in all cases. I could get the language detection code working great when I ran "newlist" from the command line, but when I tried to use the CGI interface, I got a bounce in the logs but no message anywhere of a traceback, so it needs more debugging. Below is the patch to email-0.95, to enable the charset related code we need to get Mailman to do all this cool stuff. The next email will include the Mailman patch to use this oh-so-required feature. diff -ruN email.orig/Charset.py email/Charset.py --- email.orig/Charset.py Thu Jan 1 09:00:00 1970 +++ email/Charset.py Mon Nov 19 19:20:49 2001 @@ -0,0 +1,165 @@ +# Copyright (C) 2001 Python Software Foundation +# Author: che@debian.org (Ben Gertzfield) + +import types +import codecs + +# Flags for types of header encodings +QP = 1 # Quoted-Printable +BASE64 = 2 # Base64 + +class Charset: + """Map charsets to their email characteristics. + + This module deals with the nitty-gritty of email character set + internals, and has a bit of "do-what-I-mean" functionality. Given + an character set, it will do its best to provide information + on how to use that character set in an email. + + Certain character sets must be encoded with quoted-printable or + Base64 when used in email headers or bodies, and certain character + sets must be converted outright, and are not allowed in email. + Instances of this module expose the following information about + a character set: + + input_charset: The initial character set specified. Common aliases + are converted to their "official" email names (like latin_1 to + iso-8859-1). + + header_encoding: If the character set must be encoded before using + it in an email header, set to Charset.QP (for quoted- printable) + or Charset.BASE64 (for base64 encoding). Otherwise, it will be + None. + + body_encoding: Same as header_encoding, but for the email's body. + + output_charset: Some character sets must be converted before using + them in email headers or bodies. If the input_charset is one + of them, set to another character set. + + input_codec: The name of the Python codec used to convert the + input_charset to Unicode. + + output_codec: The name of the Python codec used to convert Unicode + to the output_charset. + """ + charset_map = { + # input header enc body enc output conv + 'iso-8859-1': [QP, QP, None], + 'iso-8859-2': [QP, QP, None], + 'us-ascii': [None, None, None], + 'big5': [BASE64, BASE64, None], + 'gb2312': [BASE64, BASE64, None], + 'euc-jp': [BASE64, None, 'iso-2022-jp'], + 'shift_jis': [BASE64, None, 'iso-2022-jp'], + 'iso-2022-jp':[BASE64, None, None], + 'koi8-r': [BASE64, BASE64, None], + } + + # Aliases for other commonly-used names for character sets. Map + # them to the real ones used in email. + alias_map = { + 'latin_1': 'iso-8859-1', + 'ascii': 'us-ascii' + } + + # Map charsets to their unicode codec strings. + # Note that the japanese examples included below do not (yet) come with + # Python! They are available from: + # http://pseudo.grad.sccs.chukyo-u.ac.jp/~kajiyama/python/ + + unicode_map = { + 'euc-jp': 'japanese.euc-jp', + 'iso-2022-jp': 'japanese.iso-2022-jp', + 'shift_jis': 'japanese.shift_jis', + } + + + def __init__(self, input_charset='iso-8859-1', header_encoding=None, + body_encoding=None, output_charset=None, input_codec=None, + output_codec=None): + if self.alias_map.has_key(input_charset): + self.input_charset = input_charset = self.alias_map[input_charset] + else: + self.input_charset = input_charset + + # We can try to guess which encoding and conversion to use by the + # charset_map dictionary. Try that first, but let the user + # override it. + if self.charset_map.has_key(input_charset): + self.header_encoding = (header_encoding or + self.charset_map[input_charset][0]) + self.body_encoding = (body_encoding or + self.charset_map[input_charset][1]) + self.output_charset = (output_charset or + self.charset_map[input_charset][2] or + input_charset) + + if self.alias_map.has_key(self.output_charset): + self.output_charset = output_charset = self.alias_map[output_charset] + if self.output_charset is not None: + if self.unicode_map.has_key(self.input_charset): + self.input_codec = (input_codec or + self.unicode_map[self.input_charset]) + else: + self.input_codec = input_codec + if self.unicode_map.has_key(self.output_charset): + self.output_codec = (output_codec or + self.unicode_map[self.output_charset] or + self.input_codec) + else: + self.output_codec = output_codec or self.input_codec + else: + self.input_codec = self.output_codec = None + # Otherwise, just go with what the user said. + else: + self.header_encoding = header_encoding + self.body_encoding = body_encoding + self.output_charset = output_charset + self.input_codec = input_codec + self.output_codec = output_codec or self.input_codec + + def to_output(self, str): + """Convert the string from the input_codec to the output_codec.""" + if self.input_codec <> self.output_codec: + return unicode(str, self.input_codec).encode(self.output_codec) + else: + return str + + def to_splittable(self, str): + """Convert a possibly multibyte string to a safely splittable format. + + Uses the input_codec to try and convert the string to Unicode, so + it can be safely split on character boundaries (even for double-byte + characters). + + Returns the string untouched if it doesn't know how to convert it + to Unicode with the input_charset. + + Will raise ValueError if the input_codec is not installed on the system. + """ + if type(str) is types.UnicodeType: + return str + + if self.input_codec is not None: + return unicode(str, self.input_codec) + else: + return str + + def from_splittable(self, uni_string): + """Convert a splittable string back into an encoded string. + + Uses the output_codec to try and convert the string from Unicode + back into its output encoded format. Returns the string as-is if + it is not Unicode, or if it could not be encoded from Unicode. + + Will raise ValueError if the output_codec is not installed on the system. + """ + if type(uni_string) is not types.UnicodeType: + return uni_string + + if self.output_codec is not None: + return uni_string.encode(self.output_codec) + else: + return uni_string + diff -ruN email.orig/Encoders.py email/Encoders.py --- email.orig/Encoders.py Tue Oct 2 04:29:38 2001 +++ email/Encoders.py Mon Nov 19 20:36:53 2001 @@ -6,8 +6,13 @@ import base64 import quopri +import re +from binascii import b2a_base64 from cStringIO import StringIO +from Charset import Charset, QP, BASE64 + +CRLFSPACE = "\015\012 " # Helpers @@ -24,6 +29,15 @@ return value[:-1] return value +def _max_append(list, str, maxlen): + if len(list) == 0: + list.append(str) + return + + if len(list[-1] + str) < maxlen: + list[-1] += str + else: + list.append(str) def _bencode(s): # We can't quite use base64.encodestring() since it tacks on a "courtesy @@ -36,6 +50,17 @@ return value[:-1] return value +def _chunk_append(chunks, header, goodlinelen=75): + if len(chunks) == 0: + chunks.append(header) + return + + for chunk in header.split(CRLFSPACE): + if len(chunks[-1] + chunk) < goodlinelen: + chunks[-1] += " " + chunk + else: + chunks.append(chunk) + def encode_base64(msg): @@ -78,3 +103,276 @@ def encode_noop(msg): """Do nothing.""" + + +def qencode_len(str): + """Return the length of str when it is encoded with header q-p.""" + count = 0 + + for c in str: + if ((c >= 'a' and c <= 'z') or (c >= 'A' and c <= 'Z') or + (c >= '0' and c <= '9') or (c in ('!', '*', '+', '-', '/', ' '))): + count += 1 + else: + count += 3 + + return count + +def bencode_len(str): + """Return the length of str when it is encoded with base64.""" + return (len(str) / 3) * 4 + +def header_qencode(header, charset="iso-8859-1", maxlinelen=75): + """Encode a header line with quoted-printable (like) encoding. + + Defined in RFC 2045, this "Q" encoding is similar to + quoted-printable, but used specifically for email header fields to + allow charsets with mostly 7 bit characters (and some 8 bit) to + remain more or less readable in non-RFC 2045 aware mail clients. + + The resulting string will be in the form: + + "=?charset?q?I_f=E2rt_in_your_g=E8n=E8ral_dire=E7tion?=\r\n + =?charset?q?Silly_=C8nglish_Kn=EEghts?=" + + with each line wrapped safely at, at most, maxlinelen characters. + It is safe to use verbatim in any email header field, as the + wrapping is performed in a quoted-printable aware way and each + linefeed is a \r\n. + + charset defaults to "iso-8859-1", and maxlinelen defaults to 75 + characters. + """ + quoted = [] + + # =? plus ?q? plus ?= is 7 characters + maxlen = maxlinelen - len(charset) - 7 + + for c in header: + # Space may be represented as _ instead of =20 for readability + if c == ' ': + _max_append(quoted, "_", maxlen) + # These characters can be included verbatim + elif ((c >= 'a' and c <= 'z') or (c >= 'A' and c <= 'Z') or + (c >= '0' and c <= '9') or (c in ('!', '*', '+', '-', '/'))): + _max_append(quoted, c, maxlen) + # Otherwise, replace with hex value like =E2 + else: + _max_append(quoted, "=%02X" % (ord(c)), maxlen) + + encoded = "" + + for q in quoted: + # Any chunk past the fir7st must start with "\r\n " + if len(encoded) > 0: + encoded += CRLFSPACE + encoded += "=?%s?q?%s?=" % (charset, q) + + return encoded + +def header_bencode(header, charset="iso-8859-1", maxlinelen=75): + """Encode a header line with Base64 encoding and a charset specification. + + Defined in RFC 2045, this Base64 encoding is identical to normal + Base64 encoding, except that each line must be intelligently + wrapped (respecting the Base64 encoding), and subsequent lines must + start with a space. + + The resulting string will be in the form: + + "=?charset?b?WW/5ciBtYXp66XLrIHf8eiBhIGhhbXBzdGHuciBBIFlv+XIgbWF6euly?=\r\n + =?charset?b?6yB3/HogYSBoYW1wc3Rh7nIgQkMgWW/5ciBtYXp66XLrIHf8eiBhIGhh?=" + + with each line wrapped at, at most, maxlinelen characters. It is + safe to use verbatim in any email header field, as the wrapping is + performed in a quoted-printable aware way and each linefeed is a + \r\n. + + charset defaults to "iso-8859-1", and maxlinelen defaults to 75 + characters. + """ + + if len(header) == 0: + return header + + base64ed = [] + + max_encoded = maxlinelen - len(charset) - 7 + max_unencoded = bencode_len(header) + + for i in xrange(0, len(charset), max_unencoded): + base64ed.append(b2a_base64(header[i:i+max_unencoded])) + + encoded = "" + + for b in base64ed: + if len(encoded) > 0: + encoded += CRLFSPACE + # We ignore the last character of each line if it is a \n. + if b[-1] == '\n': + b = b[:-1] + + encoded += "=?%s?b?%s?=" % (charset, b) + + return encoded + +def encode_header_chunks(header_chunks): + """MIME-encode a header with many different charsets and/or encodings. + + Given a list of pairs [string, charset], return a MIME-encoded + string suitable for use in a header field. Each triplet may have + different charsets and/or encodings, and the resulting header will + accurately reflect each setting. + + Each encoding can be email.Utils.QP (quoted-printable, for + ASCII-like character sets like iso-8859-1), email.Utils.BASE64 + (Base64, for non-ASCII like character sets like KOI8-R and + iso-2022-jp), or None (no encoding). + + Each triplet will be represented on a separate line; the resulting + string will be in the format: + + "=?charset1?q?Mar=EDa_Gonz=E1lez_Alonso?=\r\n + =?charset2?b?SvxyZ2VuIEL2aW5n?=" + """ + chunks = [] + + for header, charset in header_chunks: + if charset is None or charset.header_encoding is None: + _chunk_append(chunks, header) + else: + if charset.header_encoding is QP: + _chunk_append(chunks, + header_qencode(header, charset.output_charset)) + + elif charset.header_encoding is BASE64: + _chunk_append(chunks, + header_bencode(header, charset.output_charset)) + + return CRLFSPACE.join(chunks) + +def encode_address(real_name, address, charset=Charset("iso-8859-1")): + """MIME-encode a header field intended for an address (from, to, cc, etc.) + + Given a real name, an email address, and optionally the real + name's character set (as a Charset object, defaulting to + iso-8859-1), return a 7-bit MIME-encoded string suitable for use + in a From, To, Cc, or other email header field. + + The resulting string will be in the format: + + "=?charset?q?Kevin_Phillips_B=F6ng?= " + + and can be included verbatim in an email header field. Even + very long addresses are handled properly with this method: + + "=?charset?q?T=E4rquin_Fintimlinbinhinbimlim_Bus_St=F6p_Poontang_Poont?=\r\n + =?charset?q?ang_Ol=E9_Biscuit-Barrel?=\r\n + " + """ + + if not real_name: + return address + + header_chunks = split_encode(real_name, charset) + header_chunks.append(["<%s>" % address, Charset("us-ascii")]) + return encode_header_chunks(header_chunks) + +def encode_header(header, charset=Charset("iso-8859-1")): + """Encode a message header, possibly converting charset and encoding. + + There are many issues involved in converting a given string for + use in an email header. Only certain character sets are readable + in most email clients, and as header strings can only contain a + subset of 7-bit ASCII, care must be taken to properly convert and + encode (with Base64 or quoted-printable) header strings. In + addition, there is a 75-character length limit on any given + encoded header field, so line-wrapping must be performed, even + with double-byte character sets. + + This function, given a header string and its character set, will + do its best to convert the string to the correct character set + used in email, and encode and line wrap it safely with the + appropriate scheme for that character set. If the given + input_charset is not known or an error occurs during conversion, + this function will return the header untouched. + """ + + if not header: + return header + + header = fix_eols(header) + + header_chunks = header_split(header, charset) + + return encode_header_chunks(header_chunks) + +def encode_body(body, charset=Charset("iso-8859-1")): + """Encode a message body, possibly converting charset and encoding.""" + + if not body: + return body + + if charset.body_encoding is QP: + infp = StringIO(charset.to_output(body)) + outfp = StringIO() + quopri.encode(infp, outfp, quotetabs=0) + return fix_eols(outfp.getvalue()) + elif charset.body_encoding is BASE64: + encoded = "" + for s in body_base64_split(body, charset): + encoded += b2a_base64(s) + return s + else: + return charset.to_output(body) + +def body_base64_split(body, charset, maxlinelen=75): + """Split up a body safely, respecting encoding and mulibyte charsets.""" + + splittable = charset.to_splittable(body) + encoded = charset.from_splittable(splittable) + + length = bencode_len(encoded) + + if length < maxlinelen: + return [encoded] + else: + # divide and conquer + first = charset.from_splittable(splittable[:len(splittable)/2]) + last = charset.from_splittable(splittable[len(splittable)/2:]) + + return (body_base64_split(first, charset) + + body_base64_split(last, charset)) + +def header_split(header, charset, maxlinelen=75): + """Split up a header safely for use with encode_header_chunks.""" + + splittable = charset.to_splittable(header) + encoded = charset.from_splittable(splittable) + + length = len(encoded) + + if charset.header_encoding is QP: + length = qencode_len(encoded) + elif charset.header_encoding is BASE64: + length = bencode_len(encoded) + + if length < maxlinelen - len(charset.output_charset) - 7: + return [(encoded, charset)] + else: + # divide and conquer + first = charset.from_splittable(splittable[:len(splittable)/2]) + last = charset.from_splittable(splittable[len(splittable)/2:]) + return (header_split(first, charset) + + header_split(last, charset)) + +def fix_eols(str): + """Replace all line-ending characters with \r\n.""" + + # Fix newlines with no preceding carriage return + str = re.sub(r"(? Here's the promised patch in my previous email, that enables Mailman to send out properly MIME-ified, localized emails, with the correct encoding and charset conversion for each language. This patch is against Mailman CVS. Ben Index: Mailman/Bouncer.py =================================================================== RCS file: /cvsroot/mailman/mailman/Mailman/Bouncer.py,v retrieving revision 2.14 diff -u -r2.14 Bouncer.py --- Mailman/Bouncer.py 2001/10/15 20:39:56 2.14 +++ Mailman/Bouncer.py 2001/11/19 11:00:14 @@ -208,7 +208,8 @@ rname = self.real_name msg0 = Message.UserNotification( recipient, Utils.get_site_email(self.host_name, '-admin'), - _('%(rname)s member %(addr)s bouncing - %(negative)s%(did)s')) + _('%(rname)s member %(addr)s bouncing - %(negative)s%(did)s'), + lang=self.preferred_language) msg0['MIME-Version'] = '1.0' msg0['Content-Type'] = 'multipart/mixed' msg1 = MIMEText(text, Index: Mailman/Deliverer.py =================================================================== RCS file: /cvsroot/mailman/mailman/Mailman/Deliverer.py,v retrieving revision 2.10 diff -u -r2.10 Deliverer.py --- Mailman/Deliverer.py 2001/10/21 06:24:56 2.10 +++ Mailman/Deliverer.py 2001/11/19 11:00:14 @@ -65,7 +65,7 @@ msg = Message.UserNotification( self.GetMemberAdminEmail(name), self.GetRequestEmail(), _('Welcome to the "%(realname)s" mailing list%(digmode)s'), - text) + text, pluser) msg['X-No-Archive'] = 'yes' msg.send(self) @@ -74,7 +74,7 @@ msg = Message.UserNotification( self.GetMemberAdminEmail(addr), self.GetAdminEmail(), _('You have been unsubscribed from the %(realname)s mailing list'), - Utils.wrap(self.goodbye_msg)) + Utils.wrap(self.goodbye_msg), self.GetMemberLanguage(addr)) msg.send(self) def MailUserPassword(self, user): @@ -101,6 +101,7 @@ cpuser = self.getMemberCPAddress(user) recipient = self.GetMemberAdminEmail(cpuser) subject = _('%(listfullname)s mailing list reminder') + mem_lang = self.getMemberLanguage(user) # get the text from the template text = Utils.maketext( 'userpass.txt', @@ -111,7 +112,8 @@ 'options_url': self.GetOptionsURL(user, absolute=1), 'requestaddr': requestaddr, 'owneraddr' : self.GetOwnerEmail(), - }, lang=self.getMemberLanguage(user), mlist=self) - msg = Message.UserNotification(recipient, adminaddr, subject, text) + }, lang=mem_lang, mlist=self) + msg = Message.UserNotification(recipient, adminaddr, subject, text, + mem_lang) msg['X-No-Archive'] = 'yes' msg.send(self) Index: Mailman/ListAdmin.py =================================================================== RCS file: /cvsroot/mailman/mailman/Mailman/ListAdmin.py,v retrieving revision 2.22 diff -u -r2.22 ListAdmin.py --- Mailman/ListAdmin.py 2001/11/06 22:49:36 2.22 +++ Mailman/ListAdmin.py 2001/11/19 11:00:14 @@ -30,6 +30,8 @@ import cPickle import email from email.MIMEMessage import MIMEMessage +from email.Encoders import encode_header +from email.Charset import Charset from cStringIO import StringIO from Mailman import mm_cfg @@ -281,9 +283,13 @@ except IOError, e: if e.errno <> errno.ENOENT: raise raise Errors.LostHeldMessage(path) + # We have to call email.Encoders.encode_header directly, we + # don't want to mess with the message + subject = encode_header(_('Forward of moderated message'), + Charset(self.preferred_language)) fmsg = Message.UserNotification(addr, self.GetAdminEmail(), - _('Forward of moderated message')) + subject) fmsg.add_header('Content-Type', 'message/rfc822') fmsg.add_payload(copy) fmsg.send(self) @@ -351,7 +357,8 @@ # This message should appear to come from the -owner so as # to avoid any useless bounce processing. owneraddr = self.GetOwnerEmail() - msg = Message.UserNotification(owneraddr, owneraddr, subject, text) + msg = Message.UserNotification(owneraddr, owneraddr, subject, text, + lang) msg.send(self, **{'tomoderators': 1}) def __handlesubscription(self, record, value, comment): @@ -401,7 +408,8 @@ # This message should appear to come from the -owner so as # to avoid any useless bounce processing. owneraddr = self.GetOwnerEmail() - msg = Message.UserNotification(owneraddr, owneraddr, subject, text) + msg = Message.UserNotification(owneraddr, owneraddr, subject, text, + self.preferred_language) msg.send(self, **{'tomoderators': 1}) def __handleunsubscription(self, record, value, comment): @@ -441,7 +449,7 @@ str(origmsg) ]) subject = _('Request to mailing list %(realname)s rejected') - msg = Message.UserNotification(recip, adminaddr, subject, text) + msg = Message.UserNotification(recip, adminaddr, subject, text, lang) msg.send(self) Index: Mailman/MailCommandHandler.py =================================================================== RCS file: /cvsroot/mailman/mailman/Mailman/MailCommandHandler.py,v retrieving revision 2.23 diff -u -r2.23 MailCommandHandler.py --- Mailman/MailCommandHandler.py 2001/10/21 22:11:20 2.23 +++ Mailman/MailCommandHandler.py 2001/11/19 11:00:14 @@ -270,18 +270,16 @@ syslog('error', 'Unexpected Mailman error:\n%s', tbmsg) # and send the traceback to the user + lang = msgdata.get('lang', + self.getMemberLanguage(admin)) responsemsg = Message.UserNotification( admin, admin, _('Unexpected Mailman error'), _('''\ An unexpected Mailman error has occurred in MailCommandHandler.ParseMailCommands(). Here is the traceback: -''') + tbmsg) +''') + tbmsg, lang) responsemsg['X-No-Archive'] = 'yes' - lang = msgdata.get('lang', - self.getMemberLanguage(admin)) - responsemsg.add_header('Content-Type', 'text/plain', - charset=Utils.GetCharSet(lang)) responsemsg.send(self) break # send the response @@ -313,7 +311,7 @@ responsemsg = Message.UserNotification(msg.get_sender(), self.GetRequestEmail(), subject, - self.__respbuf) + self.__respbuf, lang) responsemsg.add_header('Content-Type', 'text/plain', charset=Utils.GetCharSet(lang)) responsemsg.send(self) Index: Mailman/MailList.py =================================================================== RCS file: /cvsroot/mailman/mailman/Mailman/MailList.py,v retrieving revision 2.48 diff -u -r2.48 MailList.py --- Mailman/MailList.py 2001/10/27 01:59:41 2.48 +++ Mailman/MailList.py 2001/11/19 11:00:15 @@ -666,7 +666,7 @@ msg = Message.UserNotification( recipient, self.GetRequestEmail(), 'confirm %s' % cookie, - text) + text, lang) msg['Reply-To'] = self.GetRequestEmail() msg.send(self) if recipient <> email: @@ -748,7 +748,7 @@ }, lang=lang, mlist=self) msg = Message.UserNotification( self.owner, Utils.get_site_email(self.host_name, '-admin'), - subject, text) + subject, text, lang) msg.send(self) def DeleteMember(self, name, whence=None, admin_notif=0, userack=1): @@ -786,7 +786,7 @@ }, mlist=self) msg = Message.UserNotification( self.owner, Utils.get_site_email(self.host_name, '-admin'), - subject, text) + subject, text, lang) msg.send(self) if whence: whence = "; %s" % whence @@ -850,7 +850,7 @@ msg = Message.UserNotification( newaddr, self.GetRequestEmail(), 'confirm %s' % cookie, - text) + text, self.getMemberLanguage(oldaddr)) msg['Reply-To'] = self.GetRequestEmail() msg.send(self) @@ -994,7 +994,7 @@ msg = Message.UserNotification( addr, self.GetRequestEmail(), 'confirm %s' % cookie, - text) + text, lang) msg['Reply-To'] = self.GetRequestEmail() msg.send(self) Index: Mailman/Message.py =================================================================== RCS file: /cvsroot/mailman/mailman/Mailman/Message.py,v retrieving revision 2.9 diff -u -r2.9 Message.py --- Mailman/Message.py 2001/10/15 21:38:01 2.9 +++ Mailman/Message.py 2001/11/19 11:00:15 @@ -22,6 +22,9 @@ import email.Message import email.Utils +from email.Encoders import encode_body, encode_header +from email.Charset import Charset, QP, BASE64 + from types import ListType from Mailman import mm_cfg @@ -92,8 +95,22 @@ class UserNotification(Message): """Class for internally crafted messages.""" - def __init__(self, recip, sender, subject=None, text=None): + def __init__(self, recip, sender, subject=None, text=None, lang=None): Message.__init__(self) + + if lang is not None: + cset = Charset(Utils.GetCharSet(lang)) + text = encode_body(text, cset) + subject = encode_header(subject, cset) + self.add_header('MIME-Version', '1.0') + self.add_header('Content-Type', 'text/plain', + charset=cset.output_charset) + cte = '7bit' + if cset.body_encoding is QP: + cte = 'quoted-printable' + elif cset.body_encoding is BASE64: + cte = 'base64' + self.add_header('Content-Transfer-Encoding', cte) if text is not None: self.set_payload(text) if subject is None: @@ -106,6 +123,7 @@ else: self['To'] = recip self.recips = [recip] + self.lang = lang def send(self, mlist, **_kws): """Sends the message by enqueuing it to the `virgin' queue. @@ -117,6 +135,7 @@ # this is useful for logging to logs/smtp. if not self.has_key('message-id'): self['Message-ID'] = Utils.unique_message_id(mlist) + # Not imported at module scope to avoid import loop from Mailman.Queue.sbcache import get_switchboard virginq = get_switchboard(mm_cfg.VIRGINQUEUE_DIR) Index: Mailman/Cgi/create.py =================================================================== RCS file: /cvsroot/mailman/mailman/Mailman/Cgi/create.py,v retrieving revision 2.13 diff -u -r2.13 create.py --- Mailman/Cgi/create.py 2001/11/06 23:29:19 2.13 +++ Mailman/Cgi/create.py 2001/11/19 11:00:15 @@ -219,7 +219,7 @@ msg = Message.UserNotification( owner, siteadmin, _('Your new mailing list: %(listname)s'), - text) + text, mlist.preferred_language) msg.send(mlist) # Success! Index: Mailman/Cgi/subscribe.py =================================================================== RCS file: /cvsroot/mailman/mailman/Mailman/Cgi/subscribe.py,v retrieving revision 2.15 diff -u -r2.15 subscribe.py --- Mailman/Cgi/subscribe.py 2001/10/12 05:14:25 2.15 +++ Mailman/Cgi/subscribe.py 2001/11/19 11:00:15 @@ -230,7 +230,7 @@ an attempt is being made to covertly discover whether you are a member of this list, and you are worried about your privacy, then feel free to send a message to the list administrator at %(listowner)s. -""")) +"""), lang) msg.send(mlist) # These shouldn't happen unless someone's tampering with the form except Errors.MMCantDigestError: Index: Mailman/Handlers/Acknowledge.py =================================================================== RCS file: /cvsroot/mailman/mailman/Mailman/Handlers/Acknowledge.py,v retrieving revision 2.10 diff -u -r2.10 Acknowledge.py --- Mailman/Handlers/Acknowledge.py 2001/10/01 16:32:06 2.10 +++ Mailman/Handlers/Acknowledge.py 2001/11/19 11:00:15 @@ -63,7 +63,5 @@ # queue. subject = _('%(realname)s post acknowledgement') usermsg = Message.UserNotification(sender, mlist.GetAdminEmail(), - subject, text) - usermsg.add_header('Content-Type', 'text/plain', - charset=Utils.GetCharSet(lang)) + subject, text, lang) usermsg.send(mlist) Index: Mailman/Handlers/Hold.py =================================================================== RCS file: /cvsroot/mailman/mailman/Mailman/Handlers/Hold.py,v retrieving revision 2.18 diff -u -r2.18 Hold.py --- Mailman/Handlers/Hold.py 2001/10/15 22:22:08 2.18 +++ Mailman/Handlers/Hold.py 2001/11/19 11:00:15 @@ -217,9 +217,8 @@ lang = msgdata.get('lang', mlist.getMemberLanguage(sender)) subject = _('Your message to %(listname)s awaits moderator approval') text = Utils.maketext('postheld.txt', d, lang=lang, mlist=mlist) - nmsg = Message.UserNotification(sender, adminaddr, subject, text) - nmsg.add_header('Content-Type', 'text/plain', - charset=Utils.GetCharSet(lang)) + nmsg = Message.UserNotification(sender, adminaddr, subject, text, + lang) nmsg.send(mlist) # Now the message for the list owners. Be sure to include the list # moderators in this message. This one should appear to come from @@ -237,7 +236,8 @@ d['subject'] = usersubject # craft the admin notification message and deliver it subject = _('%(listname)s post from %(sender)s requires approval') - nmsg = Message.UserNotification(owneraddr, owneraddr, subject) + nmsg = Message.UserNotification(owneraddr, owneraddr, subject, + lang=lang) nmsg['Content-Type'] = 'multipart/mixed' nmsg['MIME-Version'] = '1.0' text = MIMEText( Index: Mailman/Handlers/Moderate.py =================================================================== RCS file: /cvsroot/mailman/mailman/Mailman/Handlers/Moderate.py,v retrieving revision 2.0 diff -u -r2.0 Moderate.py --- Mailman/Handlers/Moderate.py 2001/10/15 22:23:17 2.0 +++ Mailman/Handlers/Moderate.py 2001/11/19 11:00:15 @@ -93,7 +93,8 @@ mlist.GetScriptURL('admin', absolute=1) nmsg = Message.UserNotification(mlist.GetOwnerEmail(), mlist.GetAdminEmail(), - _('Auto-discard notification')) + _('Auto-discard notification'), + mlist.preferred_language) nmsg['Content-Type'] = 'multipart/mixed' nmsg['MIME-Version'] = '1.0' text = MIMEText(Utils.wrap(_("""\ Index: Mailman/Handlers/Replybot.py =================================================================== RCS file: /cvsroot/mailman/mailman/Mailman/Handlers/Replybot.py,v retrieving revision 2.4 diff -u -r2.4 Replybot.py --- Mailman/Handlers/Replybot.py 2001/07/13 17:00:34 2.4 +++ Mailman/Handlers/Replybot.py 2001/11/19 11:00:15 @@ -48,6 +48,7 @@ # means always autorespond, as does an "X-Ack: yes" header (useful for # debugging). sender = msg.get_sender() + lang = mlist.getMemberLanguage(sender) now = time.time() graceperiod = mlist.autoresponse_graceperiod if graceperiod > 0 and ack <> 'yes': @@ -90,7 +91,7 @@ # Wrap the response. text = Utils.wrap(text) outmsg = Message.UserNotification(sender, mlist.GetAdminEmail(), - subject, text) + subject, text, lang) outmsg['X-Mailer'] = _('The Mailman Replybot') # prevent recursions and mail loops! outmsg['X-Ack'] = 'No' Index: Mailman/MTA/Manual.py =================================================================== RCS file: /cvsroot/mailman/mailman/Mailman/MTA/Manual.py,v retrieving revision 2.2 diff -u -r2.2 Manual.py --- Mailman/MTA/Manual.py 2001/09/04 15:09:56 2.2 +++ Mailman/MTA/Manual.py 2001/11/19 11:00:15 @@ -65,7 +65,7 @@ msg = Message.UserNotification( siteowner, siteowner, _('Mailing list creation request for list %(listname)s'), - sfp.getvalue()) + sfp.getvalue(), mlist.preferred_language) outq = get_switchboard(mm_cfg.OUTQUEUE_DIR) outq.enqueue(msg, recips=[siteowner]) @@ -108,6 +108,6 @@ msg = Message.UserNotification( siteowner, siteowner, _('Mailing list removal request for list %(listname)s'), - sfp.getvalue()) + sfp.getvalue(), mlist.preferred_language) outq = get_switchboard(mm_cfg.OUTQUEUE_DIR) outq.enqueue(msg, recips=[siteowner]) Index: bin/newlist =================================================================== RCS file: /cvsroot/mailman/mailman/bin/newlist,v retrieving revision 2.10 diff -u -r2.10 newlist --- bin/newlist 2001/09/07 23:18:47 2.10 +++ bin/newlist 2001/11/19 11:00:15 @@ -179,7 +179,7 @@ msg = Message.UserNotification( owner_mail, siteadmin, _('Your new mailing list: %(listname)s'), - text) + text, mlist.preferred_language) msg.send(mlist) -- Ben Gertzfield $B%Y%s!&%,!<%D%U%#!<%k%I(B Global Media Online INC. $B%0%m%P%k%a%G%#%"%*%s%i%$%s3t<02q vtkusers=A3=AChi=A3=A1 Has anyone sucessfully use vtk to render to read, and render= DICOM3 file format? Please advise on how could it be done? bxb1280 bxb1280@yahoo.com =D6=C2 =C0=F1=A3=A1 bxb1280 bxb1280@yahoo.com _________________________________________________________ Do You Yahoo!? Get your free @yahoo.com address at http://mail.yahoo.com From Dan Mick Tue Nov 20 01:14:42 2001 From: Dan Mick (Dan Mick) Date: Mon, 19 Nov 2001 17:14:42 -0800 (PST) Subject: [Mailman-Developers] Fw: hi Message-ID: <200111200114.RAA03761@utopia.West.Sun.COM> No one on this list has any idea what you're talking about. The name is "mailman-developers", and that means it's a place for Mailman developers to talk. I have no idea what vtk or DICOM3 are. > vtkusers=A3=AChi=A3=A1 >=20 > Has anyone sucessfully use vtk to render to read, and render DICOM3 file > format? Please advise on how could it be done? >=20 > =20 >=20 > bxb1280 > bxb1280@yahoo.com >=20 >=20 >=20 >=20 > =D6=C2 > =C0=F1=A3=A1 >=20 > bxb1280 > bxb1280@yahoo.com >=20 >=20 > _________________________________________________________ > Do You Yahoo!? > Get your free @yahoo.com address at http://mail.yahoo.com >=20 >=20 > _______________________________________________ > Mailman-Developers mailing list > Mailman-Developers@python.org > http://mail.python.org/mailman/listinfo/mailman-developers From jaccino@ieev.uma.es Tue Nov 20 15:15:55 2001 From: jaccino@ieev.uma.es (Jose A. Accino) Date: Tue, 20 Nov 2001 16:15:55 +0100 Subject: [Mailman-Developers] Bug in Mailman version 2.1a3: AttributeError: one_last_digest In-Reply-To: <15264.41438.34480.725393@turnbull.sk.tsukuba.ac.jp> References: Message-ID: This problem occurs each time an admin attempts to set/remove the Digest option for a user. It's the version from CVS dated 7 sep 2001. >Bug in Mailman version 2.1a3 > >We're sorry, we hit a bug! > >If you would like to help us identify the problem, please email a copy of >this page to the webmaster for this site with a description of >what happened. Thanks! > >Traceback: > >Traceback (most recent call last): > File "/usr/local/mailman/scripts/driver", line 96, in run_main > main() > File "/usr/local/mailman/Mailman/Cgi/admin.py", line 158, in main > change_options(mlist, category, cgidata, doc) > File "/usr/local/mailman/Mailman/Cgi/admin.py", line 1316, in change_options > mlist.setMemberOption(user, mm_cfg.Digests, value) > File "/usr/local/mailman/Mailman/OldStyleMemberships.py", line 266, in >setMemberOption > self.__mlist.one_last_digest[memberkey] = cpuser > File "/usr/local/mailman/Mailman/MailList.py", line 134, in __getattr__ > raise AttributeError, name >AttributeError: one_last_digest Also, the admin is currently not receiving the requests to confirm subscriptions. BTW. I'd like to upgrade to latest CVS, so, is there any way to get the Python "email" package separately? I'm unable to find it on Python site. JA. JA. From jaccino@ieev.uma.es Tue Nov 20 18:29:27 2001 From: jaccino@ieev.uma.es (Jose A. Accino) Date: Tue, 20 Nov 2001 19:29:27 +0100 Subject: [Mailman-Developers] Bug creating lists in 2.1a3+ Message-ID: Well, I just updated to latest CVS. I installed Python 2.2 and Mailman. Now, creating a new list with the web interface I get the error message below. Using the command line I get a similar one but without the reference to the 'process request()' call. Any help? JA. >Bug in Mailman version 2.1a3+ > >[...] > >Traceback: > >Traceback (most recent call last): > File "/usr/local/mailman/scripts/driver", line 96, in run_main > main() > File "/usr/local/mailman/Mailman/Cgi/create.py", line 55, in main > process_request(doc, cgidata) > File "/usr/local/mailman/Mailman/Cgi/create.py", line 205, in >process_request > sys.modules[modname].create(mlist, cgi=1) > File "/usr/local/mailman/Mailman/MTA/Postfix.py", line 122, in create > db = dbhash.open(DBFILE, 'c') > File "/usr/local/lib/python2.2/dbhash.py", line 16, in open > return bsddb.hashopen(file, flag, mode) >error: (22, 'Invalid argument') > > > > > >Python information: > > Variable > Value > sys.version > 2.2b2 (#1, Nov 20 2001, 17:18:14) [GCC 2.95.2 20000220 >(Debian GNU/Linux)] > sys.executable > /usr/local/bin/python > sys.prefix > /usr/local > sys.exec_prefix > /usr/local > sys.path > /usr/local > sys.platform > linux2 From jaccino@ieev.uma.es Tue Nov 20 18:58:37 2001 From: jaccino@ieev.uma.es (Jose A. Accino) Date: Tue, 20 Nov 2001 19:58:37 +0100 Subject: [Mailman-Developers] More about bug creating lists in 2.1a3+ Message-ID: Looking at the lists directory the new lists are there. However I can't delete them, (i get a similar bug message) and posts sent are bounced back with a 'user unknown' (the listname) mesage. After running genaliases, messages to new lists are not bounced but, postfix log says 'fatal: open database ...aliases.db: Invalid argument' It seems that there is no problem however with old lists created before the update. Any ideas? TIA, JA. From barry@zope.com Tue Nov 20 19:34:48 2001 From: barry@zope.com (Barry A. Warsaw) Date: Tue, 20 Nov 2001 14:34:48 -0500 Subject: [Mailman-Developers] Bug in Mailman version 2.1a3: AttributeError: one_last_digest References: Message-ID: <15354.45144.351432.114936@anthem.wooz.org> >>>>> "JAA" == Jose A Accino writes: JAA> This problem occurs each time an admin attempts to set/remove JAA> the Digest option for a user. It's the version from CVS dated JAA> 7 sep 2001. Very strange. I've had other reports of this, but I can't seem to reproduce this, either with a brand new list, or a list upgraded from 2.0.7. JAA> Also, the admin is currently not receiving the requests to JAA> confirm subscriptions. I can't reproduce this either. JAA> BTW. I'd like to upgrade to latest CVS, so, is there any way JAA> to get the Python "email" package separately? I'm unable to JAA> find it on Python site. Actually, the latest email package is in the misc/ directory of cvs, but you can also get it at the mimelib SourceForge project. -Barry From barry@zope.com Tue Nov 20 19:48:12 2001 From: barry@zope.com (Barry A. Warsaw) Date: Tue, 20 Nov 2001 14:48:12 -0500 Subject: [Mailman-Developers] [PATCH] Proof-of-concept: proper MIME i18n mails from Mailman References: <87wv0nhtus.fsf@nausicaa.interq.or.jp> Message-ID: <15354.45948.141292.527073@anthem.wooz.org> Thanks Ben. I'm going to start looking at this stuff closely over the next few hours. A suggestion, since Daniel Buchmann's gotten me started on it. Would you like to hang out on irc for a while in case I have questions? -Barry From jaccino@ieev.uma.es Tue Nov 20 23:41:04 2001 From: jaccino@ieev.uma.es (J.Accino) Date: Wed, 21 Nov 2001 00:41:04 +0100 Subject: [Mailman-Developers] Corrupted Aliases.db (Was: bug creating new lists) Message-ID: Definitely, the problem seems related with a corrupted aliases db. Looking at the archives I've found a thread on past August about the same problem and gave a try to the trick used by R.Pilas: using 'postalias hash:/mailman/data/aliases' to build the db. I'm then able to send messages. But... I can't create or delete lists (!). At each attempt I get the following errors, both related to Postfix.py and dbhash.py: mailer:/usr/local/mailman# bin/newlist test5 me@ieev.uma.es xxxxx Traceback (most recent call last): File "bin/newlist", line 188, in ? main() File "bin/newlist", line 163, in main sys.modules[modname].create(mlist) File "/usr/local/mailman/Mailman/MTA/Postfix.py", line 122, in create db = dbhash.open(DBFILE, 'c') File "/usr/local/lib/python2.2/dbhash.py", line 16, in open return bsddb.hashopen(file, flag, mode) bsddb.error: (22, 'Argumento invalido') mailer:/usr/local/mailman# bin/rmlist -a test3 Traceback (most recent call last): File "bin/rmlist", line 120, in ? main() File "bin/rmlist", line 100, in main sys.modules[modname].remove(mlist) File "/usr/local/mailman/Mailman/MTA/Postfix.py", line 157, in remove db = dbhash.open(DBFILE, 'c') File "/usr/local/lib/python2.2/dbhash.py", line 16, in open return bsddb.hashopen(file, flag, mode) bsddb.error: (22, 'Argumento invalido') On the other side, following the steps on Readme.Postfix, genaliases seems to build a db unreadable by Postfix. I deleted aliases.db and rebuilt it with genaliases. I've been then able to create new lists and delete them, but Postfix is unable to read aliases.db and complaints with 'warning: mail_scan_any: got EOF; expected: string' and 'warning: private/local: malformed response'. Then, to send/receive mail I have to comment the call to the mailman alias in postfix/main.cf Any ideas? JA. From barry@zope.com Tue Nov 20 23:51:15 2001 From: barry@zope.com (Barry A. Warsaw) Date: Tue, 20 Nov 2001 18:51:15 -0500 Subject: [Mailman-Developers] Corrupted Aliases.db (Was: bug creating new lists) References: Message-ID: <15354.60531.961330.407992@anthem.wooz.org> >>>>> "JA" == J Accino writes: JA> Definitely, the problem seems related with a corrupted aliases JA> db. Actually, I'll bet its an incompatibility between the bsddb libraries used by Python and those used by Postfix. We need to figure out which version the two programs are using. The only way I can think of to do this is to use ldd to see which dynamic library the two of them are linked against, e.g. % ldd /usr/local/bin/postfix libdb.so.3 => /lib/libdb.so.3 (0x40018000) libnsl.so.1 => /lib/libnsl.so.1 (0x40053000) libresolv.so.2 => /lib/libresolv.so.2 (0x40069000) libc.so.6 => /lib/libc.so.6 (0x40078000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) % ldd /usr/local/lib/python2.1/lib-dynload/bsddb.so libdb.so.3 => /lib/libdb.so.3 (0x40009000) libc.so.6 => /lib/libc.so.6 (0x40044000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000) So in my case both are linked against libdb.so.3. What do yours say? If they differ, read this page for hints on how to get Python to use the same bsddb module as Postfix: http://python.sourceforge.net/devel-docs/lib/module-bsddb.html anticipating-a-faq-entry-ly y'rs, -Barry From mhz@alt-linux.org Wed Nov 21 07:07:33 2001 From: mhz@alt-linux.org (Mikhail Zabaluev) Date: Wed, 21 Nov 2001 10:07:33 +0300 Subject: [Mailman-Developers] I18n proposal Message-ID: <20011121070733.GB20256@localhost.localdomain> --wac7ysb48OaltWcw Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hello, I'd like to see some I18n issues in Mailman to be addressed prior to the 2.1 release. Basically, it's some bugs or misfeatures related to transformation of MIME-encoded messages. The most serious bug I see here is that messages encoded in base64 still get decorated with plaintext. This results in garbage on many clients. Here I attach a quick fix to disable decoration for base64-encoded messages. A more mature solution would be to decode such messages into 8bit, implementing Decoder for that matter, and slap decoration text onto the result. No, wait -- there still is an implicit assumption that message bodies and the decoration text share the same character set. Thus the decorations should be recoded from what character set they are assumed to be in (ASCII? ISO8859-1? UTF-8? Selectable per list?) into the character set of the message. Another problem is encoded messages in archives. Heck, look at this list's archive to see what I'm talking about. Those should also be decoded and have character set converted to some uniform one. I'd suggest UTF-8, but many browsers and text viewers still don't grok this charset, so it'd better be selectable as well. -- Stay tuned, MhZ JID: mookid@jabber.org ___________ A committee is a group that keeps the minutes and loses hours. -- Milton Berle --wac7ysb48OaltWcw Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="mailman-decorate.patch" --- mailman-cvs/Mailman/Handlers/Decorate.py.orig Wed Nov 21 09:27:45 2001 +++ mailman-cvs/Mailman/Handlers/Decorate.py Wed Nov 21 09:31:44 2001 @@ -52,10 +52,12 @@ header = decorate(mlist, mlist.msg_header, _('non-digest header'), d) footer = decorate(mlist, mlist.msg_footer, _('non-digest footer'), d) # Be MIME smart here. We only attach the header and footer by - # concatenation when the message is a non-multipart of type text/plain. + # concatenation when the message is a non-multipart of type text/plain + # in a human-readable encoding (i.e. not base64). # Otherwise, if it is not a multipart, we make it a multipart, and then we # add the header and footer as text/plain parts. - if not msg.is_multipart() and msg.get_type('text/plain') == 'text/plain': + if not msg.is_multipart() and msg.get_type('text/plain') == 'text/plain' + and msg['Content-Transfer-Encoding'] != 'base64': payload = header + msg.get_payload() + footer msg.set_payload(payload) elif msg.get_type() == 'multipart/mixed': --wac7ysb48OaltWcw-- From che@debian.org Wed Nov 21 09:29:41 2001 From: che@debian.org (Ben Gertzfield) Date: Wed, 21 Nov 2001 18:29:41 +0900 Subject: [Mailman-Developers] I18n proposal In-Reply-To: <20011121070733.GB20256@localhost.localdomain> (Mikhail Zabaluev's message of "Wed, 21 Nov 2001 10:07:33 +0300") References: <20011121070733.GB20256@localhost.localdomain> Message-ID: <87bshwcvzu.fsf@nausicaa.interq.or.jp> >>>>> "Mikhail" == Mikhail Zabaluev writes: Mikhail> Hello, I'd like to see some I18n issues in Mailman to be Mikhail> addressed prior to the 2.1 release. Basically, it's some Mikhail> bugs or misfeatures related to transformation of Mikhail> MIME-encoded messages. I am working actively with Barry now on Mailman's i18n issues. See my recent patches in the archives. Mikhail> The most serious bug I see here is that messages encoded Mikhail> in base64 still get decorated with plaintext. Headers or bodies? Are you talking about the footer tacked on to the end of messages? If so, it would be simple with the new message structure to make the footer be a separate text part. Though, I don't see how adding some plain text after the end of the boundary could be corrupted; could you put an example corrupted message up? Mikahil> No, wait -- there still is an implicit assumption that Mikahil> message bodies and the decoration text share the same Mikahil> character set. Thus the decorations should be recoded Mikahil> from what character set they are assumed to be in (ASCII? Mikahil> ISO8859-1? UTF-8? Selectable per list?) into the Mikahil> character set of the message. I'll work on addressing this now that we have some code that actually deals with character set issues. Mikhail> Another problem is encoded messages in archives. Heck, Mikhail> look at this list's archive to see what I'm talking Mikhail> about. Those should also be decoded and have character Mikhail> set converted to some uniform one. I'd suggest UTF-8, but Mikhail> many browsers and text viewers still don't grok this Mikhail> charset, so it'd better be selectable as well. I talked with Barry about this today. My solution is to "guess" the character set based on whichever is most common in the archives, and use that as the charset specified in the HTML. For any messages with multi-language subjects or bodies, the main language will be left in the normal character set, and the multi-language parts will be encoded with the UTF-8 HTML entity. This will require Python unicode codecs for all our languages, which do not exist for KOI-8, Big5, or GB, as far as I know. Ben -- Brought to you by the letters B and S and the number 14. "It is sad. *Campers* cannot *dance*. Not even a *party*." Debian GNU/Linux maintainer of Gimp and Nethack -- http://www.debian.org/ From jaccino@ieev.uma.es Wed Nov 21 09:48:06 2001 From: jaccino@ieev.uma.es (Jose A. Accino) Date: Wed, 21 Nov 2001 10:48:06 +0100 Subject: [Mailman-Developers] Corrupted Aliases.db (Was: bug creating new lists) In-Reply-To: <15354.60531.961330.407992@anthem.wooz.org> References: Message-ID: >Actually, I'll bet its an incompatibility between the bsddb libraries >used by Python and those used by Postfix. Yes, python 2.2 is using libdb.so.2, while postfix uses libdb.so.3 # ldd /usr/local/lib/python2.2/lib-dynload/bsddb.so libdb.so.2 => /lib/libdb.so.2 (0x40007000) libc.so.6 => /lib/libc.so.6 (0x40016000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000) # ldd /usr/sbin/postfix libdb.so.3 => /lib/libdb.so.3 (0x40016000) libnsl.so.1 => /lib/libnsl.so.1 (0x40052000) libresolv.so.2 => /lib/libresolv.so.2 (0x40068000) libc.so.6 => /lib/libc.so.6 (0x40077000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000) However, previous Python was also using libdb.so.3 # ldd /usr/local/lib/python2.1/lib-dynload/bsddb.so libdb.so.3 => /lib/libdb.so.3 (0x40007000) libc.so.6 => /lib/libc.so.6 (0x40043000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000) I think I'll get the email package and return back to Python 2.1. Any advantage on going into Python 2.2 (besides the email lib)? JA. From mrbill@mrbill.net Wed Nov 21 12:37:59 2001 From: mrbill@mrbill.net (Bill Bradford) Date: Wed, 21 Nov 2001 06:37:59 -0600 Subject: [Mailman-Developers] "bug" on download page Message-ID: <20011121063759.F13989@mrbill.net> http://www.list.org/MM21/download.html lists the current stable version at 2.0.5... Bill -- Bill Bradford mrbill@mrbill.net Austin, TX From mrbill@mrbill.net Wed Nov 21 12:45:58 2001 From: mrbill@mrbill.net (Bill Bradford) Date: Wed, 21 Nov 2001 06:45:58 -0600 Subject: [Mailman-Developers] problem with 2.1a3 Message-ID: <20011121064558.G13989@mrbill.net> Should I be getting it from CVS instead of sourceforge? Trying to install in /usr/local/mailman21 (my "production" 2.0.7 install is in /usr/local/ mailman): while doing "make": Listing /usr/local/mailman21/Mailman/pythonlib ... Compiling /usr/local/mailman21/Mailman/pythonlib/StringIO.py ... Compiling /usr/local/mailman21/Mailman/pythonlib/__init__.py ... Compiling /usr/local/mailman21/Mailman/pythonlib/cgi.py ... Compiling /usr/local/mailman21/Mailman/pythonlib/mailbox.py ... Compiling /usr/local/mailman21/Mailman/pythonlib/rfc822.py ... Compiling /usr/local/mailman21/Mailman/versions.py ... Traceback (most recent call last): File "bin/update", line 46, in ? from Mailman import Utils File "/usr/local/mailman21/Mailman/Utils.py", line 34, in ? import email.Iterators ImportError: No module named email.Iterators gmake: *** [update] Error 1 Python 2.1: root@ohno:/usr/local/src/mailman-2.1a3> python -V Python 2.1.1 Bill -- Bill Bradford mrbill@mrbill.net Austin, TX From mrbill@mrbill.net Wed Nov 21 12:51:36 2001 From: mrbill@mrbill.net (Bill Bradford) Date: Wed, 21 Nov 2001 06:51:36 -0600 Subject: [Mailman-Developers] problem with 2.1a3 In-Reply-To: <20011121064558.G13989@mrbill.net> References: <20011121064558.G13989@mrbill.net> Message-ID: <20011121065136.H13989@mrbill.net> On Wed, Nov 21, 2001 at 06:45:58AM -0600, Bill Bradford wrote: > Python 2.1: > root@ohno:/usr/local/src/mailman-2.1a3> python -V > Python 2.1.1 Okay, where can I find the standalone email module source? Bill -- Bill Bradford mrbill@mrbill.net Austin, TX From barry@zope.com Wed Nov 21 17:12:35 2001 From: barry@zope.com (Barry A. Warsaw) Date: Wed, 21 Nov 2001 12:12:35 -0500 Subject: [Mailman-Developers] Hanging out on irc Message-ID: <15355.57475.790633.509390@anthem.wooz.org> Hey folks, I'll be hanging on irc today, off and on until about 7pm EST, talking about MM2.1. irc.openprojects.net #mailman See you there, -Barry From barry@zope.com Wed Nov 21 18:14:48 2001 From: barry@zope.com (Barry A. Warsaw) Date: Wed, 21 Nov 2001 13:14:48 -0500 Subject: [Mailman-Developers] "bug" on download page References: <20011121063759.F13989@mrbill.net> Message-ID: <15355.61208.708966.406103@anthem.wooz.org> >>>>> "BB" == Bill Bradford writes: BB> http://www.list.org/MM21/download.html BB> lists the current stable version at 2.0.5... Fixed, thanks. From Nigel.Metheringham@Vdata.co.uk Wed Nov 21 23:00:31 2001 From: Nigel.Metheringham@Vdata.co.uk (Nigel Metheringham) Date: 21 Nov 2001 23:00:31 +0000 Subject: [Mailman-Developers] MTA interface for MM 2.1 Message-ID: <1006383631.9585.0.camel@rincewind.localnet> People are probably familiar with teh current ability of exim to be configured to automagically see lists and handle them appropriately. There is also a wrapper (in scripts/auto) in MM 2.1 that attempts to do the same thing for postfix (BTW it will need updating for the additional aliases now used). MM 2.1 uses some additional list entry points. This means that for an alias based approach to injecting mail there are now more aliases, and worse they aren't regular. Here's the alias set for a list with basename x (I have truncated the path on wrapper to make it fit without wrapping):- x |wrapper post x x-admin |wrapper mailowner x x-request |wrapper mailcmd x x-join |wrapper join x x-leave |wrapper leave x x-bounces |wrapper bounces x x-owner |wrapper mailowner x Additionally if VERP is being used, the bounces alias should also be matching stuff like x-bounces+aperson=dom.ain@mailhost.dom Exim (and I guess other mailers - I'm going to talk on what I know and then let other folks talk on the other MTAs), can handle stuff based on regular expressions, so given a list x (matched by some magic - current config does it by checking if the file /home/mailman/lists/x/config.db exists) its dead easy to match an address suffix (I think the postfix folks call this an extension ) -(admin|request|join|leave|bounces|owner) However, since the argument to wrapper varies with the extension I then need an additional lookup to convert that extention to the wrapper command. So, for exim, life would be much easier if I could handle these (excluding the post command) by having (.+)-(admin|request|join|leave|bounces|owner) map to |wrapper $2 $1 [$1 & $2 are the regexp matches from the expression above] Barry - any chance of regularising the naming of the entry points, or adding aliases for admin, request and owner?? I would guess this approach would work for several different mailers. BTW VERP could be handled by changing the intitial regexp to ([a-z0-9_-]*)-(admin|request|join|leave|bounces|owner)(\+.*) An alternative approach might be that all addresses that are caught by the MTA list matching stuff are passed direct into the Mailman address handler, so you just invoked wrapper mailman-address-handler
    and let the python do the magic from there on. Nigel. If it was then possible to From claw@kanga.nu Wed Nov 21 23:18:44 2001 From: claw@kanga.nu (J C Lawrence) Date: Wed, 21 Nov 2001 15:18:44 -0800 Subject: [Mailman-Developers] MTA interface for MM 2.1 In-Reply-To: Message from Nigel Metheringham of "21 Nov 2001 23:00:31 GMT." <1006383631.9585.0.camel@rincewind.localnet> References: <1006383631.9585.0.camel@rincewind.localnet> Message-ID: <26088.1006384724@kanga.nu> On 21 Nov 2001 23:00:31 +0000 Nigel Metheringham wrote: > x |wrapper post x > x-admin |wrapper mailowner x > x-request |wrapper mailcmd x > x-join |wrapper join x > x-leave |wrapper leave x > x-bounces |wrapper bounces x > x-owner |wrapper mailowner x Barry, It seems like it would be wise/good to also support: x-subscribe |wrapper subscribe x x-unsubscribe |wrapper unsubscribe x ie making "subscribe" an alias for "join" and ditto for leave/unsubscribe. Its a small thing, but I suspect it would reduce confusion. -- J C Lawrence ---------(*) Satan, oscillate my metallic sonatas. claw@kanga.nu He lived as a devil, eh? http://www.kanga.nu/~claw/ Evil is a name of a foeman, as I live. From barry@zope.com Wed Nov 21 23:24:30 2001 From: barry@zope.com (Barry A. Warsaw) Date: Wed, 21 Nov 2001 18:24:30 -0500 Subject: [Mailman-Developers] MTA interface for MM 2.1 References: <1006383631.9585.0.camel@rincewind.localnet> Message-ID: <15356.14254.146387.1617@anthem.wooz.org> >>>>> "NM" == Nigel Metheringham writes: NM> People are probably familiar with teh current ability of exim NM> to be configured to automagically see lists and handle them NM> appropriately. There is also a wrapper (in scripts/auto) in NM> MM 2.1 that attempts to do the same thing for postfix (BTW it NM> will need updating for the additional aliases now used). I actually don't plan on updating auto for MM2.1. To use it requires you to configure Postfix in ways that could interact poorly with other parts of your mail system, depending on your topology. I'm not sure if I should leave it around for posterity, or just zap it. NM> MM 2.1 uses some additional list entry points. This means NM> that for an alias based approach to injecting mail there are NM> now more aliases, and worse they aren't regular. Here's the NM> alias set for a list with basename x (I have truncated the NM> path on wrapper to make it fit without wrapping):- | x |wrapper post x | x-admin |wrapper mailowner x | x-request |wrapper mailcmd x | x-join |wrapper join x | x-leave |wrapper leave x | x-bounces |wrapper bounces x | x-owner |wrapper mailowner x NM> Additionally if VERP is being used, the bounces alias should NM> also be matching stuff like NM> x-bounces+aperson=dom.ain@mailhost.dom NM> Exim (and I guess other mailers - I'm going to talk on what I NM> know and then let other folks talk on the other MTAs), can NM> handle stuff based on regular expressions, so given a list x NM> (matched by some magic - current config does it by checking if NM> the file /home/mailman/lists/x/config.db exists) its dead easy NM> to match an address suffix (I think the postfix folks call NM> this an extension ) -(admin|request|join|leave|bounces|owner) Note that the current approach to auto-aliasing for Postfix actually does set up each and every alias -- no regexp matching is done. It's just that I know the format Postfix uses and we can write that format in Python, so updating them is hidden from the admin. Aside 1: I believe Fil has an alternative approach for Postfix that does use regexps. Aside 2: My current approach for Postfix may cause some logistical problems because it requires that the version of Berkeley DB that Postfix is linked against be the same as the version that Python is linked against, and it's notoriously hard to get this right in Python. Especially in Python 2.0.x which doesn't build the bsddb module by default (though Python 2.1.x does, which is one of the reasons I'm considering requiring it for MM2.1). Aside 3: MM2.1 won't use marshal as it's serialization format any more; it uses pickle so the landmark file needs to be config.pck instead (although that file will only exist after the first time the list is opened and saved -- we could make sure the upgrade script does this for every list though). Aside 4: There was an interesting idea, in SF I think, that maybe the MTA should just delivery to an mbox file, and then Mailman's qrunners should just walk the mbox file. We'd have to coordinate locking b/w Mailman and the MTA, so that could be problematic. OTOH, it would save having to fork the wrapper script just to dump the plain text in the queue.y NM> However, since the argument to wrapper varies with the NM> extension I then need an additional lookup to convert that NM> extention to the wrapper command. NM> So, for exim, life would be much easier if I could handle NM> these (excluding the post command) by having | (.+)-(admin|request|join|leave|bounces|owner) | map to | |wrapper $2 $1 NM> [$1 & $2 are the regexp matches from the expression above] NM> Barry - any chance of regularising the naming of the entry NM> points, or adding aliases for admin, request and owner?? I NM> would guess this approach would work for several different NM> mailers. I've thought the same thing. I avoided in the past because it would have required regeneration of aliases, but now that we've bit that bullet, I think it does make sense to regularize them. I'll have to see if I can get SF to make copies of the cvs files so I can preserve the historical record, but I think it's a good idea. | BTW VERP could be handled by changing the intitial regexp to | ([a-z0-9_-]*)-(admin|request|join|leave|bounces|owner)(\+.*) VERP format will be very configurable, so as long as you can write a Python regexp to pull it apart, you can basically tell Mailman to use any VERP format you want. NM> An alternative approach might be that all addresses that are NM> caught by the MTA list matching stuff are passed direct into NM> the Mailman address handler, so you just invoked wrapper NM> mailman-address-handler
    NM> and let the python do the magic from there on. I've found it convenient to do a little bit of preprocessing in the wrapper script and knowing beforehand which alias the message is being delivered to. One reason is because I don't want to force the wrappers to parse the email messages. Parsing is expensive, and potentially error prone, and the wrapper can't gracefully handle the errors without a lot of complexity. Which slows things down. Which increases the possibility of mail filter timeout. Which we definitely want to avoid at all costs. To sum up: let's regularize the wrapper script names so that they are the same as the extension they feed off of (sans the separating dash). One catch is for the -admin address; I want this to go to the bounces script for backwards compatibility. So I guess we need to make a symlink from scripts/bounces -> scripts/admin ...? NM> Nigel. -Barry NM> If it was then possible to Maybe, but only if we From barry@zope.com Wed Nov 21 23:27:13 2001 From: barry@zope.com (Barry A. Warsaw) Date: Wed, 21 Nov 2001 18:27:13 -0500 Subject: [Mailman-Developers] MTA interface for MM 2.1 References: <1006383631.9585.0.camel@rincewind.localnet> <26088.1006384724@kanga.nu> Message-ID: <15356.14417.881311.857135@anthem.wooz.org> >>>>> "JCL" == J C Lawrence writes: JCL> It seems like it would be wise/good to also support: | x-subscribe |wrapper subscribe x | x-unsubscribe |wrapper unsubscribe x JCL> ie making "subscribe" an alias for "join" and ditto for JCL> leave/unsubscribe. Its a small thing, but I suspect it would JCL> reduce confusion. We can do that. Same issue as I just brought up with -admin: I suppose we do this with symlinks (in the Makefile). -Barry From barry@zope.com Wed Nov 21 23:31:30 2001 From: barry@zope.com (Barry A. Warsaw) Date: Wed, 21 Nov 2001 18:31:30 -0500 Subject: [Mailman-Developers] MTA interface for MM 2.1 References: <1006383631.9585.0.camel@rincewind.localnet> <26088.1006384724@kanga.nu> Message-ID: <15356.14674.736312.261819@anthem.wooz.org> One other thing: In MM2.1 you'll have to set up a "site list" which is where - all password reminders appear to come from - all bounces to list owners will be directed to By default this site list is called "mailman". So if a message to a list owner starts to bounce, mailman-bounces@dom.ain will get those notifications. However, what happens if messages to mailman-owner@dom.ain start to bounce? To break the loop I'm currently creating a mailman-loop@dom.ain address that all bounces to the site list's owner gets directed to. This address is a simple append-to-file alias since there's little that Mailman can do if the site list owners aren't reachable. It currently appends to $prefix/data/owner-bounces.mbox. -Barry From bob@nleaudio.com Wed Nov 21 23:35:13 2001 From: bob@nleaudio.com (Bob Puff/NLE) Date: Wed, 21 Nov 2001 18:35:13 -0500 Subject: [Mailman-Developers] MTA interface for MM 2.1 References: <1006383631.9585.0.camel@rincewind.localnet> <15356.14254.146387.1617@anthem.wooz.org> Message-ID: <3BFC3A31.250972FB@nleaudio.com> > I actually don't plan on updating auto for MM2.1. To use it requires > you to configure Postfix in ways that could interact poorly with other > parts of your mail system, depending on your topology. I'm not sure > if I should leave it around for posterity, or just zap it. Hey Barry, So then are you saying that you are going to nuke the list creation stuff? If it will stay, also please think about updating the Postfix virtual file. That is necessary on any system receiving mail for more than one domain. Bob From barry@zope.com Wed Nov 21 23:41:13 2001 From: barry@zope.com (Barry A. Warsaw) Date: Wed, 21 Nov 2001 18:41:13 -0500 Subject: [Mailman-Developers] MTA interface for MM 2.1 References: <1006383631.9585.0.camel@rincewind.localnet> <15356.14254.146387.1617@anthem.wooz.org> <3BFC3A31.250972FB@nleaudio.com> Message-ID: <15356.15257.411583.111041@anthem.wooz.org> >>>>> "BP" == Bob Puff writes: BP> So then are you saying that you are going to nuke the list BP> creation stuff? No, definitely not! BP> If it will stay, also please think about updating the Postfix BP> virtual file. That is necessary on any system receiving mail BP> for more than one domain. Hmm, my current approach has simply been to write db entries to a file pointed to by the alias_maps variable. I need to think about this approach in the face of virtual domains... -Barry From claw@kanga.nu Wed Nov 21 23:46:31 2001 From: claw@kanga.nu (J C Lawrence) Date: Wed, 21 Nov 2001 15:46:31 -0800 Subject: [Mailman-Developers] MTA interface for MM 2.1 In-Reply-To: Message from barry@zope.com (Barry A. Warsaw) of "Wed, 21 Nov 2001 18:24:30 EST." <15356.14254.146387.1617@anthem.wooz.org> References: <1006383631.9585.0.camel@rincewind.localnet> <15356.14254.146387.1617@anthem.wooz.org> Message-ID: <26549.1006386391@kanga.nu> On Wed, 21 Nov 2001 18:24:30 -0500 Barry A Warsaw wrote: > I actually don't plan on updating auto for MM2.1. To use it > requires you to configure Postfix in ways that could interact > poorly with other parts of your mail system, depending on your > topology. I'm not sure if I should leave it around for posterity, > or just zap it. Drop it in an "unsupported" subdirectory? -- J C Lawrence ---------(*) Satan, oscillate my metallic sonatas. claw@kanga.nu He lived as a devil, eh? http://www.kanga.nu/~claw/ Evil is a name of a foeman, as I live. From bob@nleaudio.com Wed Nov 21 23:47:22 2001 From: bob@nleaudio.com (Bob Puff/NLE) Date: Wed, 21 Nov 2001 18:47:22 -0500 Subject: [Mailman-Developers] MTA interface for MM 2.1 References: <1006383631.9585.0.camel@rincewind.localnet> <15356.14254.146387.1617@anthem.wooz.org> <3BFC3A31.250972FB@nleaudio.com> <15356.15257.411583.111041@anthem.wooz.org> Message-ID: <3BFC3D0A.14778C99@nleaudio.com> > Hmm, my current approach has simply been to write db entries to a file > pointed to by the alias_maps variable. Right, and this is still necessary. But the virtual maps are also equally as important, since the newbies are still gonna say "Why is mail to the list bouncing if it automagically creates everything?!". Updating the /etc/postfix/virtual file takes the Postfix postmap command to generate its database file, which is a little different from the postalias program that you run/emulate now. Bob From barry@zope.com Thu Nov 22 00:40:54 2001 From: barry@zope.com (Barry A. Warsaw) Date: Wed, 21 Nov 2001 19:40:54 -0500 Subject: [Mailman-Developers] MTA interface for MM 2.1 References: <1006383631.9585.0.camel@rincewind.localnet> <15356.14254.146387.1617@anthem.wooz.org> <26549.1006386391@kanga.nu> Message-ID: <15356.18838.964122.990455@anthem.wooz.org> >>>>> "JCL" == J C Lawrence writes: JCL> Drop it in an "unsupported" subdirectory? Maybe just `contrib'. -Barry From jon@latchkey.com Thu Nov 22 00:43:59 2001 From: jon@latchkey.com (Jon Stevens) Date: Wed, 21 Nov 2001 16:43:59 -0800 Subject: [Mailman-Developers] MTA interface for MM 2.1 In-Reply-To: <26088.1006384724@kanga.nu> Message-ID: on 11/21/01 3:18 PM, "J C Lawrence" wrote: > Barry, > > It seems like it would be wise/good to also support: > > x-subscribe |wrapper subscribe x > x-unsubscribe |wrapper unsubscribe x > > ie making "subscribe" an alias for "join" and ditto for > leave/unsubscribe. Its a small thing, but I suspect it would reduce > confusion. I would love to see... x-on x-off Also map to x-subscribe/x-unsubscribe -jon From barry@zope.com Thu Nov 22 00:46:53 2001 From: barry@zope.com (Barry A. Warsaw) Date: Wed, 21 Nov 2001 19:46:53 -0500 Subject: [Mailman-Developers] MTA interface for MM 2.1 References: <26088.1006384724@kanga.nu> Message-ID: <15356.19197.511308.859410@anthem.wooz.org> >>>>> "JS" == Jon Stevens writes: | x-on | x-off JS> Also map to x-subscribe/x-unsubscribe I sort of felt that x-join and x-leave were natural and easy to understand without resorting to mailing list nomenclature. I'd like to keep the set of standard aliases to a minimum. -Barry From christopher@schulte.org Thu Nov 22 04:45:15 2001 From: christopher@schulte.org (Christopher Schulte) Date: Wed, 21 Nov 2001 22:45:15 -0600 Subject: [Mailman-Developers] MTA interface for MM 2.1 In-Reply-To: <3BFC3D0A.14778C99@nleaudio.com> References: <1006383631.9585.0.camel@rincewind.localnet> <15356.14254.146387.1617@anthem.wooz.org> <3BFC3A31.250972FB@nleaudio.com> <15356.15257.411583.111041@anthem.wooz.org> Message-ID: <5.1.0.14.0.20011121224007.03168570@pop.schulte.org> At 06:47 PM 11/21/2001 -0500, Bob Puff/NLE wrote: >Right, and this is still necessary. But the virtual maps are also equally >as important, since the newbies are still gonna say "Why is mail to the >list bouncing if it automagically creates everything?!". You have to draw the line as to how far you're going to 'dummy proof' your software. Not everyone uses virtual maps in this manner. I don't. >Updating the /etc/postfix/virtual file takes the Postfix postmap command >to generate its database file, which is a little different from the >postalias program that you run/emulate now. I won't let any automatic process touch my master virtual file. The current setup (as of 2.1a3) works just fine; it takes control of one specific file which I bless. I then make postfix include it in alias processing. It's simple and works. Move it to ./contrib if needed, but please don't toss it. >Bob -- Christopher Schulte christopher@schulte.org http://noc.schulte.org/ From bob@nleaudio.com Thu Nov 22 05:52:47 2001 From: bob@nleaudio.com (bob@nleaudio.com) Date: Thu, 22 Nov 2001 00:52:47 -0500 (EST) Subject: [Mailman-Developers] MTA interface for MM 2.1 Message-ID: <20011122055247.4B8AB13D127@main.nlenet.net> This is a MIME-encapsulated message. --------------463755580774767922290689 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit >I won't let any automatic process touch my master virtual file. The >current setup (as of 2.1a3) works just fine; it takes control of one >specific file which I bless. I then make postfix include it in alias >processing. It's simple and works. How are you then letting Postfix know what domain you are adding the list to? If it only does half the job of creating the list, it isn't fulfilling its function of automatically creating the list without needing the sysadmin to do it for you, or having to edit the files yourself. Also remember you don't have to have an automated process touch your master virtual mapping file. Do the same thing Barry did for the aliases file - use an _additional_ file, and tell Postfix where it is, and to use it in addition to the master file. Bob --------------463755580774767922290689-- From barry@zope.com Thu Nov 22 07:07:28 2001 From: barry@zope.com (Barry A. Warsaw) Date: Thu, 22 Nov 2001 02:07:28 -0500 Subject: [Mailman-Developers] MTA interface for MM 2.1 References: <20011122055247.4B8AB13D127@main.nlenet.net> Message-ID: <15356.42032.51456.803284@anthem.wooz.org> >>>>> "bob" == writes: bob> Also remember you don't have to have an automated process bob> touch your master virtual mapping file. Do the same thing bob> Barry did for the aliases file - use an _additional_ file, bob> and tell Postfix where it is, and to use it in addition to bob> the master file. I figured out how to support Postfix-style virtual domains[1] in a similar manner to the main aliases file, but I'm too tired to finish implementing it tonight. Bob's right, if you're using Postfix-style virtual domains, we need to write into another file, and it doesn't need to be your main virtual file. In fact, it'll be called $prefix/data/virtual-mailman and you'll need to add something like that path to your virtual_maps variable (and /not/ run postmap on it! We'll take care of that for you). If you're not using virtual domains, or you're using Sendmail-style virtual domains, we don't need to do anything extra. There will be an mm_cfg variable POSTFIX_STYLE_VIRTUAL_DOMAINS, defaulting to 0, which you'll set to 1 if you're doing Postfix-style virtual domains. to-sleep-perchance-to-dream-of-mtas-ly y'rs, -Barry [1] http://www.postfix.org/virtual.5.html From Nigel.Metheringham@VData.co.uk Thu Nov 22 10:32:28 2001 From: Nigel.Metheringham@VData.co.uk (Nigel Metheringham) Date: 22 Nov 2001 10:32:28 +0000 Subject: [Mailman-Developers] MTA interface for MM 2.1 In-Reply-To: <15356.14254.146387.1617@anthem.wooz.org> References: <1006383631.9585.0.camel@rincewind.localnet> <15356.14254.146387.1617@anthem.wooz.org> Message-ID: <1006425149.31382.0.camel@gaspode.localnet> On Wed, 2001-11-21 at 23:24, Barry A. Warsaw wrote: > > >>>>> "NM" == Nigel Metheringham writes: > NM> An alternative approach might be that all addresses that are > NM> caught by the MTA list matching stuff are passed direct into > NM> the Mailman address handler, so you just invoked wrapper > NM> mailman-address-handler
    > NM> and let the python do the magic from there on. > > I've found it convenient to do a little bit of preprocessing in the > wrapper script and knowing beforehand which alias the message is being > delivered to. One reason is because I don't want to force the > wrappers to parse the email messages. Parsing is expensive, and > potentially error prone, and the wrapper can't gracefully handle the > errors without a lot of complexity. Which slows things down. Which > increases the possibility of mail filter timeout. Which we definitely > want to avoid at all costs. Barry, what I was suggesting is that Mailman parses the address, not the message, so a message to the list would be piped in to |superwrapper x@dom.ain a join request would be passed in to |superwrapper x-join@dom.ain and a VERP bounce would go to |superwrapper x-bounces+sub=their.dom.ain@dom.ain For exim handling this is getting into the seriously trivial catagory, and I would expect most other MTAs to find it easy. The @dom.ain bit could be optional, but might have future expansion possibilities for the virtual domain handling some people want. Nigel. From mhz@alt-linux.org Thu Nov 22 23:13:54 2001 From: mhz@alt-linux.org (Mikhail Zabaluev) Date: Fri, 23 Nov 2001 02:13:54 +0300 Subject: [Mailman-Developers] I18n proposal In-Reply-To: <87bshwcvzu.fsf@nausicaa.interq.or.jp> References: <20011121070733.GB20256@localhost.localdomain> <87bshwcvzu.fsf@nausicaa.interq.or.jp> Message-ID: <20011122231354.GG2158@localhost.localdomain> Hello Ben, On Wed, Nov 21, 2001 at 06:29:41PM +0900, Ben Gertzfield wrote: > > Mikhail> The most serious bug I see here is that messages encoded > Mikhail> in base64 still get decorated with plaintext. > > Headers or bodies? Oh, and headers hurt too, when someone replies with the mailing list label in the subject hidden inside a base64 encoded word, and Mailman slaps another label, ad infinitum. The subject context should be decoded prior to searching for the label. > Are you talking about the footer tacked on to the > end of messages? If so, it would be simple with the new message > structure to make the footer be a separate text part. Though, I > don't see how adding some plain text after the end of the boundary > could be corrupted; could you put an example corrupted message up? Cannot find one right now, but I see them every now and then on our Russian lists. Base64 is not a robust encoding; any non-base64 text appended to a base64 stream produces garbage when decoded. Decorating such messages with separate MIME part would be a better solution than fiddle with decoding/recoding. > Mikhail> Another problem is encoded messages in archives. Heck, > Mikhail> look at this list's archive to see what I'm talking > Mikhail> about. Those should also be decoded and have character > Mikhail> set converted to some uniform one. I'd suggest UTF-8, but > Mikhail> many browsers and text viewers still don't grok this > Mikhail> charset, so it'd better be selectable as well. > > I talked with Barry about this today. My solution is to "guess" the > character set based on whichever is most common in the archives, and > use that as the charset specified in the HTML. It's unreliable, can change over time, and will certainly cause problems. Leave the administrator control over which charset his list archives are served in. For storage, I'd still choose encoding everything into UTF-8; this makes archives independent of the target charset and resolves problems with multi-language messages. > For any messages with > multi-language subjects or bodies, the main language will be left > in the normal character set, and the multi-language parts will be > encoded with the UTF-8 HTML entity. For starters, this could be done for all non-ASCII symbols. > This will require Python unicode codecs for all our languages, which > do not exist for KOI-8, Big5, or GB, as far as I know. iconv-based codecs should exist for these; I must see. -- Stay tuned, MhZ JID: mookid@jabber.org ___________ The best audience is intelligent, well-educated and a little drunk. -- Maurice Baring From marc_news@valinux.com Thu Nov 22 19:06:01 2001 From: marc_news@valinux.com (Marc MERLIN) Date: Thu, 22 Nov 2001 11:06:01 -0800 Subject: [Mailman-Developers] Having more than 16,000 lists In-Reply-To: <20011109173447.B32688@gandalf.merlins.org>; from marc_news@valinux.com on Fri, Nov 09, 2001 at 05:34:47PM -0800 References: <87hesmbysl.fsf@nausicaa.interq.or.jp> <20011026181219.O12632@magic.merlins.org> <15322.8042.967043.536680@anthem.wooz.org> <20011109173447.B32688@gandalf.merlins.org> Message-ID: <20011122110601.A1279@gandalf.merlins.org> On Fri, Nov 09, 2001 at 05:34:47PM -0800, Marc MERLIN wrote: > On Fri, Oct 26, 2001 at 10:43:54PM -0400, Barry A. Warsaw wrote: > > MM> Just for the record, Sourceforge just hit the 16,000 lists > > MM> limit today and broke because ext2fs doesn't support more than > > MM> 32,000 links to a directory (archives/private had 32,000 > > MM> archive dirs) I'm told freebsd's UFS has similar problems. > > > > Wow, neat! Not for you, but neat. :) > > BTW, I ended up removing all the HTML archive directories since I've turned > off HTML archiving anyway. > That gives us a little while (more than six months if we are lucky :-D) > before we hit the 32,000 lists mark. > > I'm thinking about an optional modification to mailman which only affects > list creation that creates the mailman/foo/l/li/listname dirs, and then > symlinks all this to mailman/foo/listname > Yeah, symlinks aren't great, but the advantage is that it requires no other > changes to the mailman code I haven't yet had the time to work on this, but I wanted to know what your preference was between a hack that optionally creates mailman/foo/l/li/listname dirs at the time the list is created, and then sets symlinks back to where the rest of the mailman code expects to see the files and dirs, or a bigger change to teach all of mailman about the new file and dir location (no more symlinks) Of course, if we go with the no symlink route, making the deep subdir config optional would be a bit more work. What's your take on this, and which route would you prefer? Marc -- Microsoft is to operating systems & security .... .... what McDonalds is to gourmet cooking Home page: http://marc.merlins.org/ | Finger marc_f@merlins.org for PGP key From roy@lamrim.com Fri Nov 23 03:23:52 2001 From: roy@lamrim.com (Roy Harvey) Date: Thu, 22 Nov 2001 19:23:52 -0800 Subject: [Mailman-Developers] Orwellian Archives? In-Reply-To: <15340.23456.886142.932986@anthem.wooz.org> Message-ID: <3.0.5.32.20011122192352.01046d20@lamrim.com> Dear Barry -- Is there a way to remove individual messages from the archives? Thanks, Roy From mrbill@mrbill.net Fri Nov 23 08:59:26 2001 From: mrbill@mrbill.net (Bill Bradford) Date: Fri, 23 Nov 2001 02:59:26 -0600 Subject: [Mailman-Developers] Orwellian Archives? In-Reply-To: <3.0.5.32.20011122192352.01046d20@lamrim.com> References: <15340.23456.886142.932986@anthem.wooz.org> <3.0.5.32.20011122192352.01046d20@lamrim.com> Message-ID: <20011123025926.O1519@mrbill.net> On Thu, Nov 22, 2001 at 07:23:52PM -0800, Roy Harvey wrote: > Dear Barry -- > Is there a way to remove individual messages from the archives? > Thanks, > Roy When I've had to do this, I just go edit that HTML file by hand and replace the message text with "THIS MESSAGE HAS BEEN REMOVED". Had a couple of "for sale" posts that kept coming up in Google and I kept getting email from people a year later (almost one a day!) about "do you still have your X10 stuff for sale?" I finally went in and put this in the message archive HTML:

    THIS ITEM IS NO LONGER FOR SALE. DONT EMAIL ME ABOUT IT

    Couple of days later, the emails stopped. 8-) Bill -- Bill Bradford mrbill@mrbill.net Austin, TX From bob@nleaudio.com Fri Nov 23 17:18:12 2001 From: bob@nleaudio.com (bob@nleaudio.com) Date: Fri, 23 Nov 2001 12:18:12 -0500 (EST) Subject: [Mailman-Developers] Orwellian Archives? Message-ID: <20011123171812.9292E13D127@main.nlenet.net> This is a MIME-encapsulated message. --------------265557734833714487252383 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit I use an editor called Joe that edit the .mbox file, then blast away the archives and rebuild them with $prefix/bin/arch . Takes a while for big archives, but it works. If you do delete messages (which is done by simply cutting the whole thing, headers and all), remember that when you rebuild the archives, messages subsequent to the one(s) you nuked will be renumbered. So if people reference messages in URLs, they may no longer be valid... Which might give credence to the method listed below of simply editing the body of the message. Bob >On Thu, Nov 22, 2001 at 07:23:52PM -0800, Roy Harvey wrote: >> Dear Barry -- >> Is there a way to remove individual messages from the archives? >> Thanks, >> Roy > >When I've had to do this, I just go edit that HTML file by hand and replace the >message text with "THIS MESSAGE HAS BEEN REMOVED". > >Had a couple of "for sale" posts that kept coming up in Google and I kept >getting email from people a year later (almost one a day!) about "do you >still have your X10 stuff for sale?" I finally went in and put this in >the message archive HTML: > >

    THIS ITEM IS NO LONGER FOR SALE. DONT EMAIL ME ABOUT IT

    > >Couple of days later, the emails stopped. 8-) > >Bill > >-- >Bill Bradford >mrbill@mrbill.net >Austin, TX > >_______________________________________________ >Mailman-Developers mailing list >Mailman-Developers@python.org >http://mail.python.org/mailman/listinfo/mailman-developers > --------------265557734833714487252383-- From barry@zope.com Sat Nov 24 00:00:16 2001 From: barry@zope.com (Barry A. Warsaw) Date: Fri, 23 Nov 2001 19:00:16 -0500 Subject: [Mailman-Developers] Postfix virtual domains (was Re: MTA interface for MM 2.1) References: <20011122055247.4B8AB13D127@main.nlenet.net> <15356.42032.51456.803284@anthem.wooz.org> Message-ID: <15358.58128.171496.58848@anthem.wooz.org> >>>>> "BAW" == Barry A Warsaw writes: BAW> I figured out how to support Postfix-style virtual domains[1] BAW> in a similar manner to the main aliases file, but I'm too BAW> tired to finish implementing it tonight. I'm about to check this stuff in, but it's a little kludgy. I may not entirely understand Postfix-style virtual domains, so let me ask this: Let's say I have two domains, er, dom1.com and dom2.com, and MX for both of these point to the same IP. It seems to me that I have to have at least one of them in the mydestinations variable in main.cf. So let's say I put dom1.com in mydestinations, and I want dom2.com to be a Postfix-virtual domain, so I set up a virtual_maps file with some common addresses like postmaster@dom2.com. To work with Mailman, I'll also add /usr/local/mailman/data/virtual-dom2.com virtual_maps. The .db file will contain the BerkeleyDB mappings equivalent to the plaintext file .../data/virtual-dom2.com containing stuff like: -------------------- snip snip -------------------- # This file is generated by Mailman, and is kept in sync with the binary hash # file virtual-mailman.db. YOU SHOULD NOT MANUALLY EDIT THIS FILE unless you # know what you're doing, and can keep the two files properly in sync. If you # screw it up, you're on your own. dom2.com IGNORE # For breaking bounce loops to the site list owners mailman-loop@dom2.com: mailman-loop # STANZA START: testlist # CREATED: Fri Nov 23 18:39:34 2001 testlist@dom2.com: testlist testlist-admin@dom2.com: testlist-admin testlist-bounces@dom2.com: testlist-bounces testlist-join@dom2.com: testlist-join testlist-leave@dom2.com: testlist-leave testlist-owner@dom2.com: testlist-owner testlist-request@dom2.com: testlist-request # STANZA END: testlist -------------------- snip snip -------------------- For convenience, I'll create a pair of these for every domain for which there are lists (i.e. for every unique mlist.host_name). Now the kludges: If dom1.com is set in mydestinations, then you /should not/ add data/virtual-dom1.com to virtual_maps, even though bin/genaliases will create a file for it. It's too complicated to prevent the writing of data/virtual-dom1.com, so just ignore it. It seems like there's no way to prevent sending a message to list-in-dom2@dom1.com working exactly the same as list-in-dom2@dom2.com. This is because list-in-dom2 must have an entry both in the aliases file and the virtual file (with the virtual file entries pointing to the aliases entries), and the alias entries always work for mydestination domains. Maybe other Postfix experts can help with this, but to me, it's not worth worrying about. Anyway, changes coming to Defaults.py.in, Mailman/MTA/Postfix.py and bin/genaliases. Comments are welcome! -Barry From liuk@publinet.it Sat Nov 24 17:20:19 2001 From: liuk@publinet.it (Luca Maranzano) Date: Sat, 24 Nov 2001 18:20:19 +0100 Subject: [Mailman-Developers] bin/update error from latest CVS Message-ID: <20011124182019.A9188@publinet.it> Hello all, I've tryed to install the latest CVS update of today, but when I do a 'make install' I get the following error: Traceback (most recent call last): File "bin/update", line 47, in ? from Mailman import MailList File "/home/mailman/Mailman/MailList.py", line 58, in ? from Mailman.SecurityManager import SecurityManager File "/home/mailman/Mailman/SecurityManager.py", line 62, in ? from Cookie import SimpleCookie as Cookie ImportError: cannot import name SimpleCookie make: *** [update] Error 1 Any idea? All the Web UI reports the same error! :-( --luca From liuk@publinet.it Sat Nov 24 17:51:18 2001 From: liuk@publinet.it (Luca Maranzano) Date: Sat, 24 Nov 2001 18:51:18 +0100 Subject: [Mailman-Developers] Bug in Mailman/SecurityManager.py about SimpleCookie? In-Reply-To: <20011124182019.A9188@publinet.it> References: <20011124182019.A9188@publinet.it> Message-ID: <20011124185118.A9357@publinet.it> It seems that the problem is in Mailman/SecurityManager.py, I've tryed to substitute this line from Cookie import SimpleCookie as Cookie with this import Cookie and now at least something is working again, but obviously all the Web authentication is broken. BTW, python 2.0.1. --luca On Sat, Nov 24, 2001 at 06:20:19PM +0100, Luca Maranzano wrote: > Hello all, > > I've tryed to install the latest CVS update of today, but when I do a > 'make install' I get the following error: > > Traceback (most recent call last): > File "bin/update", line 47, in ? > from Mailman import MailList > File "/home/mailman/Mailman/MailList.py", line 58, in ? > from Mailman.SecurityManager import SecurityManager > File "/home/mailman/Mailman/SecurityManager.py", line 62, in ? > from Cookie import SimpleCookie as Cookie > ImportError: cannot import name SimpleCookie > make: *** [update] Error 1 > > Any idea? All the Web UI reports the same error! :-( > > --luca > > > > _______________________________________________ > Mailman-Developers mailing list > Mailman-Developers@python.org > http://mail.python.org/mailman/listinfo/mailman-developers From barry@zope.com Sat Nov 24 18:51:48 2001 From: barry@zope.com (Barry A. Warsaw) Date: Sat, 24 Nov 2001 13:51:48 -0500 Subject: [Mailman-Developers] Bug in Mailman/SecurityManager.py about SimpleCookie? References: <20011124182019.A9188@publinet.it> <20011124185118.A9357@publinet.it> Message-ID: <15359.60484.146765.374994@anthem.wooz.org> Just remove $prefix/Mailman/Cookie.py and Cookie.pyc so you'll pick up the Python standard version. The bin/update script in cvs has been fixed to delete these files automatically on next upgrade. -Barry From jra@baylink.com Sun Nov 25 05:22:39 2001 From: jra@baylink.com (Jay R. Ashworth) Date: Sun, 25 Nov 2001 00:22:39 -0500 Subject: [Mailman-Developers] DNS and mailing lists -- an idea In-Reply-To: <20011122231354.GG2158@localhost.localdomain>; from Mikhail Zabaluev on Fri, Nov 23, 2001 at 02:13:54AM +0300 References: <20011121070733.GB20256@localhost.localdomain> <87bshwcvzu.fsf@nausicaa.interq.or.jp> <20011122231354.GG2158@localhost.localdomain> Message-ID: <20011125002239.24068@scfn.thpl.lib.fl.us> This may well be properly a proposal that is germane to *all* MTA's, not just those which support MLM's, but it will probably help the latter more, (and I hang out here :-), so I figured I'd bounce it off you guys first. I just got caught in a DNS crash. My personal domain is hidden primaried on a loop at the office of the guy I subcontract for (as is his domain, and a couple other things, but that's not material). He's closing office, and we're going back to working out of our houses, and the ISP apparently yanked the loop a week and a half early. Without notice. I didn't notice it until the public secondary for my domain timed the zone out and started returning SERVFAIL messages to people sending me mail... in consequence of which, I didn't get any mail for 3 and a half days. Luckily, it was a slow week, thanks to Thanksgiving (:-), so I only got 200 messages to sort through when the majority of it came in this afternoon -- but even that was only because I finally got ahold of the secondary DNS server op, and had him plug in the last copy of my master file (which he used to maintain -- luckily, he's a *good* op, he hadn't nuked it). The *reason* that that fix worked, and my having set up a new server and fixed my zone glue *didn't*, of course, is those ugly things called "caching servers", and that's why you're all listening to this (assuming, of course, that you still are... ;-) I've been told that it's good practice for heavily trafficked mail and web servers to have local (ie: on the same machine) caching DNS servers to speed up mailer DNS lookups, and therefore load the networks less. It occurred to me, riding home tonight from a concert and doing the After Action in my head from the whole fiasco, that there might be something productive in a script that could crawl the pending mail log looking for signs that some large batch of mail is pending for bad reasons. Caching accidents happen to everyone occasionally... and if one happes to your list with 4000 people on AOL, it could get ugly. If such a script could restart the associated name daemon, flushing it's cache, it would save a lot of delay and concern for various groups of people, I think. Assuming you could create a good heuristic for deciding when to dump the cache... which shouldn't be too hard, since a false dump isn't too painful. So, am I missing something obvious here? Will an MTA *without* a caching server actually be affected less (because it's making direct lookup calls to the zone servers in question)? It's an area, admittedly, in which I'm a touch weak... which is why I'm asking y'all. Cheers, -- jra -- Jay R. Ashworth jra@baylink.com Member of the Technical Staff Baylink RFC 2100 The Suncoast Freenet The Things I Think Tampa Bay, Florida http://baylink.pitas.com +1 727 804 5015 "If you don't have a dream; how're you gonna have a dream come true?" -- Captain Sensible, The Damned (from South Pacific's "Happy Talk") From claw@kanga.nu Sun Nov 25 08:04:34 2001 From: claw@kanga.nu (J C Lawrence) Date: Sun, 25 Nov 2001 00:04:34 -0800 Subject: [Mailman-Developers] DNS and mailing lists -- an idea In-Reply-To: Message from "Jay R. Ashworth" of "Sun, 25 Nov 2001 00:22:39 EST." <20011125002239.24068@scfn.thpl.lib.fl.us> References: <20011121070733.GB20256@localhost.localdomain> <87bshwcvzu.fsf@nausicaa.interq.or.jp> <20011122231354.GG2158@localhost.localdomain> <20011125002239.24068@scfn.thpl.lib.fl.us> Message-ID: <7774.1006675474@kanga.nu> On Sun, 25 Nov 2001 00:22:39 -0500 Jay R Ashworth wrote: > It occurred to me, riding home tonight from a concert and doing > the After Action in my head from the whole fiasco, that there > might be something productive in a script that could crawl the > pending mail log looking for signs that some large batch of mail > is pending for bad reasons. Which is a generically Good Thing. In larger installations I like to move spool entries for slow MX'es off the main production MTA and off to a box specifically configured for handling slow MXes (I do domain routing on the primary MX for the one's I've already identified). > Caching accidents happen to everyone occasionally... Frankly: Never seen one. Certainly not on a client end. Experiences like yours, sure, but that's a rather different deal. > and if one happens to your list with 4000 people on AOL, it could > get ugly. Quite. It would hurt most lists if the auto-unsubscribed AOL as bouncing due to, say, bad DNS (which could happen thru simple route flaps/'net connectivity problems on *your* end). > If such a script could restart the associated name daemon, > flushing it's cache, it would save a lot of delay and concern for > various groups of people, I think. Assuming you could create a > good heuristic for deciding when to dump the cache... which > shouldn't be too hard, since a false dump isn't too painful. Actually I use pdnsd which keeps a copy of its cache on disk, so restarts get the same cache as before... More simply, I don't see this buys you anything. If AOL is not reporting it won't be in your cache. Non-answers are not cached, only valid mappings are cached. > So, am I missing something obvious here? Will an MTA *without* a > caching server actually be affected less (because it's making > direct lookup calls to the zone servers in question)? It's an > area, admittedly, in which I'm a touch weak... which is why I'm > asking y'all. Typically the local nsd will do a certain amount of local cacheing (usually the last response or two) within the current application scope. Certain MTAs will (or can be configured to) cache the MX lookups in the spool files (a generally Bad Idea, but it can be a savings in heavily loaded cases).. -- J C Lawrence ---------(*) Satan, oscillate my metallic sonatas. claw@kanga.nu He lived as a devil, eh? http://www.kanga.nu/~claw/ Evil is a name of a foeman, as I live. From tollef@add.no Mon Nov 26 00:19:01 2001 From: tollef@add.no (Tollef Fog Heen) Date: 26 Nov 2001 01:19:01 +0100 Subject: [Mailman-Developers] Postfix virtual domains In-Reply-To: <15358.58128.171496.58848@anthem.wooz.org> References: <20011122055247.4B8AB13D127@main.nlenet.net> <15356.42032.51456.803284@anthem.wooz.org> <15358.58128.171496.58848@anthem.wooz.org> Message-ID: <874rnil6yy.fsf_-_@arabella.intern.opera.no> * (Barry A. Warsaw) | >>>>> "BAW" == Barry A Warsaw writes: | | BAW> I figured out how to support Postfix-style virtual domains[1] | BAW> in a similar manner to the main aliases file, but I'm too | BAW> tired to finish implementing it tonight. | | I'm about to check this stuff in, but it's a little kludgy. I may not | entirely understand Postfix-style virtual domains, so let me ask this: | | Let's say I have two domains, er, dom1.com and dom2.com, and MX for | both of these point to the same IP. It seems to me that I have to | have at least one of them in the mydestinations variable in main.cf. No, you don't have to have any of them in mydestination in main.cf: # The mydestination parameter specifies the list of domains that this # machine considers itself the final destination for. That does not # include domains that are hosted on this machine. Those domains are # specified elsewhere (see sample-virtual.cf, and sample-transport.cf). | It seems like there's no way to prevent sending a message to | list-in-dom2@dom1.com working exactly the same as | list-in-dom2@dom2.com. This is because list-in-dom2 must have an | entry both in the aliases file and the virtual file (with the virtual | file entries pointing to the aliases entries), and the alias entries | always work for mydestination domains. Maybe other Postfix experts | can help with this, but to me, it's not worth worrying about. I've usually hacked around this by doing something like -------------------- snip snip -------------------- dom2.com IGNORE # For breaking bounce loops to the site list owners mailman-loop@dom2.com: mailman-loop # STANZA START: testlist # CREATED: Fri Nov 23 18:39:34 2001 testlist@dom2.com: com-dom2-testlist testlist-admin@dom2.com: com-dom2-testlist-admin testlist-bounces@dom2.com: com-dom2-testlist-bounces testlist-join@dom2.com: com-dom2-testlist-join testlist-leave@dom2.com: com-dom2-testlist-leave testlist-owner@dom2.com: com-dom2-testlist-owner testlist-request@dom2.com: com-dom2-testlist-request # STANZA END: testlist -------------------- snip snip -------------------- So that all aliases in the dom2.com domain is on the form com-dom2-$ADDRESS. afaik (and see), this is one of the better ways of avoiding name clashes. -- Tollef Fog Heen Axiom #1: You Can't Win From jmeurer@gmx.de Mon Nov 26 15:59:56 2001 From: jmeurer@gmx.de (Jonas Meurer) Date: Mon, 26 Nov 2001 16:59:56 +0100 Subject: [Mailman-Developers] questions about gate_news Message-ID: <20011126165956.A3376@testsystem.server0.de> Hey ho, I'm new at this list, and I've a few questions about gate_news. It isn't working very well, so some posts to the group aren't fetched and some mails aren't posted. Can the problem be that the newsserver is connected only per ISDN and so the connection is very slow? So that sometimes the newsserver gives a timeout? Is this a known bug in gate_news, or is it a problem of my configuration? Im using mailman 2.0.7 self-compiled on a debian system. I've heard that gate_news is only a hack, so that it's not really good. Is this true? Is it better in later versions? And: Have all mailman-programs to be written in python? If not, I could try to rewrite gate_news in c? With a config-file where changes are written to? Out of it all, isn't c faster than python? Bye and thanks Jonas -- It's not that I'm afraid to die. I just don't want to be there when it happens. -- Wood Allen From lnxgeek@us.ibm.com Mon Nov 26 17:16:14 2001 From: lnxgeek@us.ibm.com (Scott Russell) Date: Mon, 26 Nov 2001 12:16:14 -0500 Subject: [Mailman-Developers] questions about gate_news In-Reply-To: <20011126165956.A3376@testsystem.server0.de>; from jmeurer@gmx.de on Mon, Nov 26, 2001 at 04:59:56PM +0100 References: <20011126165956.A3376@testsystem.server0.de> Message-ID: <20011126121614.A10744@us.ibm.com> On Mon, Nov 26, 2001 at 04:59:56PM +0100, Jonas Meurer wrote: > Hey ho, > I'm new at this list, and I've a few questions about gate_news. > It isn't working very well, so some posts to the group aren't fetched > and some mails aren't posted. Can the problem be that the newsserver is > connected only per ISDN and so the connection is very slow? So that sometimes > the newsserver gives a timeout? > Is this a known bug in gate_news, or is it a problem of my configuration? > Im using mailman 2.0.7 self-compiled on a debian system. > I've heard that gate_news is only a hack, so that it's not really good. > Is this true? Is it better in later versions? > And: Have all mailman-programs to be written in python? If not, I could > try to rewrite gate_news in c? With a config-file where changes are written > to? Out of it all, isn't c faster than python? I'm not sure if this is a true bug or not but I wanted to report that gate_news in 2.0.7 works for me. (tm) In my case the innd server is located on the same box as the smtp server so there is no delays in handling connections between mailman and the inn server. I'm not sure I see the point of using an external C program as part of the Mailman package. If you're going to do that why not just disable the Mailman gate_news functions and use one of the many available mail2news/news2mail gateway scripts out there? -- Regards, Scott Russell (lnxgeek@us.ibm.com) Linux Technology Center, System Admin, RHCE. T/L 441-9289 / External 919-543-9289 http://bzimage.raleigh.ibm.com/webcam From jmeurer@gmx.de Mon Nov 26 16:37:25 2001 From: jmeurer@gmx.de (Jonas Meurer) Date: Mon, 26 Nov 2001 17:37:25 +0100 Subject: [Mailman-Developers] questions about gate_news In-Reply-To: <20011126121614.A10744@us.ibm.com> References: <20011126165956.A3376@testsystem.server0.de> <20011126121614.A10744@us.ibm.com> Message-ID: <20011126173725.A3559@testsystem.server0.de> On Mon, Nov 26, 2001 at 12:16:14PM -0500, Scott Russell wrote: > I'm not sure if this is a true bug or not but I wanted to report that > gate_news in 2.0.7 works for me. (tm) In my case the innd server is located > on the same box as the smtp server so there is no delays in handling > connections between mailman and the inn server. I think the problem is that no newsserver really allows all connects allways. With this problem gate_news can't handle. > I'm not sure I see the point of using an external C program as part of the > Mailman package. If you're going to do that why not just disable the Mailman > gate_news functions and use one of the many available mail2news/news2mail > gateway scripts out there? Mh, but for the future it's easier and better when mailman has a real gate_news function, he? Like majordomo? So, I allways could try to write it in python, but normal I prefer c, because it's faster. ;) Bye Jonas -- Black holes were created when God divided by 0. From pchytil@ece.ogi.edu Mon Nov 26 18:00:54 2001 From: pchytil@ece.ogi.edu (Pavel Chytil) Date: Mon, 26 Nov 2001 10:00:54 -0800 Subject: [Mailman-Developers] Uncaught runner exception: 'generator' object has no attribute 'insert' Message-ID: <1006797654.3c028356cb072@asp.ogi.edu> Hello, I am new to mailman, so bear with me. I have downloaded mailman-2.0.7 which works fine, than I have tried mailman 2.1 (also from cvs), and getting error message below in error log whenever I try to send email to mailman-request@asp.ogi.edu with word help in Subject line (I have tried also word help in body of message without any luck). Nov 25 16:24:47 2001 (11789) Uncaught runner exception: 'generator' object has no attribute 'insert' Nov 25 16:24:47 2001 (11789) Traceback (most recent call last): File "/work/mailman/Mailman/Queue/Runner.py", line 104, in __oneloop self.__onefile(msg, msgdata) File "/work/mailman/Mailman/Queue/Runner.py", line 152, in __onefile keepqueued = self._dispose(mlist, msg, msgdata) File "/work/mailman/Mailman/Queue/CommandRunner.py", line 61, in _dispose mlist.ParseMailCommands(msg, msgdata) File "/work/mailman/Mailman/MailCommandHandler.py", line 198, in ParseMailCommands lines.insert(0, SPACE.join(subjcmd)) AttributeError: 'generator' object has no attribute 'insert' What am I doing wrong? Thanks, Pavel From pchytil@ece.ogi.edu Mon Nov 26 19:07:47 2001 From: pchytil@ece.ogi.edu (Pavel Chytil) Date: Mon, 26 Nov 2001 11:07:47 -0800 Subject: [Mailman-Developers] Uncaught runner exception: 'generator' object has no attribute 'insert' In-Reply-To: <3C028C15.F23C61C1@utopia.west.sun.com> References: <1006797654.3c028356cb072@asp.ogi.edu> <3C028C15.F23C61C1@utopia.west.sun.com> Message-ID: <1006801667.3c0293038f2f2@test> Sure I did. asp pts/25% python ~ Python 2.2b2 (#1, Nov 19 2001, 20:23:17) [GCC 2.96 20000731 (Red Hat Linux 7.1 2.96-98)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import email >>> email.__version__ '1.0' >>> Pavel Cituji z emailu od Dan Mick : > With 2.1 you have to install the 'email' package, which is included, as the > instructions with 2.1 say to do. Did you? > > Pavel Chytil wrote: > > > > Hello, > > > > I am new to mailman, so bear with me. I have downloaded mailman-2.0.7 > which > > works fine, than I have tried mailman 2.1 (also from cvs), and getting > error > > message below in error log whenever I try to send email to > > mailman-request@asp.ogi.edu with word help in Subject line (I have tried > also > > word help in body of message without any luck). > > > > Nov 25 16:24:47 2001 (11789) Uncaught runner exception: 'generator' object > has > > no attribute 'insert' > > Nov 25 16:24:47 2001 (11789) Traceback (most recent call last): > > File "/work/mailman/Mailman/Queue/Runner.py", line 104, in __oneloop > > self.__onefile(msg, msgdata) > > File "/work/mailman/Mailman/Queue/Runner.py", line 152, in __onefile > > keepqueued = self._dispose(mlist, msg, msgdata) > > File "/work/mailman/Mailman/Queue/CommandRunner.py", line 61, in > _dispose > > mlist.ParseMailCommands(msg, msgdata) > > File "/work/mailman/Mailman/MailCommandHandler.py", line 198, in > > ParseMailCommands > > lines.insert(0, SPACE.join(subjcmd)) > > AttributeError: 'generator' object has no attribute 'insert' > > > > What am I doing wrong? > > > > Thanks, > > Pavel > > > > _______________________________________________ > > Mailman-Developers mailing list > > Mailman-Developers@python.org > > http://mail.python.org/mailman/listinfo/mailman-developers > From Dan Mick Mon Nov 26 23:38:27 2001 From: Dan Mick (Dan Mick) Date: Mon, 26 Nov 2001 15:38:27 -0800 (PST) Subject: [Mailman-Developers] Uncaught runner exception: 'generator' object has no attribute 'insert' Message-ID: <200111262338.PAA02743@utopia.West.Sun.COM> The version that comes with mailman is 0.96; maybe 1.0 doesn't yet work with Mailman?... > Sure I did. > > asp pts/25% > python ~ > Python 2.2b2 (#1, Nov 19 2001, 20:23:17) > [GCC 2.96 20000731 (Red Hat Linux 7.1 2.96-98)] on linux2 > Type "help", "copyright", "credits" or "license" for more information. > >>> import email > >>> email.__version__ > '1.0' > >>> > > Pavel > > > Cituji z emailu od Dan Mick : > > > With 2.1 you have to install the 'email' package, which is included, as the > > instructions with 2.1 say to do. Did you? > > > > Pavel Chytil wrote: > > > > > > Hello, > > > > > > I am new to mailman, so bear with me. I have downloaded mailman-2.0.7 > > which > > > works fine, than I have tried mailman 2.1 (also from cvs), and getting > > error > > > message below in error log whenever I try to send email to > > > mailman-request@asp.ogi.edu with word help in Subject line (I have tried > > also > > > word help in body of message without any luck). > > > > > > Nov 25 16:24:47 2001 (11789) Uncaught runner exception: 'generator' object > > has > > > no attribute 'insert' > > > Nov 25 16:24:47 2001 (11789) Traceback (most recent call last): > > > File "/work/mailman/Mailman/Queue/Runner.py", line 104, in __oneloop > > > self.__onefile(msg, msgdata) > > > File "/work/mailman/Mailman/Queue/Runner.py", line 152, in __onefile > > > keepqueued = self._dispose(mlist, msg, msgdata) > > > File "/work/mailman/Mailman/Queue/CommandRunner.py", line 61, in > > _dispose > > > mlist.ParseMailCommands(msg, msgdata) > > > File "/work/mailman/Mailman/MailCommandHandler.py", line 198, in > > > ParseMailCommands > > > lines.insert(0, SPACE.join(subjcmd)) > > > AttributeError: 'generator' object has no attribute 'insert' > > > > > > What am I doing wrong? > > > > > > Thanks, > > > Pavel > > > > > > _______________________________________________ > > > Mailman-Developers mailing list > > > Mailman-Developers@python.org > > > http://mail.python.org/mailman/listinfo/mailman-developers > > > > > > _______________________________________________ > Mailman-Developers mailing list > Mailman-Developers@python.org > http://mail.python.org/mailman/listinfo/mailman-developers From bxb1280@yahoo.com Tue Nov 27 00:39:16 2001 From: bxb1280@yahoo.com (bxb1280) Date: Tue, 27 Nov 2001 8:39:16 +0800 Subject: [Mailman-Developers] hi Message-ID: vtkusers=A3=AChi=A3=A1 Who can tell me how to download the CTN Library? (I want to= read dicom file) thank you. bxb1280 bxb1280@yahoo.com _________________________________________________________ Do You Yahoo!? Get your free @yahoo.com address at http://mail.yahoo.com From bxb1280@yahoo.com Tue Nov 27 00:40:09 2001 From: bxb1280@yahoo.com (bxb1280) Date: Tue, 27 Nov 2001 8:40:9 +0800 Subject: [Mailman-Developers] hi Message-ID: vtkusers=A3=AChi=A3=A1 Who can tell me how to download the CTN Library? (I want to= read dicom file) thank you. bxb1280 bxb1280@yahoo.com _________________________________________________________ Do You Yahoo!? Get your free @yahoo.com address at http://mail.yahoo.com From paja@asp.ogi.edu Tue Nov 27 00:46:24 2001 From: paja@asp.ogi.edu (Pavel Chytil) Date: Mon, 26 Nov 2001 16:46:24 -0800 Subject: [Mailman-Developers] Uncaught runner exception: 'generator' object has no attribute 'insert' In-Reply-To: <200111262338.PAA02743@utopia.West.Sun.COM> References: <200111262338.PAA02743@utopia.West.Sun.COM> Message-ID: <1006821984.3c02e2602d872@test> Well I have reinstall mailman with email 0.96 in my python and outcome is the same: Nov 26 16:42:33 2001 (4495) Uncaught runner exception: 'generator' object has no attribute 'insert' Nov 26 16:42:33 2001 (4495) Traceback (most recent call last): File "/work/mailman/Mailman/Queue/Runner.py", line 104, in __oneloop self.__onefile(msg, msgdata) File "/work/mailman/Mailman/Queue/Runner.py", line 152, in __onefile keepqueued = self._dispose(mlist, msg, msgdata) File "/work/mailman/Mailman/Queue/CommandRunner.py", line 61, in _dispose mlist.ParseMailCommands(msg, msgdata) File "/work/mailman/Mailman/MailCommandHandler.py", line 198, in ParseMailCommands lines.insert(0, SPACE.join(subjcmd)) AttributeError: 'generator' object has no attribute 'insert' Pavel Cituji z emailu od Dan Mick : > The version that comes with mailman is 0.96; maybe 1.0 doesn't > yet work with Mailman?... > > > Sure I did. > > > > asp pts/25% > > python > > ~ > > Python 2.2b2 (#1, Nov 19 2001, 20:23:17) > > [GCC 2.96 20000731 (Red Hat Linux 7.1 2.96-98)] on linux2 > > Type "help", "copyright", "credits" or "license" for more information. > > >>> import email > > >>> email.__version__ > > '1.0' > > >>> > > > > Pavel > > > > > > Cituji z emailu od Dan Mick : > > > > > With 2.1 you have to install the 'email' package, which is included, as > the > > > instructions with 2.1 say to do. Did you? > > > > > > Pavel Chytil wrote: > > > > > > > > Hello, > > > > > > > > I am new to mailman, so bear with me. I have downloaded mailman-2.0.7 > > > which > > > > works fine, than I have tried mailman 2.1 (also from cvs), and > getting > > > error > > > > message below in error log whenever I try to send email to > > > > mailman-request@asp.ogi.edu with word help in Subject line (I have > tried > > > also > > > > word help in body of message without any luck). > > > > > > > > Nov 25 16:24:47 2001 (11789) Uncaught runner exception: 'generator' > object > > > has > > > > no attribute 'insert' > > > > Nov 25 16:24:47 2001 (11789) Traceback (most recent call last): > > > > File "/work/mailman/Mailman/Queue/Runner.py", line 104, in > __oneloop > > > > self.__onefile(msg, msgdata) > > > > File "/work/mailman/Mailman/Queue/Runner.py", line 152, in > __onefile > > > > keepqueued = self._dispose(mlist, msg, msgdata) > > > > File "/work/mailman/Mailman/Queue/CommandRunner.py", line 61, in > > > _dispose > > > > mlist.ParseMailCommands(msg, msgdata) > > > > File "/work/mailman/Mailman/MailCommandHandler.py", line 198, in > > > > ParseMailCommands > > > > lines.insert(0, SPACE.join(subjcmd)) > > > > AttributeError: 'generator' object has no attribute 'insert' > > > > > > > > What am I doing wrong? > > > > > > > > Thanks, > > > > Pavel > > > > > > > > _______________________________________________ > > > > Mailman-Developers mailing list > > > > Mailman-Developers@python.org > > > > http://mail.python.org/mailman/listinfo/mailman-developers > > > > > > > > > > > _______________________________________________ > > Mailman-Developers mailing list > > Mailman-Developers@python.org > > http://mail.python.org/mailman/listinfo/mailman-developers > From pchytil@ece.ogi.edu Tue Nov 27 00:47:10 2001 From: pchytil@ece.ogi.edu (Pavel Chytil) Date: Mon, 26 Nov 2001 16:47:10 -0800 Subject: [Mailman-Developers] Uncaught runner exception: 'generator' object has no attribute 'insert' Message-ID: <1006822030.3c02e28e2d872@test> Well I have reinstall mailman with email 0.96 in my python and outcome is= the same: Nov 26 16:42:33 2001 (4495) Uncaught runner exception: 'generator' object= has no attribute 'insert' Nov 26 16:42:33 2001 (4495) Traceback (most recent call last): File "/work/mailman/Mailman/Queue/Runner.py", line 104, in __oneloop self.__onefile(msg, msgdata) File "/work/mailman/Mailman/Queue/Runner.py", line 152, in __onefile keepqueued =3D self._dispose(mlist, msg, msgdata) File "/work/mailman/Mailman/Queue/CommandRunner.py", line 61, in _dispo= se mlist.ParseMailCommands(msg, msgdata) File "/work/mailman/Mailman/MailCommandHandler.py", line 198, in ParseMailCommands lines.insert(0, SPACE.join(subjcmd)) AttributeError: 'generator' object has no attribute 'insert' Pavel Cituji z emailu od Dan Mick : > The version that comes with mailman is 0.96; maybe 1.0 doesn't > yet work with Mailman?... >=20 > > Sure I did. > >=20 > > asp pts/25% > > python = =20 > =20 > ~ > > Python 2.2b2 (#1, Nov 19 2001, 20:23:17) > > [GCC 2.96 20000731 (Red Hat Linux 7.1 2.96-98)] on linux2 > > Type "help", "copyright", "credits" or "license" for more information. > > >>> import email > > >>> email.__version__ > > '1.0' > > >>> > >=20 > > Pavel > >=20 > >=20 > > Cituji z emailu od Dan Mick : > >=20 > > > With 2.1 you have to install the 'email' package, which is included= , as > the > > > instructions with 2.1 say to do. Did you? > > >=20 > > > Pavel Chytil wrote: > > > >=20 > > > > Hello, > > > >=20 > > > > I am new to mailman, so bear with me. I have downloaded mailman-2= .0.7 > > > which > > > > works fine, than I have tried mailman 2.1 (also from cvs), and > getting > > > error > > > > message below in error log whenever I try to send email to > > > > mailman-request@asp.ogi.edu with word help in Subject line (I hav= e > tried > > > also > > > > word help in body of message without any luck). > > > >=20 > > > > Nov 25 16:24:47 2001 (11789) Uncaught runner exception: 'generato= r' > object > > > has > > > > no attribute 'insert' > > > > Nov 25 16:24:47 2001 (11789) Traceback (most recent call last): > > > > File "/work/mailman/Mailman/Queue/Runner.py", line 104, in > __oneloop > > > > self.__onefile(msg, msgdata) > > > > File "/work/mailman/Mailman/Queue/Runner.py", line 152, in > __onefile > > > > keepqueued =3D self._dispose(mlist, msg, msgdata) > > > > File "/work/mailman/Mailman/Queue/CommandRunner.py", line 61, i= n > > > _dispose > > > > mlist.ParseMailCommands(msg, msgdata) > > > > File "/work/mailman/Mailman/MailCommandHandler.py", line 198, i= n > > > > ParseMailCommands > > > > lines.insert(0, SPACE.join(subjcmd)) > > > > AttributeError: 'generator' object has no attribute 'insert' > > > >=20 > > > > What am I doing wrong? > > > >=20 > > > > Thanks, > > > > Pavel > > > >=20 > > > > _______________________________________________ > > > > Mailman-Developers mailing list > > > > Mailman-Developers@python.org > > > > http://mail.python.org/mailman/listinfo/mailman-developers > > >=20 > >=20 > >=20 > >=20 > > _______________________________________________ > > Mailman-Developers mailing list > > Mailman-Developers@python.org > > http://mail.python.org/mailman/listinfo/mailman-developers >=20 ----- Konec p=F8eposlan=E9 zpr=E1vy ----- From Dan Mick Tue Nov 27 01:01:49 2001 From: Dan Mick (Dan Mick) Date: Mon, 26 Nov 2001 17:01:49 -0800 (PST) Subject: [Mailman-Developers] Uncaught runner exception: 'generator' object has no attribute 'insert' Message-ID: <200111270102.RAA10400@utopia.West.Sun.COM> Dunno; lines is a result of email.Iterators.body_line_iterator, which looks to me like it should be returning an array of strings, which certainly *does* have an insert() command... so I don't know what's going wrong. > Well I have reinstall mailman with email 0.96 in my python and outcome is the > same: > > Nov 26 16:42:33 2001 (4495) Uncaught runner exception: 'generator' object has no > attribute 'insert' > Nov 26 16:42:33 2001 (4495) Traceback (most recent call last): > File "/work/mailman/Mailman/Queue/Runner.py", line 104, in __oneloop > self.__onefile(msg, msgdata) > File "/work/mailman/Mailman/Queue/Runner.py", line 152, in __onefile > keepqueued = self._dispose(mlist, msg, msgdata) > File "/work/mailman/Mailman/Queue/CommandRunner.py", line 61, in _dispose > mlist.ParseMailCommands(msg, msgdata) > File "/work/mailman/Mailman/MailCommandHandler.py", line 198, in > ParseMailCommands > lines.insert(0, SPACE.join(subjcmd)) > AttributeError: 'generator' object has no attribute 'insert' > > Pavel > > Cituji z emailu od Dan Mick : > > > The version that comes with mailman is 0.96; maybe 1.0 doesn't > > yet work with Mailman?... > > > > > Sure I did. > > > > > > asp pts/25% > > > python > > > > ~ > > > Python 2.2b2 (#1, Nov 19 2001, 20:23:17) > > > [GCC 2.96 20000731 (Red Hat Linux 7.1 2.96-98)] on linux2 > > > Type "help", "copyright", "credits" or "license" for more information. > > > >>> import email > > > >>> email.__version__ > > > '1.0' > > > >>> > > > > > > Pavel > > > > > > > > > Cituji z emailu od Dan Mick : > > > > > > > With 2.1 you have to install the 'email' package, which is included, as > > the > > > > instructions with 2.1 say to do. Did you? > > > > > > > > Pavel Chytil wrote: > > > > > > > > > > Hello, > > > > > > > > > > I am new to mailman, so bear with me. I have downloaded mailman-2.0.7 > > > > which > > > > > works fine, than I have tried mailman 2.1 (also from cvs), and > > getting > > > > error > > > > > message below in error log whenever I try to send email to > > > > > mailman-request@asp.ogi.edu with word help in Subject line (I have > > tried > > > > also > > > > > word help in body of message without any luck). > > > > > > > > > > Nov 25 16:24:47 2001 (11789) Uncaught runner exception: 'generator' > > object > > > > has > > > > > no attribute 'insert' > > > > > Nov 25 16:24:47 2001 (11789) Traceback (most recent call last): > > > > > File "/work/mailman/Mailman/Queue/Runner.py", line 104, in > > __oneloop > > > > > self.__onefile(msg, msgdata) > > > > > File "/work/mailman/Mailman/Queue/Runner.py", line 152, in > > __onefile > > > > > keepqueued = self._dispose(mlist, msg, msgdata) > > > > > File "/work/mailman/Mailman/Queue/CommandRunner.py", line 61, in > > > > _dispose > > > > > mlist.ParseMailCommands(msg, msgdata) > > > > > File "/work/mailman/Mailman/MailCommandHandler.py", line 198, in > > > > > ParseMailCommands > > > > > lines.insert(0, SPACE.join(subjcmd)) > > > > > AttributeError: 'generator' object has no attribute 'insert' > > > > > > > > > > What am I doing wrong? > > > > > > > > > > Thanks, > > > > > Pavel > > > > > > > > > > _______________________________________________ > > > > > Mailman-Developers mailing list > > > > > Mailman-Developers@python.org > > > > > http://mail.python.org/mailman/listinfo/mailman-developers > > > > > > > > > > > > > > > > _______________________________________________ > > > Mailman-Developers mailing list > > > Mailman-Developers@python.org > > > http://mail.python.org/mailman/listinfo/mailman-developers > > > > > > _______________________________________________ > Mailman-Developers mailing list > Mailman-Developers@python.org > http://mail.python.org/mailman/listinfo/mailman-developers From bob@nleaudio.com Tue Nov 27 03:23:02 2001 From: bob@nleaudio.com (Bob Puff@NLE) Date: Mon, 26 Nov 2001 22:23:02 -0500 Subject: [Mailman-Developers] Uncaught runner exception: 'generator' object has no attribute 'insert' References: <1006797654.3c028356cb072@asp.ogi.edu> <3C028C15.F23C61C1@utopia.west.sun.com> <1006801667.3c0293038f2f2@test> Message-ID: <3C030716.FC76EFAE@nleaudio.com> Dan, He is using Python 2.2, which comes with email - no need to install the package. The problem lies elsewhere. Bob From barry@zope.com Tue Nov 27 04:03:24 2001 From: barry@zope.com (Barry A. Warsaw) Date: Mon, 26 Nov 2001 23:03:24 -0500 Subject: [Mailman-Developers] Postfix virtual domains References: <20011122055247.4B8AB13D127@main.nlenet.net> <15356.42032.51456.803284@anthem.wooz.org> <15358.58128.171496.58848@anthem.wooz.org> <874rnil6yy.fsf_-_@arabella.intern.opera.no> Message-ID: <15363.4236.41624.121681@anthem.wooz.org> Last night I checked in some stuff to hopefully improve the virtual domain support for Postfix. It'd be great if some of you could give it a looksee. FWIW, I think I've solved the dom1, dom2 namespace collision problem, by as suggested, omitting both dom1 and dom2 from $mydestination. However, I still have host.dom1.ain in $mydestination (i.e. $myhostname) because otherwise, there's no way to receive any mail. AFAICT, there's no way to avoid having all the dom1.ain and dom2.ain names show up in host.dom1.ain. Oh well, that doesn't bother me. -Barry From barry@zope.com Tue Nov 27 04:18:55 2001 From: barry@zope.com (Barry A. Warsaw) Date: Mon, 26 Nov 2001 23:18:55 -0500 Subject: [Mailman-Developers] Uncaught runner exception: 'generator' object has no attribute 'insert' References: <1006797654.3c028356cb072@asp.ogi.edu> <3C028C15.F23C61C1@utopia.west.sun.com> <1006801667.3c0293038f2f2@test> <3C030716.FC76EFAE@nleaudio.com> Message-ID: <15363.5167.197650.184285@anthem.wooz.org> >>>>> "B" == Bob writes: B> He is using Python 2.2, which comes with email - no need to B> install the package. The problem lies elsewhere. Yes, the problem is that in Python 2.2, body_line_generator() returns a... generator! not a list. This is one corner where email 1.0 and email 0.96 are not completely compatible, and it's not really feasible to make them so here. The following patch should fix this particular problem. Let me know and I'll commit it to cvs. I haven't extensively tested Mailman with 2.2, but I will have to do this before Python 2.2 final is released. -Barry From barry@zope.com Tue Nov 27 04:19:28 2001 From: barry@zope.com (Barry A. Warsaw) Date: Mon, 26 Nov 2001 23:19:28 -0500 Subject: [Mailman-Developers] Uncaught runner exception: 'generator' object has no attribute 'insert' References: <1006797654.3c028356cb072@asp.ogi.edu> <3C028C15.F23C61C1@utopia.west.sun.com> <1006801667.3c0293038f2f2@test> <3C030716.FC76EFAE@nleaudio.com> Message-ID: <15363.5200.721333.636251@anthem.wooz.org> Oops, forgot the patch! -Barry Index: MailCommandHandler.py =================================================================== RCS file: /cvsroot/mailman/mailman/Mailman/MailCommandHandler.py,v retrieving revision 2.24 diff -u -r2.24 MailCommandHandler.py --- MailCommandHandler.py 2001/11/21 17:17:35 2.24 +++ MailCommandHandler.py 2001/11/27 04:19:23 @@ -181,7 +181,7 @@ if mo: subject = mo.group('cmd') - lines = email.Iterators.body_line_iterator(msg) + lines = email.Iterators.body_line_iterator(msg)[:] # Find out if the subject line has a command on it subjcmd = [] From paja@asp.ogi.edu Tue Nov 27 06:34:02 2001 From: paja@asp.ogi.edu (Pavel Chytil) Date: Mon, 26 Nov 2001 22:34:02 -0800 Subject: [Mailman-Developers] Uncaught runner exception: 'generator' object has no attribute 'insert' In-Reply-To: <15363.5200.721333.636251@anthem.wooz.org> References: <1006797654.3c028356cb072@asp.ogi.edu> <3C028C15.F23C61C1@utopia.west.sun.com> <1006801667.3c0293038f2f2@test> <3C030716.FC76EFAE@nleaudio.com> <15363.5200.721333.636251@anthem.wooz.org> Message-ID: <1006842842.3c0333da54973@test> Barry, well probably did fix what it suppose to, but new pop up as well: Nov 26 22:23:38 2001 (11876) Uncaught runner exception: unsubscriptable object Nov 26 22:23:38 2001 (11876) Traceback (most recent call last): File "/work/mailman/Mailman/Queue/Runner.py", line 104, in __oneloop self.__onefile(msg, msgdata) File "/work/mailman/Mailman/Queue/Runner.py", line 152, in __onefile keepqueued = self._dispose(mlist, msg, msgdata) File "/work/mailman/Mailman/Queue/CommandRunner.py", line 61, in _dispose mlist.ParseMailCommands(msg, msgdata) File "/work/mailman/Mailman/MailCommandHandler.py", line 184, in ParseMailCommands lines = email.Iterators.body_line_iterator(msg)[:] TypeError: unsubscriptable object this happened after I have clearly install python2.2b and mailman with your patch (from cvs). I have followed instruction completely, created new list mailman, received email about new list has been created. So I tried to send email to mailman-request@asp.ogi.edu with "help" subject line (tried also body of message with same result) and it created the error message above. Thanks, Pavel Cituji z emailu od "Barry A. Warsaw" : > > Oops, forgot the patch! > > -Barry > > Index: MailCommandHandler.py > =================================================================== > RCS file: /cvsroot/mailman/mailman/Mailman/MailCommandHandler.py,v > retrieving revision 2.24 > diff -u -r2.24 MailCommandHandler.py > --- MailCommandHandler.py 2001/11/21 17:17:35 2.24 > +++ MailCommandHandler.py 2001/11/27 04:19:23 > @@ -181,7 +181,7 @@ > if mo: > subject = mo.group('cmd') > > - lines = email.Iterators.body_line_iterator(msg) > + lines = email.Iterators.body_line_iterator(msg)[:] > > # Find out if the subject line has a command on it > subjcmd = [] > From barry@zope.com Tue Nov 27 07:20:03 2001 From: barry@zope.com (Barry A. Warsaw) Date: Tue, 27 Nov 2001 02:20:03 -0500 Subject: [Mailman-Developers] Uncaught runner exception: 'generator' object has no attribute 'insert' References: <1006797654.3c028356cb072@asp.ogi.edu> <3C028C15.F23C61C1@utopia.west.sun.com> <1006801667.3c0293038f2f2@test> <3C030716.FC76EFAE@nleaudio.com> <15363.5200.721333.636251@anthem.wooz.org> <1006842842.3c0333da54973@test> Message-ID: <15363.16035.151196.942642@anthem.wooz.org> Oops. Okay, let's try this one! -Barry Index: MailCommandHandler.py =================================================================== RCS file: /cvsroot/mailman/mailman/Mailman/MailCommandHandler.py,v retrieving revision 2.25 diff -u -r2.25 MailCommandHandler.py --- MailCommandHandler.py 2001/11/27 04:26:25 2.25 +++ MailCommandHandler.py 2001/11/27 07:20:00 @@ -181,7 +181,12 @@ if mo: subject = mo.group('cmd') - lines = email.Iterators.body_line_iterator(msg)[:] + # We must have a real list because of the way we insert an element and + # iterate over it. In email 0.x (pre-Python 2.2) body_line_iterator() + # returns a real list, but in email 1.x (Python 2.2), it returns a + # generator. This is the only way to coerce it to a concrete list + # object in both cases. + lines = list(email.Iterators.body_line_iterator(msg)) # Find out if the subject line has a command on it subjcmd = [] From paja@asp.ogi.edu Tue Nov 27 07:28:31 2001 From: paja@asp.ogi.edu (Pavel Chytil) Date: Mon, 26 Nov 2001 23:28:31 -0800 Subject: [Mailman-Developers] Uncaught runner exception: 'generator' object has no attribute 'insert' In-Reply-To: <15363.16035.151196.942642@anthem.wooz.org> References: <1006797654.3c028356cb072@asp.ogi.edu> <3C028C15.F23C61C1@utopia.west.sun.com> <1006801667.3c0293038f2f2@test> <3C030716.FC76EFAE@nleaudio.com> <15363.5200.721333.636251@anthem.wooz.org> <1006842842.3c0333da54973@test> <15363.16035.151196.942642@anthem.wooz.org> Message-ID: <1006846111.3c03409fa0470@test> Barry, still not there, same approache like last try: Nov 26 23:25:30 2001 (15396) Uncaught runner exception: unsubscriptable object Nov 26 23:25:30 2001 (15396) Traceback (most recent call last): File "/work/mailman/Mailman/Queue/Runner.py", line 104, in __oneloop self.__onefile(msg, msgdata) File "/work/mailman/Mailman/Queue/Runner.py", line 152, in __onefile keepqueued = self._dispose(mlist, msg, msgdata) File "/work/mailman/Mailman/Queue/CommandRunner.py", line 61, in _dispose mlist.ParseMailCommands(msg, msgdata) File "/work/mailman/Mailman/MailCommandHandler.py", line 184, in ParseMailCommands lines = email.Iterators.body_line_iterator(msg)[:] TypeError: unsubscriptable object Thanks, Pavel Cituji z emailu od "Barry A. Warsaw" : > > Oops. Okay, let's try this one! > > -Barry > > Index: MailCommandHandler.py > =================================================================== > RCS file: /cvsroot/mailman/mailman/Mailman/MailCommandHandler.py,v > retrieving revision 2.25 > diff -u -r2.25 MailCommandHandler.py > --- MailCommandHandler.py 2001/11/27 04:26:25 2.25 > +++ MailCommandHandler.py 2001/11/27 07:20:00 > @@ -181,7 +181,12 @@ > if mo: > subject = mo.group('cmd') > > - lines = email.Iterators.body_line_iterator(msg)[:] > + # We must have a real list because of the way we insert an element > and > + # iterate over it. In email 0.x (pre-Python 2.2) > body_line_iterator() > + # returns a real list, but in email 1.x (Python 2.2), it returns a > + # generator. This is the only way to coerce it to a concrete list > + # object in both cases. > + lines = list(email.Iterators.body_line_iterator(msg)) > > # Find out if the subject line has a command on it > subjcmd = [] > > From barry@zope.com Tue Nov 27 07:38:21 2001 From: barry@zope.com (Barry A. Warsaw) Date: Tue, 27 Nov 2001 02:38:21 -0500 Subject: [Mailman-Developers] Uncaught runner exception: 'generator' object has no attribute 'insert' References: <1006797654.3c028356cb072@asp.ogi.edu> <3C028C15.F23C61C1@utopia.west.sun.com> <1006801667.3c0293038f2f2@test> <3C030716.FC76EFAE@nleaudio.com> <15363.5200.721333.636251@anthem.wooz.org> <1006842842.3c0333da54973@test> <15363.16035.151196.942642@anthem.wooz.org> <1006846111.3c03409fa0470@test> Message-ID: <15363.17133.800672.843252@anthem.wooz.org> >>>>> "PC" == Pavel Chytil writes: | lines = email.Iterators.body_line_iterator(msg)[:] Sorry, change this line to lines = list(email.Iterators.body_line_iterator(msg)) (You probably need to back out the previous patch first, before applying the second one I sent.) -Barry From pchytil@ece.ogi.edu Tue Nov 27 07:46:03 2001 From: pchytil@ece.ogi.edu (Pavel Chytil) Date: Mon, 26 Nov 2001 23:46:03 -0800 Subject: [Mailman-Developers] Uncaught runner exception: 'generator' object has no attribute 'insert' In-Reply-To: <15363.17133.800672.843252@anthem.wooz.org> References: <1006797654.3c028356cb072@asp.ogi.edu> <3C028C15.F23C61C1@utopia.west.sun.com> <1006801667.3c0293038f2f2@test> <3C030716.FC76EFAE@nleaudio.com> <15363.5200.721333.636251@anthem.wooz.org> <1006842842.3c0333da54973@test> <15363.16035.151196.942642@anthem.wooz.org> <1006846111.3c03409fa0470@test> <15363.17133.800672.843252@anthem.wooz.org> Message-ID: <1006847163.3c0344bbc003e@test> Man you rule!!! At this point seems to be working fine. I will do more testing and let you know if any troubles will pop up. Thanks a lot, Pavel Cituji z emailu od "Barry A. Warsaw" : > > >>>>> "PC" == Pavel Chytil writes: > > | lines = email.Iterators.body_line_iterator(msg)[:] > > Sorry, change this line to > > lines = list(email.Iterators.body_line_iterator(msg)) > > (You probably need to back out the previous patch first, before > applying the second one I sent.) > > -Barry > From barry@zope.com Tue Nov 27 08:12:13 2001 From: barry@zope.com (Barry A. Warsaw) Date: Tue, 27 Nov 2001 03:12:13 -0500 Subject: [Mailman-Developers] Uncaught runner exception: 'generator' object has no attribute 'insert' References: <1006797654.3c028356cb072@asp.ogi.edu> <3C028C15.F23C61C1@utopia.west.sun.com> <1006801667.3c0293038f2f2@test> <3C030716.FC76EFAE@nleaudio.com> <15363.5200.721333.636251@anthem.wooz.org> <1006842842.3c0333da54973@test> <15363.16035.151196.942642@anthem.wooz.org> <1006846111.3c03409fa0470@test> <15363.17133.800672.843252@anthem.wooz.org> <1006847163.3c0344bbc003e@test> Message-ID: <15363.19165.428335.123324@anthem.wooz.org> >>>>> "PC" == Pavel Chytil writes: PC> Man you rule!!! :) PC> At this point seems to be working fine. I will do more testing PC> and let you know if any troubles will pop up. PC> Thanks a lot, No problem! Thanks for stress testing it on Python 2.2. -Barry From gward@mems-exchange.org Tue Nov 27 14:54:16 2001 From: gward@mems-exchange.org (Greg Ward) Date: Tue, 27 Nov 2001 09:54:16 -0500 Subject: [Mailman-Developers] Re: [Mailman-Users] Subscriber names In-Reply-To: References: Message-ID: <20011127095416.B19793@mems-exchange.org> On 24 November 2001, marina said: > Does anybody know whether there's a way for Mailman to ask (and > remember) subscriber names, as well as their email addresses? I've just added a new entry to the FAQ Wizard: 3.2. How can I track subscriber's real names? With Mailman 2.0.x, you can't: Mailman only remembers each subscriber's email address, password, and list options. (Or visit http://www.python.org/cgi-bin/faqw-mm.py?req=show&file=faq03.002.htp) If this is wrong or incomplete, please visit the FAQ Wizard and update it yourself. In particular, can Mailman 2.1 track real names? Greg -- Greg Ward - software developer gward@mems-exchange.org MEMS Exchange http://www.mems-exchange.org From moseley@hank.org Tue Nov 27 15:13:12 2001 From: moseley@hank.org (Bill Moseley) Date: Tue, 27 Nov 2001 07:13:12 -0800 Subject: [Mailman-Developers] Re: [Mailman-Users] Subscriber names In-Reply-To: <20011127095416.B19793@mems-exchange.org> References: Message-ID: <3.0.3.32.20011127071312.006be34c@pop3.hank.org> At 09:54 AM 11/27/2001 -0500, Greg Ward wrote: > >I've just added a new entry to the FAQ Wizard: Should the FAQ Wizzard be listed on the list.org home page? Bill Moseley mailto:moseley@hank.org From gward@mems-exchange.org Tue Nov 27 15:25:02 2001 From: gward@mems-exchange.org (Greg Ward) Date: Tue, 27 Nov 2001 10:25:02 -0500 Subject: [Mailman-Developers] Another new FAQ entry Message-ID: <20011127102502.C19793@mems-exchange.org> Mailman developer types -- I've written a FAQ entry for that perennial favourite, "How can I remove a post from the list archive?". Please take a look at http://www.python.org/cgi-bin/faqw-mm.py?req=show&file=faq03.003.htp and fix any problems or howl at me. Greg -- Greg Ward - software developer gward@mems-exchange.org MEMS Exchange http://www.mems-exchange.org From barry@zope.com Tue Nov 27 17:12:40 2001 From: barry@zope.com (Barry A. Warsaw) Date: Tue, 27 Nov 2001 12:12:40 -0500 Subject: [Mailman-Developers] Re: [Mailman-Users] Subscriber names References: <20011127095416.B19793@mems-exchange.org> Message-ID: <15363.51592.249787.804020@anthem.wooz.org> >>>>> "GW" == Greg Ward writes: GW> In particular, can Mailman 2.1 track real names? Yes! From claw@kanga.nu Tue Nov 27 18:41:05 2001 From: claw@kanga.nu (J C Lawrence) Date: Tue, 27 Nov 2001 10:41:05 -0800 Subject: [Mailman-Developers] Re: [Mailman-Users] Subscriber names In-Reply-To: Message from Greg Ward of "Tue, 27 Nov 2001 09:54:16 EST." <20011127095416.B19793@mems-exchange.org> References: <20011127095416.B19793@mems-exchange.org> Message-ID: <23439.1006886465@kanga.nu> On Tue, 27 Nov 2001 09:54:16 -0500 Greg Ward wrote: > I've just added a new entry to the FAQ Wizard: > 3.2. How can I track subscriber's real names? Nice. I've updated and extended it a bit. Umm, actually I updated and extended most of the current FAQ entries as well as adding a couple. Barry: Mind adding a "General Questions" section? The MTA/LDA/MDA Q and others should go in there. > In particular, can Mailman 2.1 track real names? Yes. Note that this is unreliable (The value of the GECOS field is neither controlled or auditable). -- J C Lawrence ---------(*) Satan, oscillate my metallic sonatas. claw@kanga.nu He lived as a devil, eh? http://www.kanga.nu/~claw/ Evil is a name of a foeman, as I live. From pchytil@ece.ogi.edu Tue Nov 27 19:22:37 2001 From: pchytil@ece.ogi.edu (Pavel Chytil) Date: Tue, 27 Nov 2001 11:22:37 -0800 Subject: [Mailman-Developers] Uncaught runner exception: 'generator' object has no attribute 'insert' In-Reply-To: <15363.19165.428335.123324@anthem.wooz.org> References: <1006797654.3c028356cb072@asp.ogi.edu> <3C028C15.F23C61C1@utopia.west.sun.com> <1006801667.3c0293038f2f2@test> <3C030716.FC76EFAE@nleaudio.com> <15363.5200.721333.636251@anthem.wooz.org> <1006842842.3c0333da54973@test> <15363.16035.151196.942642@anthem.wooz.org> <1006846111.3c03409fa0470@test> <15363.17133.800672.843252@anthem.wooz.org> <1006847163.3c0344bbc003e@test> <15363.19165.428335.123324@anthem.wooz.org> Message-ID: <1006888957.3c03e7fd9b68a@mail.asp.ogi.edu> I have the same problem like before. I am trying to gate my list with news. Posting to news does not work and gives following error: Nov 27 11:12:30 2001 (18296) Uncaught runner exception: len() of unsized object Nov 27 11:12:30 2001 (18296) Traceback (most recent call last): File "/work/mailman/Mailman/Queue/Runner.py", line 104, in __oneloop self.__onefile(msg, msgdata) File "/work/mailman/Mailman/Queue/Runner.py", line 152, in __onefile keepqueued = self._dispose(mlist, msg, msgdata) File "/work/mailman/Mailman/Queue/NewsRunner.py", line 56, in _dispose prepare_message(mlist, msg, msgdata) File "/work/mailman/Mailman/Queue/NewsRunner.py", line 126, in prepare_message count = len(email.Iterators.body_line_iterator(msg)) TypeError: len() of unsized object gating from news to list works fine, though. I am suspecting very similar problem as before. Thanks, Pavel From pchytil@asp.ogi.edu Tue Nov 27 21:57:36 2001 From: pchytil@asp.ogi.edu (Pavel Chytil) Date: Tue, 27 Nov 2001 13:57:36 -0800 Subject: [Mailman-Developers] Uncaught runner exception: 'generator' object has no attribute 'insert' In-Reply-To: <1006888957.3c03e7fd9b68a@mail.asp.ogi.edu> References: <1006797654.3c028356cb072@asp.ogi.edu> <3C028C15.F23C61C1@utopia.west.sun.com> <1006801667.3c0293038f2f2@test> <3C030716.FC76EFAE@nleaudio.com> <15363.5200.721333.636251@anthem.wooz.org> <1006842842.3c0333da54973@test> <15363.16035.151196.942642@anthem.wooz.org> <1006846111.3c03409fa0470@test> <15363.17133.800672.843252@anthem.wooz.org> <1006847163.3c0344bbc003e@test> <15363.19165.428335.123324@anthem.wooz.org> <1006888957.3c03e7fd9b68a@mail.asp.ogi.edu> Message-ID: <1006898256.3c040c50b6669@mail.asp.ogi.edu> This goes away if I change count = len(email.Iterators.body_line_iterator(msg)) to count = len(list(email.Iterators.body_line_iterator(msg))) in ./mailman/Mailman/Queue/NewsRunner.py line 126 I do not know if this is clean or not, but I never done anything with python. This introduce new problem which is nntp error: Nov 27 13:48:10 2001 (26172) (NNTPDirect) NNTP error for list "test": 441 437 No colon-space in "From pchytil@asp.ogi.edu Tue Nov 27 13:48:09 2001" header So my hacking is still in progress. I should probably read more about format of NNTP headers in documentation of mailman. Any ideas? Thanks, Pavel Cituji z emailu od Pavel Chytil : > I have the same problem like before. I am trying to gate my list with news. > Posting to news does not work and gives following error: > > Nov 27 11:12:30 2001 (18296) Uncaught runner exception: len() of unsized > object > Nov 27 11:12:30 2001 (18296) Traceback (most recent call last): > File "/work/mailman/Mailman/Queue/Runner.py", line 104, in __oneloop > self.__onefile(msg, msgdata) > File "/work/mailman/Mailman/Queue/Runner.py", line 152, in __onefile > keepqueued = self._dispose(mlist, msg, msgdata) > File "/work/mailman/Mailman/Queue/NewsRunner.py", line 56, in _dispose > prepare_message(mlist, msg, msgdata) > File "/work/mailman/Mailman/Queue/NewsRunner.py", line 126, in > prepare_message > count = len(email.Iterators.body_line_iterator(msg)) > TypeError: len() of unsized object > > gating from news to list works fine, though. I am suspecting very similar > problem as before. > > Thanks, > Pavel > > _______________________________________________ > Mailman-Developers mailing list > Mailman-Developers@python.org > http://mail.python.org/mailman/listinfo/mailman-developers > From paja@asp.ogi.edu Tue Nov 27 22:03:42 2001 From: paja@asp.ogi.edu (Pavel Chytil) Date: Tue, 27 Nov 2001 14:03:42 -0800 Subject: [Mailman-Developers] Uncaught runner exception: 'generator' object has no attribute 'insert' In-Reply-To: <1006898256.3c040c50b6669@mail.asp.ogi.edu> References: <1006797654.3c028356cb072@asp.ogi.edu> <3C028C15.F23C61C1@utopia.west.sun.com> <1006801667.3c0293038f2f2@test> <3C030716.FC76EFAE@nleaudio.com> <15363.5200.721333.636251@anthem.wooz.org> <1006842842.3c0333da54973@test> <15363.16035.151196.942642@anthem.wooz.org> <1006846111.3c03409fa0470@test> <15363.17133.800672.843252@anthem.wooz.org> <1006847163.3c0344bbc003e@test> <15363.19165.428335.123324@anthem.wooz.org> <1006888957.3c03e7fd9b68a@mail.asp.ogi.edu> <1006898256.3c040c50b6669@mail.asp.ogi.edu> Message-ID: <1006898622.3c040dbe77fe2@mail.asp.ogi.edu> Patch: --- NewsRunner.py Tue Nov 27 13:22:45 2001 +++ NewsRunner.py Thu Oct 11 22:16:18 2001 @@ -123,7 +123,7 @@ # Lines: is useful if msg['Lines'] is None: # BAW: is there a better way? - count = len(list(email.Iterators.body_line_iterator(msg))) + count = len(email.Iterators.body_line_iterator(msg)) msg['Lines'] = str(count) # Massage the message headers by remove some and rewriting others. This # woon't completely sanitize the message, but it will eliminate the bulk Pavel Cituji z emailu od Pavel Chytil : > This goes away if I change > > count = len(email.Iterators.body_line_iterator(msg)) > > to > > count = len(list(email.Iterators.body_line_iterator(msg))) > > in ./mailman/Mailman/Queue/NewsRunner.py line 126 > > I do not know if this is clean or not, but I never done anything with > python. > > This introduce new problem which is nntp error: > > Nov 27 13:48:10 2001 (26172) (NNTPDirect) NNTP error for list "test": 441 437 > No > colon-space in "From pchytil@asp.ogi.edu Tue Nov 27 13:48:09 2001" header > > So my hacking is still in progress. I should probably read more about format > of > NNTP headers in documentation of mailman. > > Any ideas? > > Thanks, > Pavel > > Cituji z emailu od Pavel Chytil : > > > I have the same problem like before. I am trying to gate my list with > news. > > Posting to news does not work and gives following error: > > > > Nov 27 11:12:30 2001 (18296) Uncaught runner exception: len() of unsized > > object > > Nov 27 11:12:30 2001 (18296) Traceback (most recent call last): > > File "/work/mailman/Mailman/Queue/Runner.py", line 104, in __oneloop > > self.__onefile(msg, msgdata) > > File "/work/mailman/Mailman/Queue/Runner.py", line 152, in __onefile > > keepqueued = self._dispose(mlist, msg, msgdata) > > File "/work/mailman/Mailman/Queue/NewsRunner.py", line 56, in _dispose > > prepare_message(mlist, msg, msgdata) > > File "/work/mailman/Mailman/Queue/NewsRunner.py", line 126, in > > prepare_message > > count = len(email.Iterators.body_line_iterator(msg)) > > TypeError: len() of unsized object > > > > gating from news to list works fine, though. I am suspecting very similar > > problem as before. > > > > Thanks, > > Pavel > > > > _______________________________________________ > > Mailman-Developers mailing list > > Mailman-Developers@python.org > > http://mail.python.org/mailman/listinfo/mailman-developers > > > > > > _______________________________________________ > Mailman-Developers mailing list > Mailman-Developers@python.org > http://mail.python.org/mailman/listinfo/mailman-developers > From mhz@alt-linux.org Tue Nov 27 22:47:26 2001 From: mhz@alt-linux.org (Mikhail Zabaluev) Date: Wed, 28 Nov 2001 01:47:26 +0300 Subject: [Mailman-Developers] MIME-Version Message-ID: <20011127224726.GA10914@localhost.localdomain> Hello, I see that the 'MIME-Version' header is set in MIMEBase.MIMEBase and thus in every object derived from it. This header should be set only for 'root' MIMEMessage.MIMEMessage objects; no need to duplicate it in every part of a message. -- Stay tuned, MhZ JID: mookid@jabber.org ___________ A squeegee by any other name wouldn't sound as funny. From chuqui@plaidworks.com Tue Nov 27 23:12:08 2001 From: chuqui@plaidworks.com (Chuq Von Rospach) Date: Tue, 27 Nov 2001 15:12:08 -0800 Subject: [Mailman-Developers] Posting authentication issues... Message-ID: Barry, here's a request that you might want to chew on. On our corporate box, we'd like the ability to limit posting to subscribed addresses OR from a given domain (all foo@dom.ain addresses also allowed to post). We gateway lists to usenet internally, and want to encourage employees to get involved without having to go through the subscription process for things they're reading via news. And yes, I know the news gateway is bidirectional, some employees prefer e-mail. Will 2.1 have a way to do this easily? One of my worries, of course, are forged addresses. A hack like that leave you open to any troll with half a brain. So my second thought was: how about some mechanism that validates posting based on information embedded in the message? Majordomo does that with an Approved: heading for admins, but I'm thinking more of a general setup. For instance, if you could set a list/server(global) configuration of: If (regex matches) approve posting automatically You could build a regex, for instance, of: From:.*@apple.com Or Password: hidden Or even: Received:.*internal.gate.way.com The latter would be what I'd want to use, in fact, for auto-approval of internal postings; I can, in fact, guarantee that if it comes though the firewall from the firewall relay machines, it's from an employee, where the from address might not be reliable. What do you think? FWIW, I apologize for being seriously missing. Just back from two weeks doing R&R in British columbia, and I"m just now returning to the world of having to show up at work once or twice a week. Tanned, rested and ready. Well, technically, mossy, rested and ready... (giggle) From claw@kanga.nu Tue Nov 27 23:47:34 2001 From: claw@kanga.nu (J C Lawrence) Date: Tue, 27 Nov 2001 15:47:34 -0800 Subject: [Mailman-Developers] Posting authentication issues... In-Reply-To: Message from Chuq Von Rospach of "Tue, 27 Nov 2001 15:12:08 PST." References: Message-ID: <29456.1006904854@kanga.nu> On Tue, 27 Nov 2001 15:12:08 -0800 Chuq Von Rospach wrote: > One of my worries, of course, are forged addresses. A hack like > that leave you open to any troll with half a brain. It would be nice to pair envelope authentication with domain permission using From:/Cc: for membership permission. It doesn't do a *whole* lot, but it would help. -- J C Lawrence Satan, oscillate my metallic sonatas. ---------(*) He lived as a devil, eh? claw@kanga.nu Evil is a name of a foeman, as I live. http://www.kanga.nu/~claw/ Reviled did I live; evil I did deliver. From pchytil@ece.ogi.edu Wed Nov 28 03:48:48 2001 From: pchytil@ece.ogi.edu (Pavel Chytil) Date: Tue, 27 Nov 2001 19:48:48 -0800 Subject: [Mailman-Developers] GetScriptURL Message-ID: <1006919328.3c045ea062a9d@mail.asp.ogi.edu> Hello, I have modified may site setting from (in Defaults.py) # Site-specific settings DEFAULT_EMAIL_HOST = 'asp.ogi.edu' DEFAULT_URL_HOST = 'asp.ogi.edu' DEFAULT_URL_PATTERN = 'http://%s/mailman/' # For backwards compatibility. Note: DEFAULT_URL_PATTERN must end in a slash! DEFAULT_HOST_NAME = DEFAULT_EMAIL_HOST DEFAULT_URL = DEFAULT_URL_PATTERN % DEFAULT_URL_HOST PUBLIC_ARCHIVE_URL = 'http://%(hostname)s/pipermail/%(listname)s' to (in mm_cfg.py) DEFAULT_EMAIL_HOST = 'asp.ogi.edu' DEFAULT_URL_HOST = 'lists.asp.ogi.edu' DEFAULT_HOST_NAME = 'lists.asp.ogi.edu' DEFAULT_URL_PATTERN = 'http://%s/mailman/' DEFAULT_URL = DEFAULT_URL_PATTERN % DEFAULT_URL_HOST PUBLIC_ARCHIVE_URL = 'http://lists.asp.ogi.edu/pipermail/%(listname)s' My goal is to receive email (for example email with help) from mailman-request@asp.ogi.edu with proper http links I would expect : http://lists.asp.ogi.edu/mailman/listinfo/test but getting http://asp.ogi.edu/mailman/listinfo/test My host has name asp.ogi.edu but has several CNAMEs like lists, mail. I have found that this pretty much depends on function GetScriptURL (Mailman/MailList.py), where %(listinfo_url)s assign , but since I am not familiar with Python, it is kind of hopeless for me to try fix something or understand quickly, so I rather ask. I have installed Python 2.2 and Mailman 2.1a3 (fresh from cvs) Thanks for any feed back, Pavel From correo@valmansi.com Wed Nov 28 04:12:36 2001 From: correo@valmansi.com (mailmaster@valmansi.com) Date: Tue, 27 Nov 2001 23:12:36 -0500 Subject: [Mailman-Developers] Tarjetas de Navidad Message-ID: <200111280412.fAS4Cau02082@vmya.valmansi.com> TEMAS DE VIDA CRISTIANA OfrecemosTarjetas de Navidad con motivos claramente cristianos. * Hemos procurado editarlas a muy bajo costo para que la difusion del mensaje del Nacimiento de Jesus llegue a muchas personas. * Los precios de dichas tarjetas van de forma escalonada: desde S/. 1.80 la unidad hasta S/. 1.20 cuando se compran 100 a mas tarjetas. Estos precios incluyen el IGV. Nos proponemos devolver a esta fiesta tan nuestra su verdadero significado. Le recomendamos visite nuestra pagina http://www.aplenosol.com/tarjetas/ , en ella encontrara todos los modelos y la forma de adquirirlos y hacer su pedido en linea. Si quieres salir de esta lista solo tienes que marcarlo en el sgte. link To remove yourself or change your subscription, please visit http://valmansi.com/multimail/mail.php From Salil_Sanghvi@i2.com Wed Nov 28 12:17:07 2001 From: Salil_Sanghvi@i2.com (Salil_Sanghvi@i2.com) Date: Wed, 28 Nov 2001 17:47:07 +0530 Subject: [Mailman-Developers] I need Jpython 1.0.3 Message-ID: Hi, Can anybody give me Jpython 1.0.3, I havent found this anywhere. Salil From Salil_Sanghvi@i2.com Wed Nov 28 12:17:31 2001 From: Salil_Sanghvi@i2.com (Salil_Sanghvi@i2.com) Date: Wed, 28 Nov 2001 17:47:31 +0530 Subject: [Mailman-Developers] I need Jpython 1.0.3 Message-ID: Hi, Can anybody give me Jpython 1.0.3, I havent found this anywhere. Salil From Markus Jansen Wed Nov 28 16:56:57 2001 From: Markus Jansen (Markus Jansen) Date: Wed, 28 Nov 2001 17:56:57 +0100 (MET) Subject: AttributeError: 'generator' object has no attribute 'pop' (was: Re: [Mailman-Developers] Uncaught runner exception: 'generator' object has no attribute 'insert') Message-ID: <200111281656.RAA03279@al.edt.ericsson.se> Hi Pavel, I have seen the same problem in Tagger.py (see context diff below) with incoming mails. Similar to you, I have some 2 days of Python experience, but it seems to=20 work now. Best regards, =09Markus > diff -c Tagger.py.orig Tagger.py *** Tagger.py.orig Wed Nov 28 17:50:36 2001 --- Tagger.py Wed Nov 28 17:55:09 2001 *************** *** 81,87 **** # the first numlines of body text. lines =3D [] lineno =3D 0 ! reader =3D email.Iterators.body_line_iterator(msg) while numlines is None or lineno < numlines: try: line =3D reader.pop(0) --- 81,87 ---- # the first numlines of body text. lines =3D [] lineno =3D 0 ! reader =3D list(email.Iterators.body_line_iterator(msg)) while numlines is None or lineno < numlines: try: line =3D reader.pop(0) >=20 > X-Authentication-Warning: asp.ogi.edu: nobody set sender to paja@asp.ogi.= edu=20 using -f > From: Pavel Chytil > To: "Barry A. Warsaw" > Cc: mailman-developers@python.org > Subject: Re: [Mailman-Developers] Uncaught runner exception: 'generator'= =20 object has no attribute 'insert' > MIME-Version: 1.0 > Content-Transfer-Encoding: 8bit > User-Agent: Internet Messaging Program (IMP) 4.0-cvs > X-BeenThere: mailman-developers@python.org > X-Mailman-Version: 2.0.7 (101270) > List-Help: > List-Post: > List-Subscribe: ,=20 > List-Id: Mailman mailing list developers > List-Unsubscribe:=20 ,=20 > List-Archive: > Date: Tue, 27 Nov 2001 14:03:42 -0800 >=20 > Patch: >=20 > --- NewsRunner.py Tue Nov 27 13:22:45 2001 > +++ NewsRunner.py Thu Oct 11 22:16:18 2001 > @@ -123,7 +123,7 @@ > # Lines: is useful > if msg['Lines'] is None: > # BAW: is there a better way? > - count =3D len(list(email.Iterators.body_line_iterator(msg))) > + count =3D len(email.Iterators.body_line_iterator(msg)) > msg['Lines'] =3D str(count) > # Massage the message headers by remove some and rewriting others. = This > # woon't completely sanitize the message, but it will eliminate the = bulk >=20 > Pavel >=20 > Cituji z emailu od Pavel Chytil : >=20 > > This goes away if I change > >=20 > > count =3D len(email.Iterators.body_line_iterator(msg)) > >=20 > > to > >=20 > > count =3D len(list(email.Iterators.body_line_iterator(msg))) > >=20 > > in ./mailman/Mailman/Queue/NewsRunner.py line 126 > >=20 > > I do not know if this is clean or not, but I never done anything with > > python. > >=20 > > This introduce new problem which is nntp error: > >=20 > > Nov 27 13:48:10 2001 (26172) (NNTPDirect) NNTP error for list "test": 4= 41=20 437 > > No > > colon-space in "From pchytil@asp.ogi.edu Tue Nov 27 13:48:09 2001" head= er > >=20 > > So my hacking is still in progress. I should probably read more about f= ormat > > of > > NNTP headers in documentation of mailman. > >=20 > > Any ideas? > >=20 > > Thanks, > > =09Pavel > >=20 > > Cituji z emailu od Pavel Chytil : > >=20 > > > I have the same problem like before. I am trying to gate my list with > > news. > > > Posting to news does not work and gives following error: > > >=20 > > > Nov 27 11:12:30 2001 (18296) Uncaught runner exception: len() of unsi= zed > > > object > > > Nov 27 11:12:30 2001 (18296) Traceback (most recent call last): > > > File "/work/mailman/Mailman/Queue/Runner.py", line 104, in __oneloo= p > > > self.__onefile(msg, msgdata) > > > File "/work/mailman/Mailman/Queue/Runner.py", line 152, in __onefil= e > > > keepqueued =3D self._dispose(mlist, msg, msgdata) > > > File "/work/mailman/Mailman/Queue/NewsRunner.py", line 56, in _disp= ose > > > prepare_message(mlist, msg, msgdata) > > > File "/work/mailman/Mailman/Queue/NewsRunner.py", line 126, in > > > prepare_message > > > count =3D len(email.Iterators.body_line_iterator(msg)) > > > TypeError: len() of unsized object > > >=20 > > > gating from news to list works fine, though. I am suspecting very sim= ilar > > > problem as before. > > >=20 > > > Thanks, > > > =09Pavel > > >=20 > > > _______________________________________________ > > > Mailman-Developers mailing list > > > Mailman-Developers@python.org > > > http://mail.python.org/mailman/listinfo/mailman-developers > > >=20 > >=20 > >=20 > >=20 > > _______________________________________________ > > Mailman-Developers mailing list > > Mailman-Developers@python.org > > http://mail.python.org/mailman/listinfo/mailman-developers > >=20 >=20 >=20 >=20 > _______________________________________________ > Mailman-Developers mailing list > Mailman-Developers@python.org > http://mail.python.org/mailman/listinfo/mailman-developers -- Markus Jansen Markus.Jansen@ericsson.com Senior Designer, Technical Coordinator Ericsson Process & Application Consulting TTM Solutions / CM Tools VH/PAC/L/TD Phone +46 8 568 61560 V=E4stberga All=E9 36A Mobile +46 70 526 2548 12582 Stockholm, Sweden Fax +46 8 568 61888 From mtearle@tartarus.uwa.edu.au Thu Nov 29 03:45:15 2001 From: mtearle@tartarus.uwa.edu.au (Mark Tearle) Date: Thu, 29 Nov 2001 11:45:15 +0800 (WST) Subject: [Mailman-Developers] FoRK-as-RSS (fwd) Message-ID: [Forwarded with permission] A cool hack, although Justin thinks it would be cooler if implemented inside Mailman/pipermail itself.... Yours Mark -- Mark Tearle - mark@tearle.com Roy Knable: Boy, this is strange! [As cartoon mice.] Helen Knable: Strange? I'm a cartoon mouse with high-heel sneakers. The word "strange" is somewhat lacking. ---------- Forwarded message ---------- Date: Wed, 28 Nov 2001 14:42:47 +1100 From: Justin Mason To: fork@xent.com Subject: FoRK-as-RSS For some reason, I've hacked up a script which scrapes MailMan list archives to generate RSS. Not sure why, seeing as I really should be doing more "proper" work, but there you go ;) The results: http://taint.org/mmrss/ http://taint.org/mmrss/FoRK.html http://taint.org/mmrss/FoRK.rss cheers! --j. http://xent.com/mailman/listinfo/fork From chuqui@plaidworks.com Thu Nov 29 04:33:12 2001 From: chuqui@plaidworks.com (Chuq Von Rospach) Date: Wed, 28 Nov 2001 20:33:12 -0800 Subject: [Mailman-Developers] A few things... Message-ID: First, Barry -- there's a message in the admin posting queue you need to take a look at. It's an unsub request I can't find, but it's probably not our problem, since we're also being hit really hard right now by both the latest virus and by people who seem to have been spammed onto some list(s) that seem tob e run on a mailman server somewhere, and the links to mailman are probably the only ones that work (again). Sigh -- those links in the default distribution are a mixed blessing... And, you know, I was thinking today that the message sent out that says: homebuoy1@hotmail.com has been removed from south-bay-birds. Would be a lot more useful if it told me how/why (has he been removed? Or unsubscribed?). One other thing -- this is another possible DoS issue, but I don't really have any good idea of what (if anything) you can do about it. I was working on some stuff the other day, and realized that my ~mailman/data directory had a huge number of files in it. It was stuffed with a bunch of heldmsg* files. At one point, a subscriber's mailer misbehaved and the daemon stuffed 400+ corrupted messages down our throats. We finally had to just blow away the requests.db file, but I didn't realize until later it left the requests in ~data (somehow, that needs to be cleaned up, but I don't know how to easily do that, but there seems a need for some kind of garbage collection here). But it also made me realize this opens the server to a denial attack. Someone who's pissed at you can simply start sending messages to be held into the admin queue, infinitely, until you run out of disk space or inodes. And with the current admin interface, you can effectively shut down the admin queeue by building a pending queue so large you can't process it. But I'm more worried about that disk-based DoS here; at the same time, I don't know how you could practically implement some kind of quota or protection, unless you wanted to check disk space, and if it falls below some lowwater mark, start TEMPFAILing messages back into the queue for later processing. That, though, simply moves the dos attack into the mail queues, although most mailers also do disk-space checks, and stop accepting mail if the disk gets too full,. Not a good situation, but at least it'd keep the system from shutting down because of a full disk.... Anyway, some stuff to give you headaches over.... From Mailman-Users@python.org, claw@kanga.nu Thu Nov 29 05:34:41 2001 From: Mailman-Users@python.org, claw@kanga.nu (J C Lawrence) Date: Wed, 28 Nov 2001 21:34:41 -0800 Subject: [Mailman-Developers] Backing up Mailman list installations Message-ID: <20105.1007012081@kanga.nu> <> A moderately frequent request on these lists has been, "How can I back up my Mailman lists/membership/etc?" I happened to be in the area today touching up the scripts I use. Please feel free to adapt freely. Note: You'll need to have a reasonably recent version of nmh installed as the scripts rely on the MH tools to build a MIME message: http://www.mhost.com/nmh/ The scripts: ~/bin/mimemail: ---- #!/bin/bash #set -x subject=$1 file=$2 addr=$3 echo "To: ${addr} From: nobody Subject: ${subject} #application/octet-stream [${subject}] ${file} " | /usr/bin/mh/mhbuild - > /tmp/mimemail.tmp.${$} /usr/lib/mh/post -verbose -watch /tmp/mimemail.tmp.${$} rm /tmp/mimemail.tmp.${$} ---- ~/bin/mailman.backup ---- #!/bin/bash #set -x datestr=`date +%Y%m%d` host=`hostname -f` file=mailman.lists.${datestr}.tar.gz filepath=~/backups/${file} sendto="root" cd /var/lib/mailman tar zcf ${filepath} lists cd ~/backups mimemail ${file} ${filepath} ${sendto} #rm ${file} --- Yeah, there are some hard coded paths in there. Sue me. I never said they were pretty, merely that they worked. Brief explanation: mimemail takes three arguments: the Subject: of the message its going to send, the file it is going to send, and the address it is going to send it to. mimemail depends on the nmh tools to build the MIME message. mailman.backup takes no arguments. It creates a compressed tarball of ~mailman/lists in the file ~/backups/mailman.lists.YYMMDD.tar.gz eg: mailman.lists.20011128.tar.gz And then uses mimemail to send that file to root@localhost (edit/change if you want) before deleting it. To use drop them in a cronjob something like: 0 6 * * 0 /home/archiver/bin/mailman.backup A sample execution should look something like: $ ./mailman.backup -- Posting for All Recipients -- -- Local Recipients -- root: address ok -- Recipient Copies Posted -- Message Processed The result will be that every time the cronjob runs it will send you (in this case root@host.dom) a message looking something like: Subject: mailman.lists.20011128.tar.gz From: nobody@kanga.nu Date: Wed, 28 Nov 2001 21:12:55 -0800 To: root@kanga.nu Where the MIME attachment is the tarball constructed by ~/bin/mailman.backup. Edit the value of sendto in mailman.backup if you want them going somewhere else. I've added this to FAQ at: http://www.python.org/cgi-bin/faqw-mm.py?req=show&file=faq04.006.htp -- J C Lawrence ---------(*) Satan, oscillate my metallic sonatas. claw@kanga.nu He lived as a devil, eh? http://www.kanga.nu/~claw/ Evil is a name of a foeman, as I live. From Jon Carnes" Message-ID: <050901c178a4$c27790f0$0b04010a@JCARNES> Cool scripts. I used to do something similar, and then I moved over to using "ncftp" to drop the tarball off on my backup-server. A matter of preference, but I like that better than mailing myself the tarball. Jon Carnes ----- Original Message ----- From: "J C Lawrence" To: Cc: Sent: Thursday, November 29, 2001 12:34 AM Subject: [Mailman-Users] Backing up Mailman list installations > > <> > > A moderately frequent request on these lists has been, "How can I > back up my Mailman lists/membership/etc?" I happened to be in the > area today touching up the scripts I use. Please feel free to adapt > freely. > > Note: You'll need to have a reasonably recent version of nmh > installed as the scripts rely on the MH tools to build a MIME > message: > > http://www.mhost.com/nmh/ > > The scripts: > > ~/bin/mimemail: > ---- > #!/bin/bash > #set -x > > subject=$1 > file=$2 > addr=$3 > > echo "To: ${addr} > From: nobody > Subject: ${subject} > > #application/octet-stream [${subject}] ${file} > > " | /usr/bin/mh/mhbuild - > /tmp/mimemail.tmp.${$} > /usr/lib/mh/post -verbose -watch /tmp/mimemail.tmp.${$} > rm /tmp/mimemail.tmp.${$} > ---- > > ~/bin/mailman.backup > ---- > #!/bin/bash > #set -x > > datestr=`date +%Y%m%d` > host=`hostname -f` > file=mailman.lists.${datestr}.tar.gz > filepath=~/backups/${file} > sendto="root" > > cd /var/lib/mailman > tar zcf ${filepath} lists > cd ~/backups > mimemail ${file} ${filepath} ${sendto} > #rm ${file} > --- > > Yeah, there are some hard coded paths in there. Sue me. I never > said they were pretty, merely that they worked. Brief explanation: > > mimemail takes three arguments: the Subject: of the message its > going to send, the file it is going to send, and the address it is > going to send it to. mimemail depends on the nmh tools to build > the MIME message. > > mailman.backup takes no arguments. It creates a compressed > tarball of ~mailman/lists in the file > ~/backups/mailman.lists.YYMMDD.tar.gz > > eg: mailman.lists.20011128.tar.gz > > And then uses mimemail to send that file to root@localhost > (edit/change if you want) before deleting it. > > To use drop them in a cronjob something like: > > 0 6 * * 0 /home/archiver/bin/mailman.backup > > A sample execution should look something like: > > $ ./mailman.backup > -- Posting for All Recipients -- > -- Local Recipients -- > root: address ok > -- Recipient Copies Posted -- > Message Processed > > The result will be that every time the cronjob runs it will send you > (in this case root@host.dom) a message looking something like: > > Subject: mailman.lists.20011128.tar.gz > From: nobody@kanga.nu > Date: Wed, 28 Nov 2001 21:12:55 -0800 > To: root@kanga.nu > > > > Where the MIME attachment is the tarball constructed by > ~/bin/mailman.backup. Edit the value of sendto in mailman.backup if > you want them going somewhere else. > > I've added this to FAQ at: > > http://www.python.org/cgi-bin/faqw-mm.py?req=show&file=faq04.006.htp > > -- > J C Lawrence > ---------(*) Satan, oscillate my metallic sonatas. > claw@kanga.nu He lived as a devil, eh? > http://www.kanga.nu/~claw/ Evil is a name of a foeman, as I live. > > ------------------------------------------------------ > Mailman-Users maillist - Mailman-Users@python.org > http://mail.python.org/mailman/listinfo/mailman-users From claw@kanga.nu Thu Nov 29 07:36:54 2001 From: claw@kanga.nu (J C Lawrence) Date: Wed, 28 Nov 2001 23:36:54 -0800 Subject: [Mailman-Developers] Re: [Mailman-Users] Backing up Mailman list installations In-Reply-To: Message from "Jon Carnes" of "Thu, 29 Nov 2001 02:09:17 EST." <050901c178a4$c27790f0$0b04010a@JCARNES> References: <20105.1007012081@kanga.nu> <050901c178a4$c27790f0$0b04010a@JCARNES> Message-ID: <22917.1007019414@kanga.nu> On Thu, 29 Nov 2001 02:09:17 -0500 Jon Carnes wrote: > Cool scripts. Hacks really. > I used to do something similar, and then I moved over to using > "ncftp" to drop the tarball off on my backup-server. A matter of > preference, but I like that better than mailing myself the > tarball. Originally I kept the tarballs as versioned files in a ZOO archive. I didn't like this as ZOO suffers as a tool and there was no distribution. Then I used to SSH/scp the tarballs to myself on another system. I didn't like this as it required that the tool that did the file copy must be able to authenticate itself on the other system (ie SSH public key authentication). I didn't like that as compromise of the local system thereby implied compromise of the the other system as well (or at least questions of untrusted shell access). Not good. No I mail them. No trust models required other than the fact that I'm implicitly exposing the tarballs en-route to interception, and thus the password/membership base as well. Well, that would be a problem except that the root account on that box delivers to a local mbox which I collect over an IMAP-SSL connection (the wonders of fetchmail). So, I get a decent trust model *and* distribution. -- J C Lawrence ---------(*) Satan, oscillate my metallic sonatas. claw@kanga.nu He lived as a devil, eh? http://www.kanga.nu/~claw/ Evil is a name of a foeman, as I live. From Dale Newfield Thu Nov 29 07:42:05 2001 From: Dale Newfield (Dale Newfield) Date: Thu, 29 Nov 2001 02:42:05 -0500 (EST) Subject: [Mailman-Developers] Re: [Mailman-Users] Backing up Mailman list installations In-Reply-To: <22917.1007019414@kanga.nu> Message-ID: On Wed, 28 Nov 2001, J C Lawrence wrote: > [S]o I mail them. No trust models required other than the fact that > I'm implicitly exposing the tarballs en-route to interception, and > thus the password/membership base as well. Well, that would be a > problem except that the root account on that box delivers to a local > mbox which I collect over an IMAP-SSL connection (the wonders of > fetchmail). > > So, I get a decent trust model *and* distribution. --- Dale Newfield "My country, right or wrong" is not a cogent argument. It is one step away from "I was only following orders." From Dale Newfield Thu Nov 29 07:44:16 2001 From: Dale Newfield (Dale Newfield) Date: Thu, 29 Nov 2001 02:44:16 -0500 (EST) Subject: [Mailman-Developers] Re: [Mailman-Users] Backing up Mailman list installations In-Reply-To: <22917.1007019414@kanga.nu> Message-ID: Sorry for this double intrusion, but I must apologize for the first unintentional one. I had intended to cancel that composition instead of sending it--sorry for filling your mailboxes with messages empty of content. -Dale Newfield Dale@Newfield.org From barry@zope.com Thu Nov 29 21:04:23 2001 From: barry@zope.com (Barry A. Warsaw) Date: Thu, 29 Nov 2001 16:04:23 -0500 Subject: [Mailman-Developers] Re: [Mailman-Users] Bounce Options References: <040401c178eb$752e49a0$7b008d0a@sc.slr.com> <20011129100824.A12696@ssc.com> Message-ID: <15366.41687.561263.356123@anthem.wooz.org> [Changing followups to mailman-developers as this discussion really belongs there. -BAW] >>>>> "DW" == Dan Wilder writes: DW> I guess I'm wondering if anybody recalls the intent of this DW> code. The only person who ever had a chance of understanding the intent is John Viega, but he's been removed from Mailman hacking for so long, I doubt even he remembers. I've looked at this stuff too, and there are a number of things that seem just plain broken to me. I'd like to rewrite it all, but I'm not sure there will be time before 2.1. -Barry From Dale Newfield Thu Nov 29 21:58:38 2001 From: Dale Newfield (Dale Newfield) Date: Thu, 29 Nov 2001 16:58:38 -0500 (EST) Subject: [Mailman-Developers] Re: [Mailman-Users] Bounce Options In-Reply-To: <15366.41687.561263.356123@anthem.wooz.org> Message-ID: > I've looked at this stuff too, and there are a number of things that > seem just plain broken to me. I'd like to rewrite it all, but I'm not > sure there will be time before 2.1. I poked around in this myself a bit ago, w/o much benefit. It's a bit jumbled in there, and I thought it was an indication that either I just didn't understand it or it was broken. After a while I became convinced of the later, and I got discouraged. :-) Just so it's on your radar when you do take a look at it, I'll mention that we only sometimes get the notification of bounce removals. -Dale From dan@ssc.com Thu Nov 29 23:55:26 2001 From: dan@ssc.com (Dan Wilder) Date: Thu, 29 Nov 2001 15:55:26 -0800 Subject: [Mailman-Developers] Re: [Mailman-Users] Bounce Options In-Reply-To: <15366.41687.561263.356123@anthem.wooz.org> References: <040401c178eb$752e49a0$7b008d0a@sc.slr.com> <20011129100824.A12696@ssc.com> <15366.41687.561263.356123@anthem.wooz.org> Message-ID: <20011129155526.A14551@ssc.com> On Thu, Nov 29, 2001 at 04:04:23PM -0500, Barry A. Warsaw wrote: > > [Changing followups to mailman-developers as this discussion really > belongs there. -BAW] > > >>>>> "DW" == Dan Wilder writes: > > DW> I guess I'm wondering if anybody recalls the intent of this > DW> code. > > The only person who ever had a chance of understanding the intent is > John Viega, but he's been removed from Mailman hacking for so long, I > doubt even he remembers. Hmm. So what's a reasonable intent for bounce handling? Here's a sketch. No doubt I misunderstand important points. Perhaps others would be kind enough to comment. Presuming the list is configured for automatic bounce handling at all, it would seem reasonable to claim that there are circumstances under which bounce handling might unsubscribe or disable mail to a subscriber. The sporadic bounce probably shouldn't cause this sort of action. So, there should be some forgiveness mechanism in place. Several bounces over a short period of time might reasonably be forgiven, or treated as a single bounce. Many situations that will cause a bounce involve some misconfiguration which the conscientious sysadmin will shamefacedly correct as soon as it is brought to his or her attention. A heavily trafficked list might not want to unsubscribe even members who cause several bounces, providing these fall within a short period of time. Several bounces over a longer period of time might be cause for suspension, even if posts are accepted between. The existing bounce handling makes some distinction I don't understand between "fatal" bounces and "nonfatal" bounces. Is this "no such user" versus "host busy", for example? -- ----------------------------------------------------------------- Dan Wilder Technical Manager & Editor SSC, Inc. P.O. Box 55549 Phone: 206-782-8808 Seattle, WA 98155-0549 URL http://embedded.linuxjournal.com/ ----------------------------------------------------------------- From bob@nleaudio.com Fri Nov 30 03:02:46 2001 From: bob@nleaudio.com (Bob Puff@NLE) Date: Thu, 29 Nov 2001 22:02:46 -0500 Subject: [Mailman-Developers] Re: [Mailman-Users] Bounce Options References: Message-ID: <3C06F6D6.F88BB394@nleaudio.com> Yeah, I was just chatting with Barry about this. There are some serious problems with the bounce handling. A user can be removed with only two bounces, if they occur 5 days apart (if you have your bounce handlign set to 5 days of continuous bouncing). I have done some work in fixing up bounce -detection- (at least on my sites, Mailman was catching about 80% of the bounces... now it gets 99.9%). But after it detects it... that part needs help! Bob From claw@kanga.nu Fri Nov 30 06:30:35 2001 From: claw@kanga.nu (J C Lawrence) Date: Thu, 29 Nov 2001 22:30:35 -0800 Subject: [Mailman-Developers] MailGraph for Postfix Message-ID: <19484.1007101835@kanga.nu> http://people.ee.ethz.ch/~dws/software/mailgraph/ ---- Mailgraph is a very simple mail statistics RRDtool frontend for Postfix that produces daily, weekly, monthly and yearly graphs of received/sent and bounced/rejected mail. ---- It doesn't do the level of abstraction I'd really like (graphing per Sender: header), but its fairly easy to extend to do that if I ever get around to it. ITMT its a rather useful general MTA performance and monitoring tool. Certainly it revealed me a few things about my mail systems I hadn't fully grokked before. Demo site: http://people.ee.ethz.ch/~dws/mailgraph/mailgraph.cgi Note: If you use syslog-ng there's a very simple patch you'll need to make to the Parse:Syslog package to get it to properly read syslog-ng log entries. -- J C Lawrence ---------(*) Satan, oscillate my metallic sonatas. claw@kanga.nu He lived as a devil, eh? http://www.kanga.nu/~claw/ Evil is a name of a foeman, as I live. From jmeurer@gmx.de Fri Nov 30 07:49:31 2001 From: jmeurer@gmx.de (Jonas Meurer) Date: Fri, 30 Nov 2001 08:49:31 +0100 Subject: [Mailman-Developers] Administrate mailman from shell Message-ID: <20011130084931.A523@testsystem.server0.de> Hello, Is there a way to configure mailman completely from the shell? It don't has to be compfortable, it only is for scripts etc... I've heard somewhere that it's possible. The cgi-bin-scripts also only can execute probrams, he? Is there a howto for administrate and configure mailman from the shell? If not, can anyone list me all commandlines? As compensation then I will write a howto. Thanks Jonas -- Definition of Atheism: a non-prophet organization. From claw@kanga.nu Fri Nov 30 08:01:58 2001 From: claw@kanga.nu (J C Lawrence) Date: Fri, 30 Nov 2001 00:01:58 -0800 Subject: [Mailman-Developers] Administrate mailman from shell In-Reply-To: Message from Jonas Meurer of "Fri, 30 Nov 2001 08:49:31 +0100." <20011130084931.A523@testsystem.server0.de> References: <20011130084931.A523@testsystem.server0.de> Message-ID: <21123.1007107318@kanga.nu> On Fri, 30 Nov 2001 08:49:31 +0100 Jonas Meurer wrote: > Is there a way to configure mailman completely from the > shell? Yes. ~/bin/with_list. Knowledge of Python and Mailman internals is required. See the list archives for examples. Please drop your findings in the FAQ: http://www.python.org/cgi-bin/faqw-mm.py?req=home -- J C Lawrence ---------(*) Satan, oscillate my metallic sonatas. claw@kanga.nu He lived as a devil, eh? http://www.kanga.nu/~claw/ Evil is a name of a foeman, as I live. From R.Barrett@ftel.co.uk Fri Nov 30 10:45:40 2001 From: R.Barrett@ftel.co.uk (Richard Barrett) Date: Fri, 30 Nov 2001 10:45:40 +0000 Subject: [Mailman-Developers] Administrate mailman from shell In-Reply-To: <20011130084931.A523@testsystem.server0.de> Message-ID: <5.1.0.14.2.20011130104349.0301f008@pop.ftel.co.uk> At 08:49 30/11/2001 +0100, Jonas Meurer wrote: >Hello, >Is there a way to configure mailman completely from the shell? >It don't has to be compfortable, it only is for scripts etc... >I've heard somewhere that it's possible. >The cgi-bin-scripts also only can execute probrams, he? >Is there a howto for administrate and configure mailman from >the shell? If not, can anyone list me all commandlines? >As compensation then I will write a howto. > >Thanks > Jonas You could try reviewing the function of scripts in $prefix/bin; execute them with the -h option to find out what they do. For instance, you can use the $prefix/bin/config_list to configure your lists. From Nigel.Metheringham@VData.co.uk Fri Nov 30 10:49:55 2001 From: Nigel.Metheringham@VData.co.uk (Nigel Metheringham) Date: 30 Nov 2001 10:49:55 +0000 Subject: [Mailman-Developers] Re: [Mailman-Users] Subscriber names In-Reply-To: <3.0.3.32.20011127071312.006be34c@pop3.hank.org> References: <3.0.3.32.20011127071312.006be34c@pop3.hank.org> Message-ID: <1007117395.1524.11.camel@gaspode.localnet> On Tue, 2001-11-27 at 15:13, Bill Moseley wrote: > At 09:54 AM 11/27/2001 -0500, Greg Ward wrote: > > > > >I've just added a new entry to the FAQ Wizard: > > Should the FAQ Wizzard be listed on the list.org home page? Definitely. I think it should also be added to the list message footers - I mean if people ignore the subscribe/unsubscribe info there, we should give them the means and opportunity to ignore the FAQs references there too :-} Nigel. From Nigel.Metheringham@VData.co.uk Fri Nov 30 11:06:36 2001 From: Nigel.Metheringham@VData.co.uk (Nigel Metheringham) Date: 30 Nov 2001 11:06:36 +0000 Subject: [Mailman-Developers] Re: [Mailman-Users] Bounce Options In-Reply-To: <20011129155526.A14551@ssc.com> References: <040401c178eb$752e49a0$7b008d0a@sc.slr.com> <20011129100824.A12696@ssc.com> <15366.41687.561263.356123@anthem.wooz.org> <20011129155526.A14551@ssc.com> Message-ID: <1007118397.1524.13.camel@gaspode.localnet> On Thu, 2001-11-29 at 23:55, Dan Wilder wrote: > So what's a reasonable intent for bounce handling? > > Here's a sketch. No doubt I misunderstand important points. > Perhaps others would be kind enough to comment. > > Presuming the list is configured for automatic bounce handling > at all, it would seem reasonable to claim that there are > circumstances under which bounce handling might unsubscribe or > disable mail to a subscriber. Definitely. In general I (as list admin) want almost zero involvement here. > The sporadic bounce probably shouldn't cause this sort of action. > So, there should be some forgiveness mechanism in place. Yes - I occaisionally bounce stuff from bugtraq because we have a filter on that bounces executable content (ie outlook virus hacks), but it also bounces some exploit code :-) So I sometimes bounce 10% of the messages in a day. > Several bounces over a short period of time might reasonably > be forgiven, or treated as a single bounce. Many situations > that will cause a bounce involve some misconfiguration which > the conscientious sysadmin will shamefacedly correct as soon as > it is brought to his or her attention. A heavily trafficked > list might not want to unsubscribe even members who cause several > bounces, providing these fall within a short period of time. > > Several bounces over a longer period of time might be cause > for suspension, even if posts are accepted between. > > The existing bounce handling makes some distinction I don't > understand between "fatal" bounces and "nonfatal" bounces. > Is this "no such user" versus "host busy", for example? SMTP has immediate and retryable errors For an announce list - I have a few (similar to mailman-announce) which have traffic in single digits per month (if that high), the rules may need to be different - 2 bounces from a user in 5 days is going to be close to impossible to achieve for example :-) Unfortunately its hard to identify correctly delivered messages - so you cannot easily use a "if a message is delivered correctly, reset the death counter" approach - one UK ISP routinely bounces mail to their users that has not been picked up after 30 days (and their bounce messages are currently unparsable). Nigel. From dan@ssc.com Fri Nov 30 16:40:11 2001 From: dan@ssc.com (Dan Wilder) Date: Fri, 30 Nov 2001 08:40:11 -0800 Subject: [Mailman-Developers] Re: [Mailman-Users] Subscriber names In-Reply-To: <1007117395.1524.11.camel@gaspode.localnet> References: <3.0.3.32.20011127071312.006be34c@pop3.hank.org> <1007117395.1524.11.camel@gaspode.localnet> Message-ID: <20011130084011.C20009@ssc.com> On Fri, Nov 30, 2001 at 10:49:55AM +0000, Nigel Metheringham wrote: > On Tue, 2001-11-27 at 15:13, Bill Moseley wrote: > > At 09:54 AM 11/27/2001 -0500, Greg Ward wrote: > > > > > > > >I've just added a new entry to the FAQ Wizard: > > > > Should the FAQ Wizzard be listed on the list.org home page? > > Definitely. > I think it should also be added to the list message footers - I mean if > people ignore the subscribe/unsubscribe info there, we should give them > the means and opportunity to ignore the FAQs references there too :-} > > Nigel. Amen. It's a great resource. I was just a moment ago looking for it. I'd misplaced the link, and was surprised to see it _wasn't_ shown on the list.org home page. -- ----------------------------------------------------------------- Dan Wilder Technical Manager & Editor SSC, Inc. P.O. Box 55549 Phone: 206-782-8808 Seattle, WA 98155-0549 URL http://embedded.linuxjournal.com/ ----------------------------------------------------------------- From dan@ssc.com Fri Nov 30 17:01:21 2001 From: dan@ssc.com (Dan Wilder) Date: Fri, 30 Nov 2001 09:01:21 -0800 Subject: [Mailman-Developers] Re: [Mailman-Users] Bounce Options In-Reply-To: <1007118397.1524.13.camel@gaspode.localnet> References: <040401c178eb$752e49a0$7b008d0a@sc.slr.com> <20011129100824.A12696@ssc.com> <15366.41687.561263.356123@anthem.wooz.org> <20011129155526.A14551@ssc.com> <1007118397.1524.13.camel@gaspode.localnet> Message-ID: <20011130090120.D20009@ssc.com> On Fri, Nov 30, 2001 at 11:06:36AM +0000, Nigel Metheringham wrote: > On Thu, 2001-11-29 at 23:55, Dan Wilder wrote: > > So what's a reasonable intent for bounce handling? > > > > Here's a sketch. No doubt I misunderstand important points. > > Perhaps others would be kind enough to comment. > > > > Presuming the list is configured for automatic bounce handling > > at all, it would seem reasonable to claim that there are > > circumstances under which bounce handling might unsubscribe or > > disable mail to a subscriber. > > Definitely. In general I (as list admin) want almost zero involvement > here. > > > The sporadic bounce probably shouldn't cause this sort of action. > > So, there should be some forgiveness mechanism in place. > > Yes - I occaisionally bounce stuff from bugtraq because we have a filter > on that bounces executable content (ie outlook virus hacks), but it also > bounces some exploit code :-) > So I sometimes bounce 10% of the messages in a day. > > > Several bounces over a short period of time might reasonably > > be forgiven, or treated as a single bounce. Many situations > > that will cause a bounce involve some misconfiguration which > > the conscientious sysadmin will shamefacedly correct as soon as > > it is brought to his or her attention. A heavily trafficked > > list might not want to unsubscribe even members who cause several > > bounces, providing these fall within a short period of time. > > > > Several bounces over a longer period of time might be cause > > for suspension, even if posts are accepted between. > > > > The existing bounce handling makes some distinction I don't > > understand between "fatal" bounces and "nonfatal" bounces. > > Is this "no such user" versus "host busy", for example? > > SMTP has immediate and retryable errors > > For an announce list - I have a few (similar to mailman-announce) which > have traffic in single digits per month (if that high), the rules may > need to be different - 2 bounces from a user in 5 days is going to be > close to impossible to achieve for example :-) On the other hand, removal after four bounces within two months might work OK for you. Provided there's some way to forgive those who also accepted delivery on, say, three consecutive posts. > Unfortunately its hard to identify correctly delivered messages - so you > cannot easily use a "if a message is delivered correctly, reset the > death counter" approach - Yes. That could be what's behind some of the difficult-to-understand and maybe broken stuff in Bouncer.py. No news would seem to be good news. Provided there's been a post or two during the "no-news" time. An adequate forgiveness mechanism should probably take list traffic into account, but I'll confess I'm having a hard time getting my head around just what would make sense. Everything I think of gets complex too fast. A sign of either an intractable problem or a wrong solution. I can't believe this problem is intractable. > one UK ISP routinely bounces mail to their > users that has not been picked up after 30 days (and their bounce > messages are currently unparsable). Ugh! -- ----------------------------------------------------------------- Dan Wilder Technical Manager & Editor SSC, Inc. P.O. Box 55549 Phone: 206-782-8808 Seattle, WA 98155-0549 URL http://embedded.linuxjournal.com/ ----------------------------------------------------------------- From barry@zope.com Fri Nov 30 19:36:53 2001 From: barry@zope.com (Barry A. Warsaw) Date: Fri, 30 Nov 2001 14:36:53 -0500 Subject: [Mailman-Developers] Re: [Mailman-Users] Bounce Options References: <040401c178eb$752e49a0$7b008d0a@sc.slr.com> <20011129100824.A12696@ssc.com> <15366.41687.561263.356123@anthem.wooz.org> <20011129155526.A14551@ssc.com> <1007118397.1524.13.camel@gaspode.localnet> <20011130090120.D20009@ssc.com> Message-ID: <15367.57301.922260.236155@anthem.wooz.org> Here are some of my recent "shower" thoughts about bounce handling (i.e. what does Mailman do /after/ it detects a bounce?). - We can't do any positive delivery death-resets because in general we're never informed about successful deliveries. Anything that relies on such notices will be too unreliable. - We (can) know exactly two things: 1) how many messages we've sent per period of time 2) how many bounces we've in that same period of time from a specific user - It's probably infeasible to link specific deliveries with specific bounces (we could possibly do it w/VERP, but it'll make things too complicated). - For simplicity, let's treat non-fatal bounces (some temporary outage) the same as fatal bounces (user goes away) - We want to keep the knobs that a list admin can twiddle to a minimum, and make them completely obvious. - Provide a multi-phase disposition to bouncing addresses. I.e. at the first phase we disable them, then we send some disable notifications, then we remove them. - We need to differentiate b/w disabled-by-bounce and disabled-by-choice. So, here's my proposal: Each list has a "bounce start date", which can be the list's creation date if it has one (MM2.1), or some arbitrary time post where we start counting. We already count the number of messages sent through the list via the post-id. We may need to reset this to zero if we're using an arbitrary t0. These two pieces of information give us the number of messages/day average being sent though the list. When a user starts bouncing, we record the start time. We continue to count the number of bounces from this address for some configurable amount of time. List admin knob 1: For how many consecutive days should an address be bouncing before we take action? Proposed default: 14 After that, we look at how many bounces this person had, and the average delivery rate of the list. We can thus calculate roughly the percentage of deliveries that this user bounced. List admin knob 2: Percentage of total deliveries to the list that must bounce for an address, in the above time period, for that address to be automatically disposed of. Proposed default: 50% Thus if we sent out an average of 500 messages to the list, and over the last 14 days we saw 250 bounces from bogus@dom.ain, we would dispose of this address. (Side note: we have to keep track of regular vs. digest deliveries separately). List admin knob 3: Action to take when disposing of a bouncing address. "Disable w/ occasional reminders", "Disable w/ one last notice", "Disable w/o notice", "Remove now w/ one last notice", "Remove now w/o notice". Proposed default: "Disable w/ occasional reminders". All but the first should be obvious. "Disable w/ occasional reminders" means we disable the address from regular delivery, but start sending them occasional reminders about their disabled delivery. The reminder will contain instructions for re-enabling, as well as a note like "You will receive 3 more reminders over the next 21 days unless you take action". List admin knob 4: How many days should there be between reminders to disabled addresses? Proposed default: 7 List admin knob 5: Total number of reminders to send before second order disposition occurs? Proposed default: 4 A person who's membership has been disabled due to bounces must explicitly re-enable delivery via their options page, or via the confirmation cookie contained in the reminder messages. List admin knob 6: Second order disposition for bouncing members who do not re-enable their accounts: "Disable w/ one last notice", "Disable w/o notice", "Remove now w/ one last notice", "Remove now w/o notice". Proposed default: Remove now w/ one last notice. The last knob allows the list administrator to cull all disabled bouncing addresses in one fell swoop. This will be a volatile option that performs an immediate action. Note that only addresses disabled via bouncing will be removed. If a member has been bouncing because of temporary problems, they will probably never reach the threshold for automatic phase 1 disposition, given a high enough percentage or a long enough tracking period. Even if they are, and we send out reminders, they should be able to just go to their options page and re-enable (the options page clearly tells them that their account is disabled). Mailman has a problem currently that we have no idea whether an address is disabled-by-choice or disabled-by-bounce. We need to fix that, but what to do about all the addresses that are currently disabled? We could just treat them all as disabled-by-bounce, sending an occasional reminder, and asking them if they really want to keep their disabled membership, they should go to their options page and re-click on the no-mail option. Anybody who doesn't do this within the second-phase gets removed as per above. Thoughts? -Barry From bob@nleaudio.com Fri Nov 30 22:35:01 2001 From: bob@nleaudio.com (Bob Puff@NLE) Date: Fri, 30 Nov 2001 17:35:01 -0500 Subject: [Mailman-Developers] Re: [Mailman-Users] Bounce Options References: <040401c178eb$752e49a0$7b008d0a@sc.slr.com> <20011129100824.A12696@ssc.com> <15366.41687.561263.356123@anthem.wooz.org> <20011129155526.A14551@ssc.com> <1007118397.1524.13.camel@gaspode.localnet> <20011130090120.D20009@ssc.com> <15367.57301.922260.236155@anthem.wooz.org> Message-ID: <3C080995.373AC64B@nleaudio.com> Barry: Good thoughts. Let me add something: On all my lists, if a person is bouncing, I want them removed, not just set to nomail. Otherwise as you mentioned, the nomail list gets bigger and bigger. AFAIK, the only people that should be on the nomail list are those who have signed up as such. So if you want to do the "I'm about to nuke you, one last chance" thing, I would suggest _another_ bit be used in their settings to identify this. Also update list_members so that you can sort by these fields. (Shameless plug - my modified list_members already lets you sort by nomail, and digest type. Did this patch get merged into 2.08?) I'm not so sure if doing an estimated average of messages sent is the right thing. How about something like this: Each user has three entries: time/date stamp for first bounce, time/date stamp for last bounce, and a bounce counter (16 bits should be fine!) Upon a bounce, do this: 1. Time/date stamp the last_bounce field with the current time/date. 2. Check the first_bounce field to see if it is null. If so, put the current time/date stamp there too, and set the bounce_counter to 0. 3. Increment the bounce counter. (actually not used in this text.) Do nothing else at this point. Now, we know when a regular message goes out, and we also know when a digest goes out. Keep a record of the last x (21?) days' worth of postings (see below). Now! Once a day, set up a cron script to go through each user entry. Do the following: 1. Examine the first_bounce time/date stamp. If null, skip to the next user. 2. Check out post log to see how many days since first_bounce have had messages. Is it less than X days? YES: does last_bounce = the last entry date in the posting log (or today)? YES: we're still bouncing, but haven't hit our cutoff yet. Skip to the next user. NO: NULL out the first_bounce, and go to the next user. We apparently stopped bouncing, so we need to reset. NO: we've hit our age limit. Let's see if he's still bouncing: Does last_bounce = the last entry date in the posting log (or today)? YES: NUKE EM!!! NO: Null out the first_bounce, and go to the next user. Apparently this guy really lucked out, and stopped bouncing the day before he would have been nuked (remember, we are doing this every day). The posting log would only need to have a single entry of a date for each day that a message was sent thru the list, i.e., 11/28/01 11/29/01 11/30/01 etc... This could be updated at the same time the daily_digest is dispatched, or it could be part of the main qrunner system. The key is having an entry here for each day a message is sent out. It is such a small file that you could suck it into memory, and "rotate" it so that it only keeps a history of x+1 entries (say 21). This allows us to catch and properly detect the bounces for the inactive lists as well. Notice that I didn't even use the bounce_counter. You could still test for it, but I think continuous bouncing over x days is a better method to use. Using the above algorithm does have this flaw: if a user bounces one message per day, it will still remove them. But sporatic problems usually don't surface like that. Bob