Como enviar correo electronico con archivo adjunto en PHP

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 sendmail
Si 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.

No hay comentarios: