Enviar email con múltiples adjuntos en PHP

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

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP