Función mail con adjuntos

Acabo de romperme la cabeza con este tema por lo de siempre, algún carácter mal escrito o sabe qué. En fin que adjuntar un archivo utilizando la función mail de php en realidad no llega a ser complicado si se es meticuloso y muy cuidadoso sobre todo con los saltos de línea. Veamos un poco los pasos.

Primero que nada definimos la cabecera del mail con el tipo mime y el remitente (opcional lo del remitente).

$headers = "MIME-Version: 1.0\r\n"; 
$headers .= "From: ".REMITENTE." <".REMITENTE_EMAIL.">\r\n";

Luego debemos especificar si hay archivos adjuntos un tipo de cabecera y si no el tipo del mensaje como tal, por ejemplo:

if($hay_adjuntos){
$headers .= "Content-Type: multipart/mixed;  boundary=\"{$mime_boundary}\"";
$sCabeceraTexto = "--{$mime_boundary}\n"."Content-Type: text/html; charset=\"iso-8859-1\"\r\n"."Content-Transfer-Encoding: 7bit\n\n";

xxxxxCODIGO PARA INSERTAR EL ADJUNTOxxxxxxx


}
else
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";

Expliquemos el código en detalle: si hay adjuntos el header del correo debe de ser multipart/mixed porque se van a enviar 2 o más tipos MIME, el código HTML y el o los adjuntos.

boundary: es una cadena de texto que sirve para dividir una parte de otra dentro del correo yo en mi caso la he creado de esta forma:

$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";

El boundary debe ser llamado antes de cada parte diferente del codigo y con – delante o sea esta línea : "\n\n--{$mime_boundary}\n". Importante es no cambiar los saltos de línea “\n” no incluir “\r” porque peta.

La variable $sCabeceraTexto es el tipo mime del cuerpo del mensaje y se define aparte para luego unirla al final del proceso con el cuerpo del mensaje.

Para ver los distintos content type dependiendo de los archivos pueden usar esta url. En el siguiente artículo pondré como insertar los archivos adjuntos y en un tercero ensamblarlo todo.

Comentarios