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
