[Ir al menú de PHP]
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.

La ignorancia es demasiado atrevida y como quiera que me dejaron preocupado los porqués de aquellas funciones, he tratado de informarme un poquito más al respecto, y esto que te comento es el resultado.

El formato de loa mensajes está especificado en una serie de normas conocidas como el MIME (Multipurpose Internet Mail Extensions) que especifica los contenidos y la sintaxis de las diferentes partes de un mensaje.

Recuerda que en PHP la función mail(dest, asunto, mens, cabez) tiene cuatro parámetros y que las especificaciones del MIME aluden a los dos últimos, es decir a cabez (la cabecera del mensaje) y al mens que es el cuerpo del mismo

Lo relativo a dest (destinatario) y asunto no parece requerir más comentarios que incluir esas cadenas (dirección de correo electrónico y asunto del mensaje) bien directamente como parámetro en la función o a través de una variable tal como te comentaba en la página anterior.

Cabeceras de los mensajes

Los diferentes elementos de la cabecera de un mensaje deben insertarse siempre en líneas independientes Pueden contener lo siguiente:

Date: xxxxxxxx

donde dice Date: debe escribrise exactamente con esa sintaxis y donde ponexxxxxxxx va una cadena que contendrá la fecha de envío del mensaje y que podría obtenerse a través de una de las funciones de fecha de PHP tal como puedes ver en el ejemplo.

MIME-Version: 1.0

Este elemento de la cabecera especificará la versión MIME que ha de utilizar el cliente de correo para interpretar adecuadamente el contenido de los mensajes.

No he visto versiones posteriores a la que te indico... así que... te sugiero utilizar esta y no preguntarme demasiado ;-)

From: remitente<e-mail>

Este elemento de la cabecera permite indicar el nombre del remitente (remitente) y su dirección e-mail siguiendo la sintaxis que te especifico. El nombre, como un elemento independiente y la dirección e-mail dentro de < >.

¡¡Cuidado...!!

No escribas entre comillas el nombre del remitente, ni la dirección e-mail, ni la fecha, ni...
Ten en cuenta que todo el encabezado compone una cadena única, y que los diferentes elementos van dentro de esa cadena

Lo que si debes tener muy presente -no te cuento los kilos de aspirinas que me costó- es que cada uno de los elementos debe estar en una línea diferente

¡¡Fíjate en los comentarios de los ejemplos!!


Cc: y Bcc:

Ni tan siquiera te los comento porque es lo mismo que te he dicho en la página anterior y no quiero que me llames... pelmazo.

Tampoco te comentaré -por la misma razón ni Reply-To: ni X-Mailer: pero si quiero contarte mis experiencias con el elemento:

Return-Path: direcc

que permitiría insertar una dirección e-mail a la que llegaría devuelto el mensaje en el caso en que -por dirección errónea, problemas del servidor, etc.- el mensaje no fuera entregado.

Fíjate en los resultados del ejemplo de la derecha y verás que pese a lo que incluyas en el mensaje PHP insertará el Return-Path que tenga configurado en php.ini.

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.

Esto requiere añadir a la cabecera del mensaje un elemento más:

Content-Type:

Este elemento debe ir seguido por la especificación que indice el tipo de contenido y que tiene la sintaxis: tipo/subtipo

El MIME establece un montón de opciones, pero por el momento voy a contarte un par de cosillas para hacer boca y luego sigo... ;-)

text/plain

la opción text/plain -es la opción por defecto- establece que el contenido del mensaje es de tipo texto (text) y del subtipo sin formato (plain)

text/html

como la anterior es tipo texto pero en este caso, el subtipo es html con lo cual el mensaje se presentará en formato hmtl siempre que el cliente de correo permita ese formato.

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:

multipart/alternative

que no es otra cosa que especificar que el mensaje es del tipo varias partes (multiplart) y que al destinatario solo debe presentarle una de ellas (alternative)

Esta opción es muy interesante para aquellos casos en los que enviamos un mensaje con formato HTML y queremos preveer la posibilidad de que el destinatario utilice un cliente de correo que no soporta el formato HTML (por ejemplo algunos webmail).

Podemos hacer un mensaje a medida que se presentará de una forma u otra dependiendo del cliente con el que trate de leer el mensaje.

multipart/mixed

Cuando el elemento del encabezado Content-Type establece el tipo multiparte y el subtipo mezclado (mixed) es cuando estamos en disposición de añadir al mensaje todas esas cosas que solemos llamar ¿attachement?, es decir: la foto de la abuelita, la animación hortera que nos enviaron desde Japón, etc. etc.

Pero claro... las diferentes partes ya sea alternativo o sea un mezclado deben ir separarlas y para ello hay que incluir un nuevo elemento en el encabezado ... hay que incluir un separador y al parecer eso se llama boundary.

boundary=cadena

Dentro de encabezado y siempre en línea aparte (fíjate en los ejemplos... o está en línea aparte o aparece el famoso \n que ... al cambio... bicicleta..) debemos incluir el elemento boundary= (sin símbolo de $ delante, te aviso...) y detrás de igual una cadena (se especifica entre comillas, en este caso si) que en principio puede ser una cadena cualquiera que no contenga espacios-al menos me ha funcionado así- aunque verás por ahí un extraño consenso... sobre una forma peculiar...de generar esos separadores lo cual me hace dudas entre dos posibilidades: o bien todos hemos copiado de misma fuente original o tiene razones de ser que se escapan a mi conocimiento.

Aquí al lado te hago algunas precisiones sobre mis fracasos con el boundary te sugiero que las tomes muy en cuenta pero.. si no quieres hacerme caso es cosa tuya... advertid@ estás.. ;-)

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.

. La secuencia de contenidos sería esta: Los apartados señalados con ** solo se incluirían en el caso de adjuntar ficheros.

Content-type

Los tipos y subtipos más habituales son los siguientes:

Para incluir textos:
los ya mencionados
text/plain
text/html
Para imágenes:
dependiendo del tipo de imagen
image/jpeg
image/gif
Para sonidos:
audio/basic Para vídeo:
video/mpeg
Para ejecutables y otros ficheros adjuntos:
application/octet-stream

En cualquier caso, si quieres utilizar algún otro tipo de archivo específico puedes buscar por ahí las especificaciones del MIME.

Aparte de tipo/subtipo puede añadirse a Content-type -en el caso de texto- separado por punto y coma de lo anterior, la especificación charset= seguida del tipo de codificación (te sugiero "ISO-8859-1" que hace alusión al alfabeto latino, salvo... claro está que quieras que el mensaje sea legible en búlgaro... para lo que tendrás que buscarte la vida y elegir el charset más adecuado.

Si se trata de ficheros adjuntos deberás poner -después del punto y coma- name= seguido del nombre y extensión del fichero a adjuntar.

Content-Transfer-Encoding

Ese apartado del encabezado puede contener uno de los siguientes formatos de codificación:

7BIT
8BIT
BASE64
BINARY
QUOTED-PRINTABLE

La transferencia codificada en 7bit representa la codificación habitual en el formato ASCII de 7 bits. No permite caracteres ASCII con un código mayor que 127.

Quoted-printable es una alternativa de codificación al formato ASCII de 7 bits Codificación para los elementos del mensaje que contienen mayoritariamente caracteres del juego de caracteres US ASCII de 7 bits en el que los códigos superiores 127 se expresan mediante un mecanismo especial. Es el más recomendable para textos

La codificación en base64 convierte cadenas binarias arbitrarias en cadenas de texto con lo cual pueden ser enviadas de forma más segura. Es la codificación habitual para imágenes, ficheros: exe, zip, etc. etc.

Content-Disposition

Este elemento se utiliza unicamente en el caso en el que se insertar ficheros adjuntos. Permite dos opciones: inline ó attachment. La primera de ellas permitiría que los contenidos se visualizaran junto con el cuerpo del mensaje mientras que la otra solo aparecerían como ficheros adjuntos.

Por lo que he visto Outlook Express no respeta demasiado esa condición y presenta las imágenes en el mensaje. Sin embargo, he podido comprobar que si funciona en los correos web.

Este elemento del encabezado llega -separado por punto y coma- una segunda parte. El filename= donde se puede especificar -entre comillas- un nombre y una extensión (igual o distinta de la original) con la que se denominará al fichero en el mensaje recibido.

Lectura del fichero

Cuando se trata de insertar un fichero el proceso es el típico de lectura de ficheros, es decir: Codificación

Una vez recogido en el fichero a transmitir en la variable buffer el paso siguiente es codificar esa variable.
Solo he estudiado el proceso de codificación base64 (algo tendrá cuando todo el mundo lo recomienda). Se utilizan dos funciones PHP:

base64_encode
chunk_split La primera realiza la codificación propiamente dicha y la segunda organiza el fichero codificado en trozos de 76 carácteres insertando detrás de cada trozo un salto de línea.

Si miras las tripas de un mensaje de correo que contenga un fichero adjunto, verás esa fragmentación tan cuidada -un montón de líneas de texto muy raro- perfectamente alineadas por ambos márgenes... pues eso... según parece es el efecto de chunk_split ...que lo sepas... ;-)

