La función del correo electrónico es muy útil en todo proyecto web. Cada sitio web necesita un sistema de correo para enviar notificaciones o información a sus usuarios. Muchas veces necesitamos enviar un correo electrónico con texto o contenido HTML y adjuntar ficheros.
En este tutorial hablaremos sobre cómo enviar un email con uno o varios adjuntos en PHP. Te ayudaremos a enviar un email tanto con texto, como con HTML incluyendo varios tipos de archivos como adjuntos (imágenes, .doc, .docx, .pdf, .txt, etc). Hemos hecho que el proceso sea simple y sencillo, asà que, ¡vamos allá!
Función personalizada para enviar un email con varios adjuntos
Antes que nada, crearemos una función llamada multi_attach_mail(). Esta función requiere varios parámetros, como el email del receptor, el asunto, el mensaje, el email del emisor, el nombre del emisor y un array con los ficheros adjuntos. Más abajo tienes el código de dicha función:
function multi_attach_mail($to, $subject, $message, $senderMail, $senderName, $files){ $from = $senderName." <".$senderMail.">"; $headers = "From: $from"; // boundary $semi_rand = md5(time()); $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; // headers for attachment $headers .= "nMIME-Version: 1.0n" . "Content-Type: multipart/mixed;n" . " boundary="{$mime_boundary}""; // multipart boundary $message = "--{$mime_boundary}n" . "Content-Type: text/html; charset="UTF-8"n" . "Content-Transfer-Encoding: 7bitnn" . $message . "nn"; // preparing attachments if(count($files) > 0){ for($i=0;$i<count($files);$i++){ if(is_file($files[$i])){ $message .= "--{$mime_boundary}n"; $fp = @fopen($files[$i],"rb"); $data = @fread($fp,filesize($files[$i])); @fclose($fp); $data = chunk_split(base64_encode($data)); $message .= "Content-Type: application/octet-stream; name="".basename($files[$i]).""n" . "Content-Description: ".basename($files[$i])."n" . "Content-Disposition: attachment;n" . " filename="".basename($files[$i]).""; size=".filesize($files[$i]).";n" . "Content-Transfer-Encoding: base64nn" . $data . "nn"; } } } $message .= "--{$mime_boundary}--"; $returnpath = "-f" . $senderMail; //send email $mail = @mail($to, $subject, $message, $headers, $returnpath); //function return true, if email sent, otherwise return fasle if($mail){ return TRUE; } else { return FALSE; } }
Usar la función y enviar un email
Tenemos que declarar las variables, como el email del receptor, el asunto del correo, el mensaje, el email del emisor y el nombre del emisor. Utilizaremos la variable $to para guardar el email del receptor, la variable $from para guardar el email del emisor, el array $attachment_files para guardar los adjuntos, la variable $subject para el asunto y finalmente, la variable $html_content para el mensaje.
Solo necesitas modificar dos variables en este script. Primero, cambia la variable $to con el correo del receptor, y después, cambia el array $attachment_files con los archivos que quieres adjuntar en el correo. Ahora solo queda llamar a la función que hemos creado antes y pasarle los argumentos.
//email variables $to = '[email protected]'; $from = '[email protected]'; $from_name = 'TuNombre'; //attachment files path array $files = array('imagen.png','texto.docx'); $subject = 'Asunto'; $html_content = '<h1>Enviar correo con múltiples adjuntos</h1> <p><b>Total adjuntos : </b>'.count($files).' adjuntos</p>'; //call multi_attach_mail() function and pass the required arguments $send_email = multi_attach_mail($to,$subject,$html_content,$from,$from_name,$files); //print message after email sent echo $send_email?"<h1> Mensaje enviado</h1>":"<h1> Mensaje no enviado</h1>";
Codigo Completo
function multi_attach_mail($to, $subject, $message, $senderMail, $senderName, $files){ $from = $senderName." <".$senderMail.">"; $headers = "From: $from"; // boundary $semi_rand = md5(time()); $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; // headers for attachment $headers .= "nMIME-Version: 1.0n" . "Content-Type: multipart/mixed;n" . " boundary="{$mime_boundary}""; // multipart boundary $message = "--{$mime_boundary}n" . "Content-Type: text/html; charset="UTF-8"n" . "Content-Transfer-Encoding: 7bitnn" . $message . "nn"; // preparing attachments if(count($files) > 0){ for($i=0;$i<count($files);$i++){ if(is_file($files[$i])){ $message .= "--{$mime_boundary}n"; $fp = @fopen($files[$i],"rb"); $data = @fread($fp,filesize($files[$i])); @fclose($fp); $data = chunk_split(base64_encode($data)); $message .= "Content-Type: application/octet-stream; name="".basename($files[$i]).""n" . "Content-Description: ".basename($files[$i])."n" . "Content-Disposition: attachment;n" . " filename="".basename($files[$i]).""; size=".filesize($files[$i]).";n" . "Content-Transfer-Encoding: base64nn" . $data . "nn"; } } } $message .= "--{$mime_boundary}--"; $returnpath = "-f" . $senderMail; //send email $mail = @mail($to, $subject, $message, $headers, $returnpath); //function return true, if email sent, otherwise return fasle if($mail){ return TRUE; } else { return FALSE; } } //email variables $to = '[email protected]'; $from = '[email protected]'; $from_name = 'TuNombre'; //attachment files path array $files = array('imagen.png','texto.docx'); $subject = 'Asunto'; $html_content = '<h1>Enviar correo con múltiples adjuntos</h1> <p><b>Total adjuntos : </b>'.count($files).' adjuntos</p>'; //call multi_attach_mail() function and pass the required arguments $send_email = multi_attach_mail($to,$subject,$html_content,$from,$from_name,$files); //print message after email sent echo $send_email?"<h1> Mensaje enviado</h1>":"<h1> Mensaje no enviado</h1>";
Fuente: codexworld.com