Hace mucho tiempo me volví loco para encontrar un script, función o cualquier tipo de ayuda para enviar un email con archivos adjuntos en PHP, ya que todo lo que encontraba no me funcionaba. Supongo que al igual que a mi, hay más gente en las mismas, por lo que me dispongo a copiar una función que encontré aquí. Está hecha de forma totalmente sencilla, en la que para ejecutarla, simplemente tengamos que escribir:

//Ejemplo de usar la función para enviar un fichero llamado fichero.exe que se encuentra en la misma ruta que el script
mail_attachment("fichero.exe","","destinatario@hotmail.com","remitente@delanover.com","Administrador","no-reply@delanover.com","Asunto","Mensaje de prueba");

En caso de que se ejecute correctamente veremos el mensaje de mail send … OK. En caso contrario, veremos el otro mensaje: mail send … ERROR!.

Recordemos que para usar este script, nuestro servidor web ha de ser capaz de enviar correos electrónicos. De no ser así, obviamente no funcionará, pero para los que esteis seguros que funciona, este script debería de funcionar.

Aquí la función:

function mail_attachment($filename, $path, $mailto, $from_mail, $from_name, $replyto, $subject, $message) {
    $file = $path.$filename;
    $file_size = filesize($file);
    $handle = fopen($file, "r");
    $content = fread($handle, $file_size);
    fclose($handle);
    $content = chunk_split(base64_encode($content));
    $uid = md5(uniqid(time()));
    $name = basename($file);
    $header = "From: ".$from_name." <".$from_mail.">\r\n";
    $header .= "Reply-To: ".$replyto."\r\n";
    $header .= "MIME-Version: 1.0\r\n";
    $header .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
    $header .= "This is a multi-part message in MIME format.\r\n";
    $header .= "--".$uid."\r\n";
    $header .= "Content-type:text/plain; charset=iso-8859-1\r\n";
    $header .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
    $header .= $message."\r\n\r\n";
    $header .= "--".$uid."\r\n";
    $header .= "Content-Type: application/octet-stream; name=\"".$filename."\"\r\n"; // use different content types here
    $header .= "Content-Transfer-Encoding: base64\r\n";
    $header .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n";
    $header .= $content."\r\n\r\n";
    $header .= "--".$uid."--";
    if (mail($mailto, $subject, "", $header)) {
        echo "mail send ... OK"; // or use booleans here
    } else {
        echo "mail send ... ERROR!";
    }
}

Un saludo, lipman