Inserción en el cuerpo

La fase final del proceso es la de agrupar los diferentes trozos en una sola variable, que será la que se inserte como parámetro texto en la función e-mail.

¡¡Cuidado...!!

Te he contado toda la batallita de mis experiencias con ficheros adjuntos, pero... falta algo -probablemente sea innecesario decirlo- pero... el proceso que te he contado presupone que los ficheros a adjuntar están en el servidor... y lógicamente antes de enviarlos hay que subirlos.. pero de ese paso previo ya te hablé hace unas cuantas páginas... aquí tienes el enlace.. por si acaso ...;-)


 
 


Configuración de php.ini para usar la función mail()

Antes de hacer experimentos con la función mail() -y después de instalar el servidor de correo- hice los cambios que ves aquí debajo en el fichero php.ini.

Fíjate que dejé localhost como SMTP. Cuando probé a poner bocarrero.as me dió error continuamente. ¡Dios sabrá por qué! ;-)

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.

Quiero hacerte unos comentarios para intentar evitarte los sudores y las aspirinas que me ha costado a mí hacer que esto funcione... ;-) ... de nada... para eso estamos...

Fíjate que al insertar el parámetro cabeceras solo he puesto unas comillas (te las marco en rojo) y fíjate también que he puesto cada elemento en una línea diferente (es obligatorio hacerlo así... si quieres que funcione... claro)

Fíjate también (no es menos importante... te lo juro) que no he dejado ni un solo espacio a la izquierda de cada uno de los elementos

¿Qué por qué digo eso si Date aparece sangrado?... jejeje... sabía que lo preguntarías... pero ahí puedo permitirme ese lujo porque la cadena no contiene espacios... fíjate que está pegado a las comillas de comienzo de la cadena... ;-)

En Date he escrito una fecha atrasada y la he puesto tal cual, y esa será la fecha que aparezca como fecha de envío en el mensaje.


<?
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())
?>

Una forma un poco más depurada del script anterior podría ser esta que te incluyo aquí debajo.

Sus particularidades son las siguientes:


<?
$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";
}  

?>

El script anterior generaría un mensaje que el destinatario vería en su cliente de correo (Outlook Express, en la imagen) de la siguiente forma:


y cuyo contenido (bastaría visualizar las propiedades del mensaje sería como este:
-------------------------------------------------------------------------------
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é...

La configuración de php.ini incluye la directiva sendmail_from y en ella hemos puesto admin@bocarrero.as, lo que me hace sospechar que esa es la razón de la sustitución del valor del elemento Return-Path:... son solo sospechas... que conste... ;-)

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"

Fíjate que esta última especificación se incluye (separada por un punto y coma) a continuación del Content-Type, es decir... en la misma línea.


<?
$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";
} 
?>

En este enlace de abajo tienes el resultado de la ejecución del sript anterior.


Ver el resultado


Los caprichos de la tecnología

