|
Configuración de php.ini y E-mail MIME |
Formato los mensajes de correo electrónico
En la primera mención a la función mail() te hablaba -de forma muy traida por los pelos como insertar el cuarto parámetro de la función mail en el que insertaba algunos encabezados.Cabeceras de los mensajes
Los diferentes elementos de la cabecera de un mensaje deben insertarse siempre en líneas independientes Pueden contener lo siguiente:El formato del mensaje
Mientras no se especifique lo contrario, los mensajes se enviarán como texto sin formato, pero... existen opciones para especificar el formato de un mensaje.Mensajes multiparte
Los tipos anteriores permiten enviar mensajes simples (sin ficheros adjuntos) en uno u otro formato, pero el MIME nos da opciones para insertar dentro de un mismo mensaje elementos de diferentes tipos y subtipos. Si ánimo de ser exhaustivo -¡¡verdad que me ha quedado finísimo el eufemismo... de lo exhaustivo!! ¡¡cuanto cuesta reconocer la propia ignorancia, amig@.. ;-) - te comento las dos opciones más interesantes:El cuerpo del mensaje
En su formato más simple, el cuerpo del mensaje contiene unicamente el texto pero cuando se trata de multipartes contiene además los separadores de las diferentes partes así como los encabezados parciales de cada una de ellas.
Configuración de php.ini para usar la función mail()
| Configuración por defecto | Configuración para usar mail() | |
SMTP = localhost
smtp_port = 25
; For Win32 only.
;sendmail_from = me@example.com
|
SMTP = localhost
smtp_port = 25
; For Win32 only.
sendmail_from = admin@bocarrero.as
|
Las cabeceras MIME de un mensaje
Aquí tienes un ejemplo con los diferentes elementos del encabezado de un mensaje. Como ves he incluido todos los elementos dentro de la función mail.
<?
mail("juan@bocarrero.as", "Cabeceras", "Prueba de cabeceras",
"Date: 24 de Junio de 2001
MIME-Version: 1.0
From: Andrés el de Bocarrero<andres@bocarrero.as>
Cc: perico@bocarrero.as
Bcc:admin@bocarrero.as
Return-path: juan@bocarrero.as
Reply-To: juan@bocarrero.as
X-Mailer: PHP/".phpversion())
?>
<?
$destinatario="juan@bocarrero.as";
$titulo="Cabeceras";
$mensaje="Prueba de cabeceras";
$responder="juan@bocarrero.as";
$remite="andres@bocarrero.as";
$remitente="Andrés el de Bocarrero";
$cabecera ="Date: ".date("l j F Y, G:i")."\n";
$cabecera .="MIME-Version: 1.0\n";
$cabecera .="From: ".$remitente."<".$remite.">\n";
$cabecera .="Return-path: ". $remite."\n";
$cabecera .="Reply-To: ".$responder."\n";
$cabecera .="X-Mailer: PHP/". phpversion()."\n";
if( mail($destinatario, $titulo, $mensaje,$cabecera)){
echo "mensaje enviado";
}
?>
![]() |
------------------------------------------------------------------------------- Received: from spooler by bocarrero.as (Mercury/32 v4.01a); 22 Jan 2005 14:34:08 +0100 X-Envelope-To: <juan@bocarrero.as> Return-path: <admin@bocarrero.as> Received: from ec-dks (127.0.0.1) by bocarrero.as (Mercury/32 v4.01a) ID MG000001; 22 Jan 2005 14:33:59 +0100 Subject: Cabeceras To: juan@bocarrero.as Date: Saturday 22 January 2005, 14:33 MIME-Version: 1.0 From: Andrés el de Bocarrero<andres@bocarrero.as> Reply-To: juan@bocarrero.as X-Mailer: PHP/4.3.10 -------------------------------------------------------------------------------Fíjate... no ha hecho ni puñetero caso... al elemento Return-Path:... le había mandando que pusiera andres@bocarrero.as y me colocó admin@bocarrero.as... te explico por qué...
Formatos del mensaje
Este ejemplo está basado en el anterior. La única modificación que he introducido ha sido añadir a la cabecera un nuevo elemento MIME... (te lo marco en rojo) para especificar que mi intención es que el mensaje tenga formato html y además que se visualicen los caracteres raros (eñes, letras con tilde, etc. etc.) según el alfabeto latin 1 que es que se identifica como charset="ISO-8859-1"
<?
$destinatario="perico@bocarrero.as";
$titulo="Cabeceras HTML";
$mensaje="<html><head></head><body bgcolor='#ff0000'>";
$mensaje .="<font face='Arial' size=6>Prueba HTML para Perico
el de Bocarrero</font>";
$mensaje .="</body></html>";
$responder="juan@bocarrero.as";
$remite="juan@bocarrero.as";
$remitente="Juan el del molín de Bocarrero";
$cabecera ="Date: ".date("l j F Y, G:i")."\n";
$cabecera .="MIME-Version: 1.0\n";
$cabecera .="From: ".$remitente."<".$remite.">\n";
$cabecera .="Return-path: ". $remite."\n";
$cabecera .="Reply-To: ".$responder."\n";
$cabecera .="X-Mailer: PHP/". phpversion()."\n";
$cabecera .="Content-Type: text/html; charset=\"ISO-8859-1\"\n";
if( mail($destinatario, $titulo, $mensaje,$cabecera)){
echo "mensaje enviado";
}
?>
| Ver el resultado |
Los caprichos de la tecnología
Algunas funciones PHP que incorporo en estos ejemplos
Mensaje con contenido alternativo
<? # creo la variables "salto" para "mi mayor comodidad" $UN_SALTO="\r\n"; $DOS_SALTOS="\r\n\r\n"; # creo la remitente, etc. y también la que # contiene el código HTML del mensaje $destinatario="juan@bocarrero.as"; $titulo="Mensaje alternativo Texto Plano- HTML "; $mensaje="<html><head></head><body bgcolor='#ff0000'>"; $mensaje .="<font face='Arial' size=6>Prueba HTML</font>"; $mensaje .="</body></html>"; $responder="andres@bocarrero.as"; $remite="andres@bocarrero.as"; $remitente="Soy Andrés el molinero de Bocarrero"; # creo el separador de bloques del mensaje # anteponiento "_separador" aunque podría haber puesto "tiburcio" # genero un identificador unico utilizando un numero aleatorio # como "semilla" y luego lo codifico con la función md5 $separador ="_separador".md5 (uniqid (rand())); # creo la variable cabecera con los elementos # ya utilizados en los ejemplos anteriores y pongo al final # de cade elemento UN SALTO DE LINEA $cabecera = "Date: ".date("l j F Y, G:i").$UN_SALTO; $cabecera .="MIME-Version: 1.0\n"; $cabecera .="From: ".$remitente."<".$remite.">".$UN_SALTO; #$cabecera .= "Return-path: ". $remite.$UN_SALTO; $cabecera .="Cc:perico@bocarrero.as".$UN_SALTO; $cabecera .="Reply-To: ".$remite.$UN_SALTO; $cabecera .="X-Mailer: PHP/". phpversion().$UN_SALTO; # AQUÍ DEFINO EL CONTENIDO MULTIPART, fíjate que lo acabo con ";" $cabecera .="Content-Type: multipart/alternative;".$UN_SALTO; # inserto BOUNDARY (fíjate que dejo un espacio # en BLANCO DELANTE y pongo al FINAL los DOS SALTOS DE LINEA $cabecera .=" boundary=$separador".$DOS_SALTOS; # inserto el primer separador(con los dos guiones delante) # antes de insertar la primera parte del mensaje # que es el texto plano para el caso de que el cliente de correo # no soporte HTML $texto_plano ="--$separador".$UN_SALTO; # especifico el tipo de contenido, la codificación # e inserto DOS SALTOS AL FINAL ya que ahi acaba la cabecera de esta parte $texto_plano .="Content-Type: text/plain; charset=\"ISO-8859-1\"".$UN_SALTO; $texto_plano .="Content-Transfer-Encoding: 7bit".$DOS_SALTOS; # cambio las etiquetas "<br>" por saltos de línea # y luego quito todas las etiquetas HTML del cuerpo del mensaje $extractor= strip_tags(eregi_replace("<br>", $UN_SALTO, $mensaje)); $texto_plano .=$extractor; # inserto un nuevo separador para señalar el final # de la primera parte del mensaje y el comienzo de la segunda # en este caso pongo UN SALTO delante del separado ya que de lo contrario # al componer el mensaje se uniría con la cadena texto_plano anterior # que no tiene SALTO DE LINEA AL FINAL $texto_html =$UN_SALTO."--$separador".$UN_SALTO; # especifico el encabezado HTML para el siguiente bloque # y pongo en la ultima línea los DOS SALTOS DE LINEA $texto_html .="Content-Type: text/html; charset=\"ISO-8859-1\"".$UN_SALTO; $texto_html .="Content-Transfer-Encoding: 7bit".$DOS_SALTOS; #añado la cadena que contiene el mensaje $texto_html .= $mensaje; # inserto un separador para indicar el final de esta parte # y le antepongo un SALTO DE LINEA por la misma razón que en el caso anterior $texto_html .=$UN_SALTO."--$separador".$UN_SALTO; # uno ambas cadenas para crear el cuerpo del mensaje $mensaje=$texto_plano.$texto_html; # envio el mensaje utilizando la funcion mail if( mail($destinatario, $titulo, $mensaje,$cabecera)){ echo "mensaje enviado "; } ?>
| Ver el resultado |
Mensaje con ficheros adjuntos
<? $UN_SALTO="\r\n"; $DOS_SALTOS="\r\n\r\n"; $destinatario="andres@bocarrero.as"; $titulo="Mensaje con dos fichero adjuntos"; $mensaje="<html><head></head><body bgcolor=\"#0000ff\">"; $mensaje .="<font face=\"Arial\" size=6>Prueba HTML </font>"; $mensaje .="</body></html>"; $responder="juan@bocarrero.as"; $remite="juan@bocarrero.as"; $remitente="Juan el del molin te envia un ficherín"; $separador = "_separador_de_trozos_".md5 (uniqid (rand())); $cabecera = "Date: ".date("l j F Y, G:i").$UN_SALTO; $cabecera .= "MIME-Version: 1.0".$UN_SALTO; $cabecera .= "From: ".$remitente."<".$remite.">".$UN_SALTO; $cabecera .= "Return-path: ". $remite.$UN_SALTO; $cabecera .= "Reply-To: ".$remite.$UN_SALTO; $cabecera .="X-Mailer: PHP/". phpversion().$UN_SALTO; $cabecera .= "Content-Type: multipart/mixed;".$UN_SALTO; $cabecera .= " boundary=$separador".$DOS_SALTOS; // Parte primera -Mensaje en formato HTML # Separador inicial $texto ="--$separador".$UN_SALTO; # Encabezado parcial $texto .="Content-Type: text/html; charset=\"ISO-8859-1\"".$UN_SALTO; $texto .="Content-Transfer-Encoding: 7bit".$DOS_SALTOS; # Contenido de esta parte del mensaje $texto .= $mensaje; # Separador de partes $adj1 = $UN_SALTO."--$separador".$UN_SALTO; // Parte segunda -Fichero adjunto nº 1 # Encabezado parcial $adj1 .="Content-Type: image/jpeg; name=\"casa08.jpg\"".$UN_SALTO; $adj1 .="Content-Disposition: inline; filename=\"leoncio.jpg\"".$UN_SALTO; $adj1 .="Content-Transfer-Encoding: base64".$DOS_SALTOS; # lectura del fichero adjunto $fp = fopen("casa08.jpg", "r"); $buff = fread($fp, filesize("casa08.jpg")); fclose($fp); # codificación del fichero adjunto $adj1 .=chunk_split(base64_encode($buff)); # Separador de partes $adj2 = $UN_SALTO."--$separador".$UN_SALTO; // Parte tercera -Fichero adjunto nº 2 # Encabezado parcial $adj2 .="Content-Type: application/octet-stream; name=\"winzip90.exe\"".$UN_SALTO; $adj2 .="Content-Disposition: attachment; filename=\"winzip90.exe\"".$UN_SALTO; $adj2 .="Content-Transfer-Encoding: base64".$DOS_SALTOS; # lectura del fichero adjunto $fp = fopen("winzip90.exe", "r"); $buff = fread($fp, filesize("winzip90.exe")); fclose($fp); # codificación del fichero adjunto $adj2 .=chunk_split(base64_encode($buff)); // separador final del mensaje $adj2 .=$UN_SALTO."--$separador".$UN_SALTO; // Unión de las diferentes partes para crear // el cuerpo del mensaje $mensaje=$texto.$adj1.$adj2; // envio del mensaje if( mail($destinatario, $titulo, $mensaje,$cabecera)){ echo "mensaje enviado"; } ?>
| Ver el resultado |