jueves, 23 de febrero de 2012

Mensajes con basura en el texto

Sintomas
Algunos destinatarios no ven correctamente el texto de mensajes de correo compuestos mediante la clase system.net.mail de .net Framework.
Concretamente los carácteres no ASCII como vocales acentuadas o ñ se transforman en varios carácteres extraños.
Para complicarlo mas unos destinatarios lo ven bien y otros no. Depende del servidor de correo pero tambien del cliente empleado.
Por ejemplo:
  • En la versión web de Gmail se vé bien, pero no en Outlooks cuando lo descargas por IMAP .
  • El mismo Outlook ve bien el mensaje si lo descarga de un servidor Exchange.
Es muy curioso, yo tengo dos cuentas en mi perfil de Outlook, una conectada a Exchange la otra a Gmail por IMAP. Si adjunto el mensaje incorrecto a otro mensaje y me lo mando a la cuenta Exchange, cuando abro el adjunto lo veo perfectamente.
Para colmo de males, en ocasiones el problema desaparece si no incluyes el logotipo en la firma del mensaje.

Solución:
Obviamente es un problema de codificación, el texto esta en UTF-8 pero el cliente de correo cree que es Windows 1252.
La documentación del framework habla de codificaciones por defecto UTF-8 y base64 pero no estoy seguro de que lo haga, o de que le hagan caso.
Mi consejo es establecer la codificación en todos las propiedades y metodos que lo permitan:
El mensaje:
* mailmessage.Bodyencoding
* mailmessage.SubjetEncoding
* mailmessage.HeadersEncoding
Los adjuntos (el logotipo es un adjunto referenciado en el HTML):
* Attachment.transferEncoding

Yo también lo incluyo en los headers del HTML del mailmessage.bodyHTML también deberiamos incluir un metatag
content="text/html;charset=utf-8" http-equiv="content-type"
Y por fin, y muy importante, hay que especificar la codificación cuando creamos vistas alternativas generadas desde un string:
dim av=alternateview.createAlternateViewFromString(txt, system.text.encoding.utf8, "text/html")
msg.alternateviews.add (av)
Finalmente, si leemos el cuerpo de un archivo no hay que olvidarse de que esté haya sido guardado en UTF8 y que haya sido leido usando UTF8
Actualmente con todas estas medidas me funciona, pero creo que encontraré algún problema más.

No hay comentarios: