localmime.tcl
# #
# convert/localmime.tcl version 2.0 #
#####################################
#############################################################################
# #
# This file contains functions to convert a message to MIME format for #
# local MIME-capable mailers. Decodes QP'ed and BASE64'ed Text parts #
# #
# LadyBug 15.12. -94 #
#############################################################################
#
# mime_type {TYPE}
#
# Process various types
#
if {[is_set APPLEOUBLE]} {
unset APPLEDOUBLE
}
proc mime_type {TYPE SUBTYPE HIGHCHARS FILENAME ENC} {
global APPLEDOUBLE
if {[is_set APPLEDOUBLE]} {
putendboundary
unset APPLEDOUBLE
}
case $TYPE in {
TEXT {
if {$HIGHCHARS == 0} {
addheader "Content-Type" \
"text/plain; charset=\"us-ascii\""
addheader "Content-Transfer-Encoding" \
"7bit"
} \
else \
{
if {[knowfromcharset]} {
addheader "Content-Type" \
"text/plain; charset=\"iso-8859-1\""
} \
else \
{
addheader "Content-Type" \
"text/plain; charset=\"unknown-8bit\""
}
addheader "Content-Transfer-Encoding" \
"8bit"
}
}
APPLICATION {
if {[is_set FILENAME]} {
if {$ENC == "UUENCODE"} {
addheader "Content-Type" \
"application/octet-stream; name=\"$FILENAME.uue\""
addheader "Content-Transfer-Encoding" \
"7bit"
} \
else {
addheader "Content-Type" \
"application/octet-stream; name=\"$FILENAME\""
if {$ENC == "BINHEX"} {
addheader "Content-Transfer-Encoding" \
"7bit"
} \
else {
addheader "Content-Transfer-Encoding" \
"BASE64"
if {![is_root]} {
do_code "BASE64"
}
}
}
} \
else \
{
addheader "Content-Type" \
"application/octet-stream"
if {$ENC == "UUENCODE"} {
addheader "Content-Transfer-Encoding" \
"7bit"
} \
else {
if {$ENC == "BINHEX"} {
addheader "Content-Transfer-Encoding"$
"7bit"
} \
else {
addheader "Content-Transfer-Encoding" \
"BASE64"
if {![is_root]} {
do_code "BASE64"
}
}
}
}
}
IMAGE {
case $SUBTYPE in {
GIF {
if {[is_set FILENAME]} {
addheader "Content-Type" \
"Image/GIF"
} \
else {
addheader "Content-Type" \
"Image/GIF; name=\"$FILENAME.gif\""
}
addheader "Content-Transfer-Encoding" \
"BASE64"
if {![is_root]} {
do_code "BASE64"
}
}
JPEG {
if {[is_set FILENAME]} {
addheader "Content-Type" \
"Image/JPEG; name=\"$FILENAME.jpg\""
} \
else {
addheader "Content-Type" \
"Image/JPEG"
}
addheader "Content-Transfer-Encoding" \
"BASE64"
if {![is_root]} {
do_code "BASE64"
}
}
default {
if {[is_set SUBTYPE]} {
addheader "Content-Type" \
"Image/X-$SUBTYPE"
} \
else {
addheader "Content-Type" \
"Application/Octet-Stream"
}
addheader "Content-Transfer-Encoding" \
"BASE64"
if {![is_root]} {
do_code "BASE64"
}
}
}
}
AUDIO {
case $SUBTYPE in {
ULAW {
addheader "Content-Type" \
"Audio/Basic"
addheader "Content-Transfer-Encoding" \
"BASE64"
if {![is_root]} {
do_code "BASE64"
}
}
default {
if {[is_set SUBTYPE]} {
addheader "Content-Type" \
"Audio/X-$SUBTYPE"
} \
else {
addheader "Content-Type" \
"Application/Octet-Stream"
}
addheader "Content-Transfer-Encoding" \
"BASE64"
if {![is_root]} {
do_code "BASE64"
}
}
}
}
BINHEX {
if {[is_set FILENAME] != 0} {
addheader "Content-Type" \
"application/mac-binhex40; name=\"$FILENAME\""
} \
else \
{
addheader "Content-Type" \
"application/mac-binhex40"
}
}
APPLESINGLE {
if {[is_set FILENAME] != 0} {
addheader "Content-Type" \
"application/applefile; name=\"$FILENAME\""
} \
else \
{
addheader "Content-Type" \
"application/applefile"
}
addheader "Content-Transfer-Encoding" \
"BASE64"
if {![is_root]} {
do_code "BASE64"
}
}
APPLEDOUBLE {
insertmessnode
set BOUNDARY [makeboundary]
addheader "Content-Type" \
"multipart/appledouble; boundary=\"$BOUNDARY\""
nextmessnode
addboundary "--$BOUNDARY"
addendboundary "--$BOUNDARY--"
if {[is_set FILENAME] != 0} {
addheader "Content-Type" \
"application/applefile; name=\"$FILENAME\""
} \
else \
{
addheader "Content-Type" \
"application/applefile"
}
addheader "Content-Transfer-Encoding" \
"Base64"
do_code "BASE64"
set APPLEDOUBLE "TRUE"
}
default {
addheader "Content-Type" \
"application/octet-stream; X-Info=\"unknown\""
addheader "Content-Transfer-Encoding" \
"BASE64"
if {![is_root]} {
do_code "BASE64"
}
}
}
}
proc handle_part { TYPE SUB ENC BOUNDARY } {
case $TYPE in {
TEXT {
set NRO [is_multipart]
if { $ENC == "QUOTED-PRINTABLE" || $ENC == "BASE64" } {
do_decode
if {$NRO < 1} {
topmessnode
}
rmheader "Content-Transfer-Encoding"
addheader "Content-Transfer-Encoding" "8BIT"
}
}
default {
}
}
}
if {[set MAINTYPE [getmaintype]] != 0} {
if {$MAINTYPE == "MIME"} {
if {[is_multipart] > 0} {
set MMAIN [gettype]
if { $MMAIN == "MULTIPART" } {
set BOUNDARY [makeboundary]
set A [nextmessnode]
while { $A > 0 } {
set MMAIN [gettype]
set ENCO [getencoding]
set SUB [getsubtype]
if { $MMAIN == "MULTIPART" } {
dotunnel
return
} \
else {
handle_part $MMAIN $SUB $ENCO $BOUNDARY
}
set A [nextmessnode]
}
dosubheaders
topmessnode
addboundary "--$BOUNDARY"
addendboundary "--$BOUNDARY--"
set SUB [getsubtype]
rmheader "Content-Type"
addheader "Content-Type" \
"MULTIPART/$SUB; boundary=\"$BOUNDARY\""
return
}
} \
else {
set BOUNDARY [makeboundary]
nextmessnode
set MMAIN [gettype]
set ENCO [getencoding]
set SUB [getsubtype]
handle_part $MMAIN $SUB $ENCO $BOUNDARY
dosubheaders
return
}
}
}
topmessnode
if {[is_multipart] < 1} {
set MMAIN [gettype]
} \
else \
{
set MMAIN "MULTIPART"
set BOUNDARY [makeboundary]
addboundary "--$BOUNDARY"
addendboundary "--$BOUNDARY--"
dosubheaders
}
while {1 == 1} {
rmspecheader
joinextension
if {[is_root]} {
addheader "MIME-Version" "1.0"
if {$MMAIN == "MULTIPART"} {
addheader "Content-Type" \
"Multipart/Mixed; boundary=\"$BOUNDARY\""
} \
else \
{
nextmessnode
set MMAIN [gettype]
set SUBTYPE [getsubtype]
set HIGHCHARS [gethighchars]
set FILENAME [getfilename]
set ENC [getencoding]
topmessnode
mime_type $MMAIN $SUBTYPE $HIGHCHARS $FILENAME $ENC
}
} \
else \
{
if {[is_set APPLEDOUBLE]} {
if {![hasbody]} {
killbody
}
}
set SUBTYPE [getsubtype]
set MMAIN [gettype]
set HIGHCHARS [gethighchars]
set FILENAME [getfilename]
set ENC [getencoding]
mime_type $MMAIN $SUBTYPE $HIGHCHARS $FILENAME $ENC
}
set A [nextmessnode]
if {$A < 1} {
break
}
}