From sobek@irit.fr Thu Apr 6 23:47:51 2000 Date: Thu, 6 Apr 2000 13:17:03 +0200 (MET DST) From: Ralph SOBEK To: Martin Mokrejs Cc: procmail@informatik.rwth-aachen.de, jari.aalto@poboxes.com Subject: Re: Decoding MIME Update Hello Martin, Glad to hear that you have tried it. Yes I have made some improvements. It did not handle case nor muliple ISO-8859-1 fileds in Subject and From headers. I even allow for ISO8859-1, since I get a lot of those, broken - I suppose, headers. Does anyone know if back-quoted scripts need to be waited upon, or is it handled internally by procmail. The only other problem is non-standard MIME-encodings, where there is only ONE multipart section listed as text, but it itself is broken down. Mimencode barfs on this. I have not fixed that. Suggestions are welcome. Lastest source attached at end. --Ralph [ Part 2: "pm-mime-decode.rc" ] # @(#) pm-jamime-decode.rc -- decode MIME body contents; quoted-printable, base64 # @(#) $Id: pm-jamime-decode.rc,v 1.2 1998/03/30 09:49:09 jaalto Exp $ # # File id # # .Copyright (C) 1998 Jari Aalto # .$Maintainer: Jari Aalto $ # .$Created: 1998-01 $ # .$Keywords: procmail recipe $ # # This code is free software in terms of GNU Gen. pub. Lic. v2 or later # You can get newest version by sending email to maintainer with # subject "send " # # Documentation # # The original father of the decoding scheme used here was # presented by Peter Galbraith in # procmail mailing list somewhere at the end of 1997. # # This includerc supposes that the header has MIME header # Content-Type: text/plain and performs qp or base64 decoding # on the whole message. Note, that if you receive messages that # have many mime attachements, then this recipe is not suitable # for it. # # Procmail is not designed to handle mime attachements and this # recipe only applies to whole _body_. # # Required settings # # PMSRC must point to source direcry of procmail code. This subroutine # will include # # o pm-javar.rc # # Call arguments (variables to set before calling) # # (none) # # Return values # # (none) # # Examples # # Instead of testing the existense of text/plain in the body, # you can force decoding by settings JA_MIME_DECODE_REGEXP to # ".*". # # RC_MIME_DECODE = $PMSRC/pm-jamime-decode.rc # # :0 # * condition # { JA_MIME_DECODE_REGEXP = ".*" } # # INCLUDERC = $RC_MIME_DECODE # call subroutine. # # # Change Log # 00/03/24 - RpS: Adapted from Jari Alto's pm-jamime-decode, handles # encoded Subject and From headers, as well as multipart with only ONE # part. # 00/03/30 - RpS: Allowed for multiple =?iso-8859-[1-9]?Q?.*?= # fields. Also eliminated QP embedded CRs and LFs in Subject and From # headers. # .................................................... &initialising ... dummy = "init: pm-jamime-decode.rc Reading variable definitions if needed" SHELL=/bin/sh # :0 # * ! WSPC ?? ( ) # { INCLUDERC = $PMSRC/pm-javar.rc } :0 * ! MIME_VER ?? [0-9] { INCLUDERC = $PMSRC/pm-jamime.rc } # .......................................................... &public ... # User configurable sections JA_MIME_DECODE_REGEXP = ${JA_MIME_DECODE_REGEXP:-\ "^Content-Type: *text/(plain|enriched)"} # ........................................................... &do-it ... # Run conversion if it was quoted printable. # Also reflect correct MIME header dummy = "pm-jamime-decode.rc: handle quoted printable" :0 D * ^Subject:\/.*=\?iso-?8859.*\?=.* { SUBJECT = $MATCH clean_Subject = `echo "$SUBJECT" | \ sed -e 's/=?iso-\{0,1\}8859-[1-9]?Q?\([^?]*\)?=/\1/g' \ -e 's/=0D//g' -e 's/=0A//g' | \ $MIME_BIN_QP ` SUBJECT_DO_IT = "yes" } :0 ED * ^Subject:\/.*=\?ISO-?8859.*\?=.* { SUBJECT = $MATCH clean_Subject = `echo "$SUBJECT" | \ sed -e 's/=?ISO-\{0,1\}8859-[1-9]?Q?\([^?]*\)?=/\1/g' \ -e 's/=0D//g' -e 's/=0A//g' | \ $MIME_BIN_QP ` SUBJECT_DO_IT = "yes" } :0 D * ^From:\/.*=\?iso-?8859.*\?=.* { FROM = $MATCH clean_From = `echo "$FROM" | \ sed -e 's/=?iso-\{0,1\}8859-[1-9]?Q?\([^?]*\)?=/\1/g' \ -e 's/=0D//g' -e 's/=0A//g' | \ $MIME_BIN_QP ` FROM_DO_IT = "yes" } :0 ED * ^From:\/.*=\?ISO-?8859.*\?=.* { FROM = $MATCH clean_From = `echo "$FROM" | \ sed -e 's/=?ISO-\{0,1\}8859-[1-9]?Q?\([^?]*\)?=/\1/g' \ -e 's/=0D//g' -e 's/=0A//g' | \ $MIME_BIN_QP ` FROM_DO_IT = "yes" } # Prevent calling sh -c here. This speeds up procmail # jaMimeDecodeShellmetas = $SHELLMETAS SHELLMETAS :0 fhw * SUBJECT_DO_IT ?? ^^yes^^ * FROM_DO_IT ?? ^^yes^^ | $FORMAIL \ -i "Subject:$clean_Subject" \ -i "From:$clean_From" \ -I "X-Mime-Header-Decoded: $MIME_TYPE" :0E fhw * SUBJECT_DO_IT ?? ^^yes^^ | $FORMAIL \ -i "Subject:$clean_Subject" \ -I "X-Mime-Header-Decoded: $MIME_TYPE" :0E fhw * FROM_DO_IT ?? ^^yes^^ | $FORMAIL \ -i "From:$clean_From" \ -I "X-Mime-Header-Decoded: $MIME_TYPE" :0 fbw i * MIME_BOUNDARY_COUNT ?? ^^2^^ | $AWK \ ' BEGIN {cont=0} { \ if (cont > 0) {cont=0; next} \ if (match($0, BOUNDARY) > 0 ) { next } \ if ( match($0, "^Content-") > 0 ) { \ if (match($0, ";$") > 0) {cont=1} \ next} \ print; \ } \ ' BOUNDARY="$MIME_BOUNDARY" \ :0 afbw | $MIME_BIN_QP :0 afhw | $FORMAIL \ -I "Content-Type: text/plain" \ -I "Mime-Version: $MIME_VER" \ -I "X-Mime-Type-Decoded: $MIME_TYPE" :0 *$ $JA_MIME_DECODE_REGEXP { :0 fbw * ^Content-Transfer-Encoding: *quoted-printable | $MIME_BIN_QP :0 Afhw | $FORMAIL -I "Content-Transfer-Encoding: 8bit" :0 fbw * ^Content-Transfer-Encoding: *base64 | $MIME_BIN_64 :0 Afhw | $FORMAIL -I "Content-Transfer-Encoding: 8bit" } # $MIME_BIN_QP does not handle separate MIME sections #:0 EB #*$ $JA_MIME_DECODE_REGEXP #{ # :0 fbw # * MIME_B_QP ?? yes # * B ?? ^Content-Transfer-Encoding: *quoted-printable # | sed -e "'""\\|$JA_MIME_DECODE_REGEXP|,\\|$MIME_BOUNDARY|p""'" # :0 Afbw # | $MIME_BIN_QP # :0 Afbw # | $FORMAIL -I "Content-Transfer-Encoding: 8bit" # :0 fbw # * B ?? ^Content-Transfer-Encoding: *base64 # | $MIME_BIN_64 # :0 Afbw # | $FORMAIL -I "Content-Transfer-Encoding: 8bit" #} SHELLMETAS = $jaMimeDecodeShellmetas dummy = "subroutine: pm-jamime-decode.rc end." #:0: #test # End of file pm-jamime-decode.rc