Hay que entender en qué consiste un correo electrónico.
Un correo electrónico es un flujo de texto. Ese texto es un conjunto de líneas. Hay dos partes fundamentales: la cabeza y el cuerpo, que se separan con una línea en blanco. De la cabecera, es básicamente un conjunto de marcas y sus valores. Por ejemplo:
Subject: El asunto
Es en el cuerpo en donde debemos centrarnos.
Por defecto, todo el contenido es puro texto. Durante casi dos décadas se ha enviado y recibido correo electrónico de esa manera: puro texto. Y la forma de representarlo en pantalla, es, naturalmente, mediante una fuente de letras monoespaciada, porque SE SUPONÍA que el texto podría tener algún esquema, gráfico, fórmulas, o tablas, hechas con caracteres, por lo que era vital mantener esa igualdad de ancho en todos los caracteres:
Por ejemplo:
Using text Syntax Highlighting
_ _
( \---/ )
) . . (
________________________,--._(___Y___)_,--._______________________ hjw
`--' `--'
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
(extraído de
http://rony.4y.com.cn/ascii/ascii2/bears.html)
Pero... de repente ocurrió algo terrible: por una parte, la aparición de clientes de correo como Outlook Express; y por otra, la de los clientes de correo en web, como los de Yahoo!, Hotmail, etc. Y en estos clientes, el tipo de letra por defecto ya no era el monoespaciado.
Así que a partir de ese momento, las pequeñas obras de arte que teníamos en nuestras firmas (por ejemplo), ahora se veían horribles:
Jesus Ca Alvion _/_/ _/_/_/ _/_/_/
[email protected] - http://www.jca.es/ _/_/ _/_/ _/_/ _/_/ _/_/
jabber / xmpp:
[email protected] _/_/ _/_/ _/_/_/_/_/
. _/_/ _/_/ _/_/ _/_/ _/_/
"Things are not so easy" _/_/ _/_/ _/_/ _/_/ _/_/ _/_/
"My name is Dump, Core Dump" _/_/_/ _/_/_/ _/_/ _/_/
"El amor es poner tu felicidad en la felicidad de otro" - Leibniz
en lugar de
Using text Syntax Highlighting
Jesus Ca Alvion _/_/ _/_/_/ _/_/_/
[email protected] - http://www.jca.es/ _/_/ _/_/ _/_/ _/_/ _/_/
jabber / xmpp:
[email protected] _/_/ _/_/ _/_/_/_/_/
. _/_/ _/_/ _/_/ _/_/ _/_/
"Things are not so easy" _/_/ _/_/ _/_/ _/_/ _/_/ _/_/
"My name is Dump, Core Dump" _/_/_/ _/_/_/ _/_/ _/_/
"El amor es poner tu felicidad en la felicidad de otro" - Leibniz
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Esos clientes empezaron a admitir un nuevo formato: el HTML. De esa manera, se le daba libertad al usuario para que eligiera tipos de letras, tamaños, colores, tablas HTML, listas, reglas horizontales, imágenes adjuntas, etc.
La forma de enviar esos correos dentro del formato de un correo electrónico es:
1.- Indicar que el contenido del cuerpo sigue las directrices MIME, indicándolo en la cabecera. Algo como
Using text Syntax Highlighting
MIME-Version: 1.0
Content-Type: multipart/alternative;
boundary="----=_Part_35130250_1889093148.1277833746681"
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Con estas dos etiquetas en la cabecera indicamos que este correo sigue las normas MIME versión 1.0. Y que el contenido del cuerpo es, un conjunto de partes (
multipart), que son alternativas (
alternative), y que se separan unas de otras con la marca indicada por el atributo
boundary. Lo de
alternative quiere decir que este correo contiene al menos dos representaciones del mismo contenido, pero, en distinto formato.
2.- En el cuerpo, aparecen cosas como estas:
Using text Syntax Highlighting
------=_Part_35130250_1889093148.1277833746681
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
Perl
Today's new discussions from Perl group members. Change the frequency of=
this digest:
http://www.linkedin.com/e/-idwazy-gb117x89-51/ahs/106254/EMLt_anet_settin=
gs-cnhOon0JumNFomgJt7dBpSBA/
Active Discussion of the day
* Balbir Singh started a discussion on a news article:
OpenSource projects in perl? (9)
------=_Part_35130250_1889093148.1277833746681
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit
<html>
<body>
<table width="580" style="margin:0 auto;font-family:arial;border-bottom:1px dotted #ccc;" cellpadding="5" cellspacing="0" border="0">
<tr style="background:#069"><td style="font-size:12px;color:#fff;padding:3px 5px">Linkedin Groups</td><td style="text-align:right;color:#fff;font-size:12px;padding:3px">June 29, 2010</td></tr>
<tr style="background:#e0f1fe"><td colspan="2" style="font-weight:bold;font-size:20px;height:26px;padding-left:5px">Perl</td></tr>
<tr><td colspan="2" style="font-size:12px;;border-bottom:1px dotted #ccc;padding:5px 0">
<p><strong>Latest:</strong>
<a href="http://www.linkedin.com/e/-idwazy-gb117x89-51/vgq/106254/EML_anet_ques_hm-cnhOon0JumNFomgJt7dBpSBA/">4 discussions</a>
<span style="padding:0 5px;">|</span>
<a href="http://www.linkedin.com/e/-idwazy-gb117x89-51/vgj/106254/5/EML_anet_jobs_hm-cnhOon0JumNFomgJt7dBpSBA/">4 Jobs</a>
</p>
</td></tr>
<tr><td colspan="2">
<h3 style="font-size:16px;font-weight:bold; padding: 0; margin:10px 0 2px;" >Most Active Discussions (1)</h3>
...
/td></tr></table>
</body>
</html>
------=_Part_35130250_1889093148.1277833746681--
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Observa que hay dos partes, separadas por el
boundary indicado antes. En la primera parte, es puro texto, mientras que la segunda es puro HTML. Si además se transmiten imágenes adjuntas (algo no recomendable), irán codificadas en mimeencode en sucesivas partes.
Al llegar este correo al destinatario, es el CLIENTE de correo el que decide mostrar un estilo u otro, según la configuración deseada por el usuario. Por ejemplo, la gran mayoría de los usuarios, como no saben nada de esto, dejan que esta decisión la tomen los propios programas, así que la mayoría la ve en formato HTML. Yo, en cambio, siempre tengo puesto en mi Thunderbird que, por defecto, siempre quiero ver la representación en modo texto (no quiero arriesgarme a ver/recibir sorpresas desagradables).
Lo que también es curioso de todo esto, es casi nadie sabe que todos los mensajes de correo que escriben al cabo del día, se transmiten con el doble de tamaño: la mayor parte de los clientes de correo, cuando terminas de confeccionar el mensaje, los guardan y transmiten en los dos formatos: en el HTML -que por defecto ha usado el cliente para confeccionarlo-; y en puro texto, para mantener la portabilidad, ya que siempre puede ocurrir que la persona que reciba el mensaje no disponga de un terminal con capacidad de representar ese HTML (por ejemplo, un
mensáfono). Por eso se envía la parte de puro texto, para que el correo se pueda ver en todas las ocasiones. Yo, siempre uso el modo de puro texto, así que mis correos ocupan entre diez y veinte veces menos, como mínimo, de lo que el resto de usuarios lo hacen, ya que la parte de HTML es enorme comparada con la de solo texto.
Volviendo a tu problema...
* Si tu envías un correo en formato de puro texto, y las tablas quedan perfectas viéndolas con letra monoespaciada, entonces la culpa de que no se vean bien en el destinatario NO es tuya, sino del destinatario. Le dices, amablemente, que configure su cliente de correo para visualizarlo de forma correcta. En el Outlook Express, por ejemplo, es posible indicar, en la configuración, qué fuente de letra usar en el caso de puro texto. Pero eso solo ocurre en el lado del cliente. Desde tu lado, no puedes indicar el tipo de letra: los correos de texto son solo eso, texto.
* Si, en cambio, quieres enviarlo en formato HTML, tienes la ventaja de usar tablas HTML, por lo que entonces te ahorras código para generarlo y representarlo, ya que de eso se encargará el visor HTML del cliente de correo del receptor. Ahora bien... para crear un correo con ese contenido, no es tan sencillo como hacerlo en puro texto. Pero no te preocupes: en CPAN también hay módulos para crearlos de forma sencilla. Y sí que podrás indicar el tipo de letra (otra cosa es que el destinatario tenga o no, en su ordenador, precisamente, ese tipo de letra).
Es claro que yo siempre voy a preferir enviarlo en modo texto, porque se va a transmitir mucho más rápido, ocupará mucho menos espacio, y será posible verlo en muchas más dispositivos.
Pero bueno, en caso de que tengamos que hacerlo en HTML, tienes módulos como
Mail::Builder::Simple, que te permite crear mensajes y enviarlos. Incluso tiene soporte para plantillas de mensajes.
La parte de HTML la puedes crear con muchos otros módulos, partiendo del mismísimo CGI. O a mano