Enviar mail con archivos adjuntos PHP

From Wiki de Flat Estrategia Digital
Jump to: navigation, search

Ejemplo de como mandar mail con archivos adjuntos:

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

1 $to      = "contacto@destinatario.com";  //mail del que recibe el email.<br>
2 $from    = "contacto@remitente.com";     //mail del envía el email.<br>
3 $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.

4 $semi_rand = md5(time());
5 $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.

6 $headers = "From: $from";
7 $headers .= "\r\nMIME-Version: 1.0\r\n";
8 $headers .= "Content-Type: multipart/mixed;\r\n";
9 $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:

10 $message = "Información del cedente";
11 $message = "--{$mime_boundary}\r\n";
12 $message .= "Content-Type: text/plain; charset=\"utf-8\"\r\n";
13 $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:

14 $file = './cotizaciones/cotizacion-' . $nombre . '.pdf';
15 $fp = fopen($file, "rb");
16 $data1 = fread($fp, filesize($file));
17 fclose($fp);
18 $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.

19 $message .= "--{$mime_boundary}\r\n";
20 $message .= "Content-Type: application/xlsx;";
21 $message .= "name=\"" . basename($file) . "\"\r\n";
22 $message .= "Content-Transfer-Encoding: base64" . "\r\n\r\n" . $data . "\r\n";
23 $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.

24 $message .= "--{$mime_boundary}--";
25 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.

Facebook Comments