[Perl] Problema con Net::SMTP y UTF-8
David Moreno Garza
damog en ciencias.unam.mx
Jue Jun 28 20:21:22 CDT 2007
Antonio Galicia wrote:
> Resulta que estoy usando un webmail llamado "openwebmail" en un
> servidor con debian. Todo estaba trabajando hasta hace unos pocos
> días en que todos los correos que salen usando el webmail se mostraban
> "raros". Revisando encontré que por alguna razón ahora todo lo que pasa
> por el módulo SMTP automágicamente lo pasa de latin1 a utf8 pero como
> no se cambia la cabecera termina hecho una porquería:
>
> El código hace algo como esto:
>
> #!/usr/local/bin/perl \-w
>
> use Net::SMTP;
>
> $msg='From antoniogc Thu Jun 14 16:00:24 2007
> From: Antonio Galicia <antoniogc en agc.com.mx>
> To: antonio.galicia en agc.com.mx
> Subject: Prueba 2
> Date: Thu, 14 Jun 2007 16:00:24 -0500
> Message-Id: <20070614210024.M31917>
> X-Mailer: Open WebMail 2.51 20050228
> X-OriginatingIP: 192.168.0.98 (antoniogc)
> MIME-Version: 1.0
> Content-Type: text/plain;
> charset=iso-8859-1
>
> á é í ó ú ñ Á É Ó Ú Ñ
> á é í ó ú ñ Á É Ó Ú Ñ
> á é í ó ú ñ Á É Ó Ú Ñ
> ';
>
> $smtp = Net::SMTP->new('localhost');
>
> $smtp->mail('antoniogc');
> $smtp->to('antoniogc');
>
> $smtp->data();
> $smtp->datasend("$msg\n");
> $smtp->dataend();
>
> $smtp->quit;
>
> cuando recibo el correo aparece lleno de símbolos. Si cambiara el
> "iso-8859-1" por "utf-8" todo se ve bien pero no es el caso de estar
> enviando latin y engañando que es utf8 sobre todo porque dado que es
> un cliente web no tengo control sobre la configuración de quienes
> usan la aplicación.
>
> La pregunta es, ¿cómo puedo hacer que el comportamiento regrese a lo
> que era? Encontré que se puede usar
>
> no utf8;
> o
> use Encode;
>
> y otros más pero no logro hacer que deje de cambiar el encoding.
>
> ¿Sugerencias?
Luego de revisar un poco el fuente de Net::SMTP he visto que el método
datasend() realmente se hereda de Net::Cmd. Éste a su vez, hace ésto,
en dicho método:
if ($doUTF8) {
# encode to individual utf8 bytes if
# $line is a string (in internal UTF-8)
utf8::encode($line) if utf8::is_utf8($line);
}
Al inicio del módulo, se setea $doUTF8:
my $doUTF8 = eval { require utf8 };
...la cual devuelve cierto pues eval regresará 1 al tener el módulo utf8.
Quizás podrías intentar hackeando un poco esa condicional.
Espero te sirva.
--
David Moreno Garza <damog en ciencias.unam.mx> | http://www.damog.net/
Le dije «man, ya estás muy pasado».
Más información sobre la lista de distribución Perl