[Mailman-Developers] Re: [Mailman-Users] Inlining MIME attachments on Mailman web archives

James Strickland James Strickland <james@perforce.com>
Thu, 11 Mar 1999 10:52:47 -0800 (PST)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

--0-872916835-921175844=:27847
Content-Type: TEXT/PLAIN; CHARSET=US-ASCII
Content-ID: <Pine.BSI.3.96.990311101103.27847E@computer.perforce.com>

On 11 Mar 1999, Michael Alan Dorman wrote:
> Unfortunately, a discussion from a month back reveals that pipermail
> doesn't have the capability, and no one has at present stepped up to
> bat to implement it.  There was some talk of making it easier to use
> other archiving tools (like hypermail or mhonarc), but I don't know if
> this is going to go forward.
> 
> Which is unfortunate since as far as I can tell, it's the one wart on
> an otherwise stunningly good program.


I'd "step up to the bat" if only I had more time.  I'm attaching something
which reads a message on stdin, prints out the header and (for demo
purposes) some decoded stuff from the header, then proceeds to decode the
message, storing attachments (if any) as separate files.  Note that it
doesn't handle attachments recursively (it should - there are some mailers
which send multipart/alternative parts, so the only text/plain part is
buried two levels down).  It also doesn't handle broken mailers like elm
which send a Content-type of "text"!  Anyways, the main message has the
first plain text part, plus references to the attachments.

btw: as a stopgap measure you can simply have a link to a script which
would print out
Content-type: message/rfc822

<email message verbatim>

Netscape (and maybe other browsers) knows what to do with a Content-type: 
message/rfc822; it handles displaying attachments and parsing the header
and everything.  The downside, of course, is that you can't add anything
else like links to the next message.


Hopefully this should serve as a good starting point.  One of the great
things about Python is that it comes standard with all these wonderful
libraries!

--
James Strickland
Perforce Software

--0-872916835-921175844=:27847
Content-Type: TEXT/PLAIN; CHARSET=US-ASCII; NAME="samplemimedecoder.py"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.BSI.3.96.990311105059.3474A@computer.perforce.com>
Content-Description: 

