email::mime's horrible design problem

…or at least the problem that came to light recently.

In a MIME message, you can use an “encoded-word” in the header to represent text that isn’t 7-bit ASCII. For example:

From: =?utf-8?q?Ricardo_Juli=C3=ADn_Besteiro_Signes?= <rjbs@example.com>

Email::MIME’s header method helpfully decodes these into character strings, so that when you say:

$email->header('from');

…you get Julián in there, not some MIME crap.

The header method is used to stringify the message. This means that when you load in a safe, 7-bit MIME message and then stringify it, you get an 8-bit (wide-character-having) string that can’t be safely sent over plain old SMTP.

Maybe this wasn’t a problem back when Email:: modules were more brazen about assuming that each others’ internals would never change, and only became a problem when I started making them rely on methods rather than guts.

Either way, this is a pretty big problem. It means you can’t reliably do:

Email::Send->send($email_mime->as_string);

Oops.

Written on August 28, 2008
email   perl   programming