[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