Here's an example program:
# A more complete coding might pass in a callback, to
# generalize puts, or another for exceptions, or
# "depth-gauge" variables to operationalize dependences
# on where one is in the recursion, or ...
package require mime
# The mime package doesn't know about uuencodings.
# Take care of this later.
proc is_uuencoded body {
return 0
}
proc print_text_part message {
if [catch {mime::initialize -string $message} token] {
puts stderr $token
# Do some error-handling here.
exit 1
}
print_text_part_t $token
}
proc print_text_part_t token {
set content [mime::getproperty $token content]
puts "Looking at $content."
switch $content {
application/x-wordperfect6.1 -
application/ppt -
application/pdf -
image/jpeg -
application/x-gzip -
application/msword -
application/octet-stream -
application/x-tar -
application/msword -
application/x-wordperfect6.1 -
application/x-msdownload -
application/x-tar -
application/zip {
# Is there anything printable here?
}
text/html {
# How do you want to handle this?
}
message/rfc822 -
TEXT/PLAIN -
text/rfc822-headers -
text/enriched -
text/plain {
set body [mime::getbody $token]
if [is_uuencoded $body] {
}
puts --------------------------------------\n$body
}
message/delivery-status -
multipart/digest -
multipart/related -
multipart/report -
multipart/alternative -
multipart/mixed {
foreach part [mime::getproperty $token parts] {
print_text_part_t $part
}
}
default {
puts stderr "Whoops! What is a '$content'?"
}
}
}
print_text_part $message
$message might have a value such as
From [email protected] Thu Jan 31 18:30:59 2002
Date: Thu, 31 Jan 2002 17:53:32 -0600 (CST)
From: Cameron Laird <[email protected]>
To: [email protected]
Subject: This is the subject line.
Message-ID: <[email protected]>
MIME-Version: 1.0
Content-Type: MULTIPART/MIXED; BOUNDARY="0-830506451-1012521212=:60621"
Status: R
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 [email protected] for more info.
--0-830506451-1012521212=:60621
Content-Type: TEXT/PLAIN; charset=US-ASCII
Here's content.
--0-830506451-1012521212=:60621
Content-Type: TEXT/HTML; charset=US-ASCII; name="something.html"
Content-Transfer-Encoding: BASE64
Content-ID: <[email protected]>
Content-Description:
Content-Disposition: attachment; filename="something-2TMP.html"
PGh0bWw+DQo8aGVhZD4NCjxNRVRBIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlw
...
CkxvY2FsIGFkZGl0aW9uczoNCjwvcHJlPg0KPC9ib2R5Pg0KPC9odG1sPg==
--0-830506451-1012521212=:60621
Content-Type: APPLICATION/ZIP; name="rewrite.zip"
Content-Transfer-Encoding: BASE64
Content-ID: <[email protected]>
Content-Description: What is this?
Content-Disposition: attachment; filename="rewrite.zip"
UEsDBBQAAAAIAPSOPyzW4uC1uyIAAAdXAAAUABUAQ0wwMjAyLWVkaXRlZEJE
...
AAAAAAEAAQBPAAAAAiMAAAAA
--0-830506451-1012521212=:60621--I am trying to write a tclapp that will accept a list of files as arguments and save all the attachments. I have just it just about complete, but I ran into a snag when it came to reading and saving the attachment data. My question is, how do you save the attachments using the mime package from tcllib? I've tried mime::getbody, but I get an error that the attachment is not a leaf.
Figured it out. Here is my solution. Mime File Attachment Extractor