Aunque yo los llame caprichos seguro que su razón de existencia tendrán y seguro también que justificadísima. Pero -te lo juro y no te miento...;-)- que mientras trataba de hacer funcionar estos ejemplos... subió la cotización de las acciones de Bayer (seguramente por mi consumo de aspirinas) intentaré evitarte los dolores de cabeza que yo padecí en cabeza propia aún a riesgo de que alguien me escriba -otra vez- diciéndome (con toda la razón del mundo) que «...mis memorias son para tontos...» y claro que lo son... estas memorias son para mí... y yo me conozco... y se que las cosas se me olvidan... que los años no pasan en balde... y que Dios no fué demasiado generoso en aquello de darme luces....

A lo que iba... los inexcrutables misterios de la tecnología..

Fíjate en los ejemplos que siguen y verás algunas cosillas como estas:

Con estos comentarios tranquilizo mi conciencia ahora.. ya es cosa tuya fiarte de mí o no hacerlo... ;-)


Algunas funciones PHP que incorporo en estos ejemplos

Podrás ver en estos ejemplos algunas funciones raras que te voy a comentar ahora:

uniqid(pre,bol)

Genera un identificador único basado en la hora actual del sistema expresada en microsegundos con una longitud de 13 caracteres.

El parámetro pre permite establecer una cadena o número (puede ser una cadena vacía) que se antepone al identificador generado por la función.

Opcionalmente permite el segundo parámetro bol que debe ser un valor booleano (TRUE ó FALSE) o también 0 ó 1.

Cuando este parámetro es TRUE añade al final de la cadena generada anterior otra subcadena numérica -generada aleatoriamente- de nueve dígitos que refuerza la unicidad del identificador.

md5(cadena)

Codifica el contenido del parámetro cadena utilizando el algoritmo Message-Digest Algorithm de RSA Data Security, Inc. y devuelve el resultado en forma de número de 32 caracteres en formato hexadecimal

eregi_replace(busca, reemplaza, cadena)

Busca en la cadena especificada en el parámetro cadena (que puede ser una cadena o una variable que contenga una cadena) las subcadenas especificadas en busca (pueden ser expresiones regulares... algún día las estudiaré...) y sustituye esas subcadenas por el contenido del parámetro reemplaza.

Esta función devuelve la cadena modificada.

strip_tags(cadena, excepciones)

Suprime todas las etiquetas HTML contenidas en cadena salvo las que se indiquen en excepciones.

Por ejemplo: strip_tags($cadena, '<i><u><b>') eliminaría todas las etiquetas HTML salvo las indicadas aquí y sus correspondientes cierres.

Si no se especifican excepciones elimina todas las etiquetas.

base64_encode(cadena)

Devuelve una cadena codificada en base64. Esta codificación se hace para permitir que las informaciones binarias puedan ser correctamente manipuladas por sistemas que no generan correctamente los 8 bits, tal como ocurre frecuentemente en los cuerpos de los mensajes de correo electrónico.

base64_decode(cadena)

Realiza el proceso inverso a la anterior. Decodifica una cadena previamente codificada en base64.

chunk_split(cadena, longitud, separador)

Devuelve una cadena obtenida al insertar en la cadena especificada -a intervalos del número de caracteres especificados en el parámetro numérico longitud- el contenido una subcadena indicada en el parámetro separador.

Por defecto -cuando no se especifican los parámetros- longitud es igual a 76 caracteres y el separador es la cadena \r\n (retorno y salto de línea).

Esta función se utiliza para convertir al formato espeficado en la RFC 2045 (especificación para MIME) las cadenas obtenidas por base64_encode.

Es el formato habitual de los ficheros adjuntos de los e-mail.


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

¡¡Una curiosidad...!!. Desconozco la razón pero... cuando probé el script anterior sobre el servidor Mercury llevé una sorpresa... el fichero ejecutable que había transferido me apareció en el mensaje con una extensión añadida .safe (exactamente así) pero... bastó con renombrarlo y ponerle extensión exe para que recobrara si icono y su funcionalidad... lo ejecuté y... (valga la redundancia) se ejecutó correctamente...


Sugerir a un/a amig@ Envíame tus comentarios
Anterior
Indice
Siguiente