IyEvdXNyL2xvY2FsL2Jpbi9weXRob24NCiMgUmVhZCBtZXNzYWdlIGZyb20g
c3RkaW4sIGRlY29kZSBNSU1FIGF0dGFjaG1lbnRzIChpZiBhbnkpLCB3cml0
ZSByZXN1bHQNCiMgYXMgbiBwYXJ0cywgbj49MQ0KIyoqKioqKioqKioqKioq
KnlldCB0byBkbzogcmVjb2duaXplIHV1ZW5jb2RlIGluIGJvZHkgb2YgbWVz
c2FnZS4NCiMqKioqKnNpbXBseSByZWNvZ25pemUgIl5iZWdpbiBbMC03XXsz
fSAiIGFuZCBzcGl0IG91dCB0byBmaWxlIHVudGlsICJeZW5kIg0KIyoqKioq
dGhlbiBydW4gdXUuZGVjb2RlKCkNCg0KaW1wb3J0IHN5cywgb3MsIG1pbWV0
b29scywgbXVsdGlmaWxlDQpkZXN0X2Rpcj0nL3RtcCcgIyoqKmZvciB0ZXN0
aW5nDQoNCg0KZGVmIGNvcHkoaW5wdXQsb3V0cHV0LHByZXBlbmQ9JycpOg0K
ICAnJydDb3B5IGlucHV0IHRvIG91dHB1dCB1c2luZyByZWFkbGluZSgpLCBv
cHRpb25hbGx5IHByZXBlbmRpbmcgYSBzdHJpbmcNCiAgdG8gZWFjaCBsaW5l
LiAgTm90ZSB0aGF0IG11bHRpZmlsZSByZXF1aXJlcyB1c2luZyByZWFkbGlu
ZSgpIScnJw0KDQogIHdoaWxlIDE6DQogICAgbGluZSA9IGlucHV0LnJlYWRs
aW5lKCkNCiAgICBpZiBub3QgbGluZTogYnJlYWsNCiAgICBvdXRwdXQud3Jp
dGUocHJlcGVuZCtsaW5lKQ0KDQoNCmRlZiBzdG9yZV9tZXNzYWdlKCk6DQog
IA0KICAjIGluaXRpYWxpemUgaW5wdXQgKHN0ZGluKSBhbmQgb3V0cHV0IChm
b3Igbm93IHN0ZG91dCkNCiAgbWFpbm91dHB1dCA9IHN5cy5zdGRvdXQNCiAg
aW5wdXQgID0gbXVsdGlmaWxlLk11bHRpRmlsZShzeXMuc3RkaW4pDQogIG1h
aW4gICA9IG1pbWV0b29scy5NZXNzYWdlKGlucHV0LDApICMgcmVhZHMgdGhl
IG1haWwgaGVhZGVyDQogIA0KIyAgIyBwcmludCBvdXQgdGhlIG9yaWdpbmFs
IGhlYWRlciBsaW5lcyB2ZXJiYXRpbQ0KIyAgZm9yIGxpbmUgaW4gbWFpbi5o
ZWFkZXJzOg0KIyAgICBwcmludCBsaW5lICMgZWFjaCBsaW5lIGlzIGFscmVh
ZHkgdGVybWluYXRlZCB3aXRoIFxuDQoNCiAgIyBwcmludCBvdXQgaGVhZGVy
DQogIGZvciBmaWVsZCBpbiBtYWluLmtleXMoKToNCiAgICBwcmludCAnJXM6
ICVzJyAlIChmaWVsZCxtYWluW2ZpZWxkXSkNCg0KICAjIC0gZGVjb2RlZCBu
YW1lIGFuZCBlbWFpbCBhZGRyZXNzDQogIG5hbWUsZW1haWwgPSBtYWluLmdl
dGFkZHIoJ2Zyb20nKQ0KICBwcmludCAnTmFtZTogJXNcbicgJSBuYW1lDQog
IHByaW50ICdFbWFpbDogJXNcbicgJSBlbWFpbA0KICANCiAgIyAtIGRlY29k
ZWQgdGltZXN0YW1wIC0+IHRpbWV6b25lIGFuZCBVVEMgdGltZXN0YW1wDQog
IGRhdGVwbHVzdHogPSBtYWluLmdldGRhdGVfdHooJ2RhdGUnKQ0KDQogIGlm
IGRhdGVwbHVzdHo6ICMgdmFsaWQgZGF0ZSBwYXJzZWQNCiAgICB0em9mZnNl
dCA9IGRhdGVwbHVzdHpbLTFdDQogICAgaWYgbm90IHR6b2Zmc2V0OiB0em9m
ZnNldD0wDQogICAgaW1wb3J0IHRpbWUsIHJmYzgyMiAjIGp1c3QgdG8gZG8g
dGhlIGNvbnZlcnNpb24gdG8gVVRDDQogICAgc2Vjc3NpbmNlMTk3MHV0YyA9
IHJmYzgyMi5ta3RpbWVfdHooZGF0ZXBsdXN0eikNCiAgICB1dGMgPSB0aW1l
LmdtdGltZShzZWNzc2luY2UxOTcwdXRjKQ0KICAgIHByaW50ICd0em9mZnNl
dDogJWRcbicgJSB0em9mZnNldCAjIGFkZCB0byBVVEMgdG8gZ2V0IGxvY2Fs
IGZvciBzZW5kZXINCiAgICBwcmludCAndXRjOiAlMDRkLyUwMmQvJTAyZCAl
MDJkOiUwMmQ6JTAyZFxuJyAlIHV0Y1s6Nl0NCiAgZWxzZToNCiAgICBwcmlu
dCAnSW52YWxpZCBkYXRlIGZvcm1hdCEnDQoNCg0KICAjIERlYWwgd2l0aCBN
SU1FIGVuY29kaW5nLCBpZiBhcHBsaWNhYmxlLg0KICAjIFJGQzIwNDYgc2F5
cyAnVGhlIENvbnRlbnQtVHlwZSBmaWVsZCBmb3IgbXVsdGlwYXJ0IGVudGl0
aWVzDQogICMgcmVxdWlyZXMgb25lIHBhcmFtZXRlciwgImJvdW5kYXJ5Ii4n
ICBJIGRvbid0IGJvdGhlciB0byBjaGVjaw0KICAjIHRoYXQgdGhlIENvbnRl
bnQtVHlwZSBtYXRjaGVzLCBiZWNhdXNlIHRoZSBvYmplY3RpdmUgaGVyZSBp
cw0KICAjIHRvIHN0b3JlIHRoZSB0aGluZywgbm90IHRvIGNvbXBsYWluIGFi
b3V0IGJyb2tlbiBtYWlsZXJzLg0KICANCiAgYXR0YWNobWVudHMgPSBbXQ0K
ICBib3VuZGFyeSA9IG1haW4uZ2V0cGFyYW0oJ2JvdW5kYXJ5JykNCiAgDQog
IGlmIG5vdCBib3VuZGFyeTogIyBzaW5nbGUgcGFydCBtZXNzYWdlDQogIA0K
ICAgIGNvcHkoaW5wdXQsbWFpbm91dHB1dCwnXHQnKTsNCiAgDQogIGVsc2U6
ICMgbXVsdGlwYXJ0IG1lc3NhZ2UNCiAgDQogICAgIyBtYWtlIGEgZGlyZWN0
b3J5IHRvIHN0b3JlIHRoZSBwYXJ0cw0KICAgIG1lc3NhZ2VfbnVtYmVyID0g
NDIgIyoqKiphc3NpZ24gYSB1bmlxdWUgaWRlbnRpZmllcg0KICAgIHRyeTog
b3MubWtkaXIoJyVzLyVkJyAlIChkZXN0X2RpcixtZXNzYWdlX251bWJlcikp
DQogICAgZXhjZXB0OiBwYXNzICMgd2UgZG9uJ3QgY2FyZSBpZiBpdCdzIGFs
cmVhZHkgdGhlcmUNCg0KICAgICMgc2tpcCB0byB0aGUgc3RhcnQgb2YgdGhl
IGZpcnN0IHBhcnQNCiAgICBpbnB1dC5wdXNoKGJvdW5kYXJ5KQ0KICAgIHdo
aWxlIGlucHV0LnJlYWRsaW5lKCk6IHBhc3MgIyB0aHJvdyBhd2F5IGxpbmVz
IGJlZm9yZSBmaXJzdCBib3VuZGFyeSBsaW5lDQogICAgaW5wdXQubmV4dCgp
ICMgc2tpcCBvdmVyIGJvdW5kYXJ5DQogIA0KICAgIHBhcnQgPSAxDQogICAg
Zm91bmRwbGFpbnRleHQ9MA0KICANCiAgICB3aGlsZSAxOg0KICAgICAgIyBy
ZWFkIGhlYWRlciBmb3IgdGhpcyBwYXJ0DQogICAgICBzdWJtID0gbWltZXRv
b2xzLk1lc3NhZ2UoaW5wdXQsMCkNCiAgICAgIHR5cGUgPSBzdWJtLmdldHR5
cGUoKQ0KDQogICAgICAjIElmIGl0J3MgdGhlIGZpcnN0IHBsYWluIHRleHQg
cGFydCwgc3RvcmUgaXQgYXMgcGFydCBvZiB0aGUgZGVmYXVsdCBtc2cNCiAg
ICAgICMgKHNvIHRoYXQgaXQncyBpbmRleGVkIGFuZCBzZWxmLWNvbnRhaW5l
ZCkNCiAgICAgICMgT3RoZXJ3aXNlIGRlY29kZSB0aGUgcGFydCBhbmQgc3Rv
cmUgaXQgaW4gYW4gYXBwcm9wcmlhdGVseSBuYW1lZCBmaWxlDQogICAgICBp
ZiAobm90IGZvdW5kcGxhaW50ZXh0KSBhbmQgdHlwZSA9PSAndGV4dC9wbGFp
bic6DQogICAgICAgIGZvdW5kcGxhaW50ZXh0PTENCiAgICAgICAgY29weShp
bnB1dCxtYWlub3V0cHV0LCdcdCcpDQogICAgICBlbHNlOg0KICAgICAgICBu
YW1lID0gc3VibS5nZXRwYXJhbSgnbmFtZScpDQogICAgICAgIGlmIG5vdCBu
YW1lOiBuYW1lID0gInBhcnQiK3JlcHIocGFydCkNCiAgICAgICAgbmFtZSA9
ICclZC8lcycgJSAobWVzc2FnZV9udW1iZXIsbmFtZSkNCiAgICAgICAgYXR0
YWNobWVudHMuYXBwZW5kKCAodHlwZSxuYW1lKSApDQogICAgICAgIG91dHB1
dCA9IG9wZW4oZGVzdF9kaXIrJy8nK25hbWUsJ3cnKQ0KICAgICAgICBlbmNv
ZGluZyA9IHN1Ym0uZ2V0ZW5jb2RpbmcoKQ0KICAgICAgICBpZiBlbmNvZGlu
ZyA9PSAnYmFzZTY0JyBvciBlbmNvZGluZyA9PSAncXVvdGVkLXByaW50YWJs
ZScgb3IgZW5jb2RpbmcgPT0gJ3V1ZW5jb2RlJzoNCiAgICAgICAgICBtaW1l
dG9vbHMuZGVjb2RlKGlucHV0LG91dHB1dCxlbmNvZGluZykNCiAgICAgICAg
ZWxzZTogIyBjb3B5IGlucHV0IHRvIG91dHB1dCB1c2luZyByZWFkbGluZSgp
IC1tdWx0aWZpbGUgcmVxdWlyZXMgcmVhZGxpbmUoKSENCiAgICAgICAgICBj
b3B5KGlucHV0LG91dHB1dCkNCiAgDQogICAgICAjIGdvIHRvIHRoZSBuZXh0
IHBhcnQNCiAgICAgIGlmIG5vdCBpbnB1dC5uZXh0KCk6IGJyZWFrDQogICAg
ICBwYXJ0ID0gcGFydCArIDENCiAgDQogICAgIyB3cml0ZSBvdXQgaW5mb3Jt
YXRpb24gZ2F0aGVyZWQgYWJvdXQgdGhlIGF0dGFjaG1lbnRzDQogICAgaWYg
YXR0YWNobWVudHM6IG1haW5vdXRwdXQud3JpdGUoJ0F0dGFjaG1lbnRzOlxu
JykNCiAgICBmb3IgdHlwZSxuYW1lIGluIGF0dGFjaG1lbnRzOg0KICAgICAg
bWFpbm91dHB1dC53cml0ZSgnXHQlczolc1xuJyAlICh0eXBlLG5hbWUpKQ0K
ICBtYWlub3V0cHV0LmNsb3NlKCkNCg0KDQojIEV4ZWN1dGlvbiBzdGFydHMg
aGVyZQ0KdHJ5Og0KICBzdG9yZV9tZXNzYWdlKCkNCmV4Y2VwdDoNCiAgIyoq
KipuZWVkIHRvIGltcHJvdmUgdGhpcywgb2J2aW91c2x5Li4uDQogIHByaW50
ICdzb21ldGhpbmcgd2VudCBob3JyaWJseSB3cm9uZyAtIHNlbmQgZW1haWwg
dG8gamFtZXMgYml0Y2hpbmcgYWJvdXQgaXQnDQo=
--0-872916835-921175844=:27847--