[Mimedefang] MIME::Entity->attach encoding of an already encoded body/bodyhandle

Rolf E. Sonneveld R.E.Sonneveld at sonnection.nl
Tue Aug 9 06:17:21 EDT 2011


On 8/5/11 12:05 AM, David F. Skoll wrote:
> On Thu, 04 Aug 2011 21:03:45 +0200
> "Rolf E. Sonneveld"<R.E.Sonneveld at sonnection.nl>  wrote:
>
>> OK, I finally managed to get the contents of the bodypart correct by
>> using the as_string method for $entity->bodyhandle during 'filter'
>> phase. Is that the correct/best way to do it, or should I have used
>> another approach?
> You are over-thinking it.  As far as I know:
>
>      $parent_entity->add_part($sub_entity);
>
> should work, where both $parent_entity and $sub_entity are MIME::Entity
> instance.

I tried this and it works, although both the content-type and the 
content-transfer-encoding of the bodypart got mangled: an audio/wav with 
content-transfer-encoding (CTE) 'base64' became text/plain with CTE 
'binary'.

So, I got this behaviour with the following setup:

During filter phase, for that particular bodypart:

$originalbody = $entity->body;
$head = $entity->head;
$encoding = $head->mime_encoding;

Then during filter_end:

$parent_entity = MIME::Entity->build (<parameters for primary html 
bodypart>);
$parent_entity->make_multipart;

$sub_entity = MIME::Entity->build(Data => $originalbody);
$parent_entity->add_part($sub_entity);

Next, I tried to fix that using $entity->head->mime_attr, using the 
original bodypart type and original encoding (base64):

$sub_entity = MIME::Entity->build(Data => $originalbody);
$sub_entity->head->mime_attr("content-transfer-encoding",$encoding);
$parent_entity->add_part($sub_entity);

After this 'fix' the CTE at the receiving side is OK (base64), but the 
contents of the bodypart are (again) base64 encoded (i.e. the original 
base64 bodypart is encoded again with base64, leaving a 'double-encoded' 
part).

So no matter whether I give the CTE during the MIME::Entity->build, or 
whether I add it later on, as soon as I use a CTE of base64 the 
base-64-encoded-bodypart is encoded again with base64. And if I don't 
use an encoding, I get text/plain with a CTE of 'binary'.

So the only solution which seems to work for me is to first decode the 
bodypart (with the bodyhandle->as_string approach) and then have it 
encoded again (during the build or thereafter during the fixup of the 
encoding).

If I'm over-thinking it, some working sample code (without the 
bodyhandle->as_string 'hack') is very much appreciated.

Thanks,
/rolf



More information about the MIMEDefang mailing list