I’m using Mime::Lite to create and send E-Mails. Now I need to add support for S/Mime-encryption and finally could encrypt my E-Mail (the only Perllib I could install seems broken, so I’m using a systemcall and openssl smime), but when I try to create a mime-object with it, the E-Mail will be broken as soon as I set the Content-Transfer-Encoding to base64. To make it even more curious, it happens only if I set it via $myMessage->attr. If I’m using the constructor ->new everything is fine, besides a little warning which I suppress by using MIME::Lite->quiet(1);
Is it a bug or my fault? Here are the two ways how I create the mime-object.
-
Setting the Content-Transfer-Encoding via construtor and suppress the warning:
MIME::Lite->quiet(1); my $msgEncr = MIME::Lite->new(From =>'me@myhost.com', To => 'you@yourhost.com', Subject => 'SMIME Test', Data => $myEncryptedMessage, 'Content-Transfer-Encoding' => 'base64'); $msgEncr->attr('Content-Disposition' => 'attachment'); $msgEncr->attr('Content-Disposition.filename' => 'smime.p7m'); $msgEncr->attr('Content-Type' => 'application/x-pkcs7-mime'); $msgEncr->attr('Content-Type.smime-type' => 'enveloped-data'); $msgEncr->attr('Content-Type.name' => 'smime.p7m'); $msgEncr->send; MIME::Lite->quiet(0); -
Setting the Content-Transfer-Encoding via
$myMessage->attrwhich breaks the encrypted Data, but won’t cause a warning:my $msgEncr = MIME::Lite->new(From => 'me@myhost.com', To => 'you@yourhost.com', Subject => 'SMIME Test', Data => $myEncryptedMessage); $msgEncr->attr('Content-Disposition' => 'attachment'); $msgEncr->attr('Content-Disposition.filename' => 'smime.p7m'); $msgEncr->attr('Content-Type' => 'application/x-pkcs7-mime'); $msgEncr->attr('Content-Type.smime-type' => 'enveloped-data'); $msgEncr->attr('Content-Type.name' => 'smime.p7m'); $msgEncr->attr('Content-Transfer-Encoding' => 'base64'); $msgEncr->send;
I just don’t get why my message is broken when I’m using the attribute-setter. Thanks in advance for your help!
Besides that i’m unable to attach any file to this E-Mail without breaking the encrypted message again.
As I said in one comment the difference in setting the encoding in the construtor of the mimeobject or with the
->attr-Setter is, that the construtor just sets the encoding in the mimeheader. By using the->attr-Setter mime encodes the data with base64.So in my case, my previously generated mimeobject – which is base64-encoded and with s/mime encrypted – read from a file needs to set the encoding in the construtor (and suppress the warning) so no more encoding will be done by mime. Otherwise mime will encode the data again and therefore break the encryption and the email itself.
I finally got attachments to work. To achieve this I create a normal multipart/mixed mimeobject, print this object into a normal file, encrypt this file with openssl smime, read this whole file (except the 6 headerlines) into a variable and use this as the datainput. Additionally I set the Content-Transfer-Encoding to base64 using the construtor (so no encoding is done to my data).
I hope this will help someone else then me 😉