Como enviar un correo electrónico con archivos adjuntos con PHP 📨.
Puede ser que necesitemos crear una función para enviar un correo electrónico con un archivo adjunto, como respuesta a un formulario o para realizar publicaciones en otros servidores.
Si utilizamos una plataforma que en al que podemos programar y ejecutar PHP debemos asegurarnos que se encuentre instalado sendmail.
Si somos el administrador de nuestro propio servidor, podremos instalarlo desde el terminal:
sudo apt-get install sendmailSi somos invitados en el servidor, lanzaremos un script para comprobar si podemos utilizar la función mail:
<?php
ini_set( 'display_errors', 1 );
error_reporting( E_ALL ); //Comprobaremos si ha sido enviado o no
$from = "TU CORREO ELECTRONICO"; //La dirección de correo desde que la enviamos
$to = "DESTINATARIO"; //Dirección de correo a la que enviamos el mail
$subject = "Probando PHP mail"; //Encabezado del correo
$message = "PHP mail funciona correctamente"; //El mensaje
$headers = "From:" . $from; //Cabecera que dejamos tal cual
mail($to,$subject,$message, $headers); //Enviamos el correo
echo "The email message was sent."; //Confirmamos que el correo ha sido enviado
?>
Si hemos recibido el correo, podremos continuar con la programación de nuestra función.
//Recipiente
$to = 'DESTINATARIO'; //A quien le enviamos nuestro correo
//remitente del correo//Desde que correo le envamos y quien será el destinatario de la respuesta si lo hubiera
$from = 'NUESTRO CORREO ELECTRONICO';
$fromName = 'UN NOMBRE, O NICK DESCRIPTIVO'; //Quienes somos o nuestra organización
//Asunto del email
//Utilizamos la función utf8_decode() para que nos reconozca las tildes y la ñ, entre otros caracteres$subject = utf8_decode('ASUNTO DEL CORREO');
//Ruta del archivo adjunto
$file = 'DIRECCIÓN GLOBAL DEL ARCHIVO QUE VAMOS A ENVIAR';
//Contenido del Email
//La función htmlentities() nos convertira las tildes ñ y caracteres especiales en etindades HTML
$htmlContent = htmlentities('CONTENIDO DEL CORREO CODIFICADO EN HTML');
//Encabezado para información del remitente
$headers = "De: $fromName"." <".$from.">";
//Limite Email
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
//Encabezados para archivo adjunto
$headers .= "\n MIME-Version: 1.0 \n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\"";
//límite multiparte
$message = "--{$mime_boundary}\n" . "Content-Type: text/html; charset=\"UTF-8\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" . $htmlContent . "\n\n";
//preparación de archivo
if(!empty($file) > 0){
if(is_file($file)){
$message .= "--{$mime_boundary}\n";
$fp = @fopen($file,"rb");
$data = @fread($fp,filesize($file));
@fclose($fp);
$data = chunk_split(base64_encode($data));
$message .= "Content-Type: application/octet-stream; name=\"".basename($file)."\"\n" .
"Content-Description: ".basename($file)."\n" .
"Content-Disposition: attachment;\n" . " filename=\"".basename($file)."\"; size=".filesize($file).";\n" .
"Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
}
}
$message .= "--{$mime_boundary}--";
$returnpath = "-f" . $from;
//Enviar EMail
$mail = @mail($to, $subject, $message, $headers, $returnpath);
Esta función requiere mucho tiempo de ejecución y no es recomendable para el envio masivo de correos electronicos.