mail con adjunto en PHP

Enviar un correo con archivo adjunto usando PHP mail()

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.

Manos a la obra

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>
    <label>Nombre y Apellido</label>
    <input id="nombre" name="nombre" required="" type="text" value="" />
  </div>
  <div>
    <label>E-mail</label>
    <input id="email" name="email" required="" type="email" value="" />
  </div>
  <div>
    <label 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 adjunto ningun archivo');
    }
      
    //Leer el archivo y codificar 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>
    ";
}

EDIT:

Si recibís un error «Parse error: syntax error, unexpected ‘;’ » tenes que modificar la linea 1 del código enviar.php que debe quedar de la siguiente forma:

if($_POST && isset($_FILES[‘my_file’])) {

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).


Si te gustó o te entretuvo el contenido de este posteo, haciendo un click en los avisos me ayudas a mantener el sitio con vida y a seguir publicando.

Y si quieres ganar algo de dinero sin esfuerzo, registrate en IPRoyal desde este banner y recibí 1 dolar de regalo al comenzar a usar la aplicación para generar ingresos pasivos.

ingresos pasivos Pawns.app

Acá puedes conocer más sobre ingresos pasivos, que es y como funciona IPRoyal Pawns.

12 comentarios en «Enviar un correo con archivo adjunto usando PHP mail()»

    1. De nada.
      Voy a tomar en cuenta tu comentario y empezaré a dejar los estilos también.
      En general no lo hago para que cada uno los personalice en función del sitio donde los va a usar.
      Saludos!

  1. Buenas noches, tengo un problema con el código enviar porque cuando lo ejecuto sale el siguiente mensaje: Parse error: syntax error, unexpected ‘;’ in /home1/proyectosolucion/public_html/contacto/enviar.php on line 3.
    en tu caso la linea 1 viene ser mi linea 3.

    1. Hola Michael, como estas?
      Ahí vi el error. Tenes que modificar mi linea 1, la del if, para que quede así:

      if($_POST && isset($_FILES[‘my_file’])) {

      Fijate que te marque en negritas los dos ampersand (&)… porque el plugin del WordPress que uso para el código lo convirtió en

      & amp; & amp;

      y eso es lo que te genera el error.
      De todas formas ahora lo voy a editar para que el código quede correcto.
      Gracias por hacérmelo notar
      Saludos!

    1. Hola Rafael, como estas?
      Si, seria posible, pero la idea de este ejemplo es poder enviar un archivo adjunto, por lo que tendrías que usar un código completamente distinto.
      Desde la primera linea del archivo enviar.php que valida la existencia del archivo isset($_FILES['my_file']) en adelante. Haciendo varias validaciones para determinar si tenes que leer el archivo, codificarlo y finalmente, ver si al momento de armar el mensaje tenes que agregar un adjunto o no.

    1. Luchito, para que el ejemplo funcione, si lo estas probando en tu propia maquina, tienes que tener instalado y funcionando un servidor de correo. Sino, tienes que probarlo directamente en algún hosting.
      El error que te aparece es porque no se pudo enviar el correo.

Deja un comentario