Seguramente sepas como hacer para enviar un correo electrónico usando la función mail() de PHP. Un par de líneas de código y listo.

Pero cuando un cliente te pide poder recibir un curriculum como adjunto desde un formulario web, ahí la cosa se complica un poco. La lógica seria usar una librería como PHP Mailer que hace todo el trabajo sucio de manejar el archivo, adjuntarlo y enviarlo.

Sin embargo, con algunas modificaciones al formulario tradicional, es posible adjuntar un archivo de cualquier tipo y enviarlo mediante la función mail() de PHP tradicional.

mail con adjunto en PHP
Adjuntar un archivo

Ahora vamos a ver como hacerlo con un ejemplo completo y funcional. Primero vamos a crear el formulario que se ve en la imágen. Sencillo, con dos campos y el botón para seleccionar el archivo que vamos a enviar como adjunto. En este caso, lo más importante a tener en cuenta a la hora de trabajar con archivos, es que el atributo enctype del formulario tiene que ser “multipart/form-data“:

<form id="formulario" action="enviar.php" enctype="multipart/form-data" method="post" name="formulario">
  <div class="form-group">
    <label>Nombre y Apellido</label>
    <input id="nombre" class="form-control" name="nombre" required="" type="text" value="" />
  </div>
  <div class="form-group">
    <label>E-mail</label>
    <input id="email" class="form-control" name="email" required="" type="email" value="" />
  </div>
  <div class="form-group">
    <label style="border-bottom: 1px solid #000;" for="File">Desde aqui podra subir su CV...</label>
    <input id="my_file" name="my_file" type="file" />
  </div>
  <button class="btn btn-danger" type="submit">Enviar</button>
</form>

A continuación el código completo del archivo php que se encarga de realizar el envío. Este archivo tiene que tener el mismo nombre que el atributo “action” del formulario anterior, en este caso, debe ser enviar.php:

if($_POST && isset($_FILES['my_file'])) {
    $recipient_email = 'email@destinatario.com'; //Direccion de correo de quien recibe el mail
    $subject         = "Asunto del mensaje.";
    
    //Capturo los datos enviados por POST 
    $from_email     = filter_var($_POST["email"], FILTER_SANITIZE_STRING); 
    $sender_name    = filter_var($_POST["nombre"], FILTER_SANITIZE_STRING);
    $reply_to_email = filter_var($_POST["email"], FILTER_SANITIZE_STRING); 

    //Armo el cuerpo del mensaje    
    $message = "Nombre: " . $sender_name . "\n";
	$message = $message . "Email: " . $from_email . "\n";

    //Obtener datos del archivo subido 
    $file_tmp_name    = $_FILES['my_file']['tmp_name'];
    $file_name        = $_FILES['my_file']['name'];
    $file_size        = $_FILES['my_file']['size'];
    $file_type        = $_FILES['my_file']['type'];
    $file_error       = $_FILES['my_file']['error'];

    if($file_error > 0)
    {
        die('Error al subir el archivo. No se adjunt&oacute; ning&uacute;n archivo');
    }
    
    //Leer el archivo y codificarlo el contenido para armar el cuerpo del email
    $handle = fopen($file_tmp_name, "r");
    $content = fread($handle, $file_size);
    fclose($handle);
    $encoded_content = chunk_split(base64_encode($content));

    $boundary = md5("pera");
    //Encabezados
    $headers = "MIME-Version: 1.0\r\n"; 
    $headers .= "From:".$from_email."\r\n"; 
    $headers .= "Reply-To: ".$reply_to_email."" . "\r\n";
    $headers .= "Content-Type: multipart/mixed; boundary = $boundary\r\n\r\n"; 
        
    //Texto plano
    $body = "--$boundary\r\n";
    $body .= "Content-Type: text/plain; charset=ISO-8859-1\r\n";
    $body .= "Content-Transfer-Encoding: base64\r\n\r\n"; 
    $body .= chunk_split(base64_encode($message)); 
        
    //Adjunto
    $body .= "--$boundary\r\n";
    $body .="Content-Type: $file_type; name=".$file_name."\r\n";
    $body .="Content-Disposition: attachment; filename=".$file_name."\r\n";
    $body .="Content-Transfer-Encoding: base64\r\n";
    $body .="X-Attachment-Id: ".rand(1000,99999)."\r\n\r\n"; 
    $body .= $encoded_content; 
    
    //Enviar el mail
    $sentMail = @mail($recipient_email, $subject, $body, $headers);

    if($sentMail) //Muestro mensajes segun se envio con exito o si fallo
    {       
		echo"
			<h2>Gracias por tu contacto, $cvnombre</h2>
	 		<div>Tu mensaje fu&eacute; enviado con &eacute;xito.</div>
	 	";
    }else{
		echo "
			<h2>Se produjo un error y su pedido no pudo ser enviado</h2>
		";
    }

}
else{
	echo "
		<div>No se adjunt&oacute; ning&uacute;n archivo</div>
	";
}

Listo, eso es todo. No te olvides de configurar el valor de las variables ‘$recipient_email’ (la dirección de correo de quien recibirá el mail) y ‘$subject’ (El asunto del mensaje).