Enviar mail con archivos adjuntos PHP

From Wiki de Caballero
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Ejemplo de como mandar mail con archivos adjuntos:

Inicialmente asignamos en variables los parámetros básicos del correo:

$to      = "contacto@destinatario.com";  //mail del que recibe el email.<br>
$from    = "contacto@remitente.com";     //mail del envía el email.<br>
$subject = "Cotización KafBarcelona";    //texto del asunto del email.<br>


Ahora tenemos que crear un limitador único que tendremos que añadir cada vez que introduzcamos un fragmento de email, ya sea texto, html o fichero adjunto.

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


Una vez tenemos el limitador asignado, podemos crear la cabecera del email, asignando el MIME-Version; Content-Type: multipart/mixed ya que contendrá texto y ficheros adjuntos; y no se nos puede olvidar indicar el limitador que hemos creado.

$headers = "From: $from";
$headers .= "\r\nMIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed;\r\n";
$headers .= " boundary=\"{$mime_boundary}\"";


Una vez hecho esto, ya se puede empezar a introducir en el contenido del correo fragmentos de texto y adjuntos, indicando siempre en cada fragmento, el boundary con — delante y el resto de características de cada fragmento, como el Content-Type y el Content-Transfer-Encoding:

$message = "Información del cedente";
$message = "--{$mime_boundary}\r\n";
$message .= "Content-Type: text/plain; charset=\"utf-8\"\r\n";
$message .= "Content-Transfer-Encoding: 7bit\r\n\r\n" . $message . "\r\n\r\n";


A la hora de añadir un fichero adjunto, es necesario obtener el contenido del fichero y formatearlo adecuadamente:

$file = './cotizaciones/cotizacion-' . $nombre . '.pdf';
$fp = fopen($file, "rb");
$data1 = fread($fp, filesize($file));
fclose($fp);
$data = chunk_split(base64_encode($data1), 70);


Una vez formateado el fichero que adjuntaremos, añadiremos el fragmento al contenido del email sin olvidar indicar el Content-Type con el tipo de fichero adjunto, en Content-Transfer-Encoding indicaremos el tipo de codificación aplicada y por último, habrá que indicar Content-Disposition: attachment para que los clientes de correo identifiquen este fragmento de correo como un fichero adjunto.

$message .= "--{$mime_boundary}\r\n";
$message .= "Content-Type: application/xlsx;";
$message .= "name=\"" . basename($file) . "\"\r\n";
$message .= "Content-Transfer-Encoding: base64" . "\r\n\r\n" . $data . "\r\n";
$message .= "Content-Disposition: attachment\r\n\r\n";


Finalmente, antes de ejecutar la función mail de PHP, tendremos que poner el limitador con — tanto delante, como detrás, para así marcar que se ha acabado el contenido del email.

$message .= "--{$mime_boundary}--";
mail($to, $subject, $message, $headers);


Importante

Se debe verificar los \r\n para tengan la misma cantidad que el código y que se encuentren dentro de comillas dobles.