Enviar archivos adjuntos con PHPMailer

En este artículo vamos a aprender a enviar archivos adjuntos en un email o correo electrónico utilizando para ella la clase PHPMailer.

También se puede hacer con la función mail() de PHP pero no es una función tan segura y carece de algunas funcionalidades como por ejemplo enviar contenido HTML o imágenes que con PHPMailer podemos lograr con simples lineas de código.

En el ejemplo que vamos a ilustrar vamos a tener un formulario en el cual solo vamos a proporcionar un dato, el email de destino al cual vamos a enviar el email con el archivo adjunto.

<form action="index.php" method="post">
<h3>Envíate un email con archivo adjunto</h3>
<table>
    <tr>
        <td>Email:</td>
        <td><input type="text" name="email" value="<?=$_POST['email']?>"></td>
        <td><input type="submit" name="recibir" value="Recibir email"/></td>
    </tr>
</table>
</form>

Un formulario sencillo con un solo campo y que se procesa por el método tracional mediante el método POST.

El código que recibe los datos de este formulario será el siguiente:

<?php
function comprobar_email($email) {
    return (filter_var($email, FILTER_VALIDATE_EMAIL)) ? 1 : 0;
}

if (isset($_POST['recibir'])) {
    if (comprobar_email($_POST['email'])) {
        require_once("classes/class.phpmailer.php");
        $mail = new PHPMailer();
        $mail->From = "from@domain.com";
        $mail->FromName = "Jose Aguilar";
        $mail->Subject = "Demo de PHPMailer";
        $mail->Body = "Hola, esto es una demo de envio de emails con archivos adjuntos!!!";
        $mail->AddAddress($_POST['email'], "User Name");
        $archivo = 'prueba.pdf';
        $mail->AddAttachment($archivo,$archivo);
        $mail->Send();
        echo '<p>Se ha enviado correctamente el email a '.$_POST['email'].'!</p>';
    }
    else {
        echo '<p>El email introducido no es correcto!</p>';
    }
}
?>

En este caso, somos algo precavidos y tendremos una función para comprobar que el email introducido cumple con el patrón de emails.

Tras pulsar el botón de enviar del formulario se comprueba que el email cumpla con el patrón de emails y si es correcto incluimos la clase PHPMAILER y creamos una instancia, asignamos algunos atributos de la clase como son el from, FromName, Subject, Body…, añadimos el email de destino y adjuntamos el archivo, en este caso un archivo PDF de prueba.

Envíate un email para probar el ejemplo

Ver en GitHub

Autor
Escrito por Jose Aguilar - Director ejecutivo y tecnológico en JA Modules. Experto programador PrestaShop y Experto programador WordPress.
Te ha servido? Valora esta entrada!
(16 votos, promedio: 5 de 5)
Comparte en las redes sociales
¿Buscas trabajo de programador?

44 respuestas a “Enviar archivos adjuntos con PHPMailer”

  1. Richard dice:

    Los archivos adjuntos llegan mal.. Osea no se pueden descargar, se dañan… le puse asi: $mail->AddAttachment($ruta,$nombre); y tambien asi $mail->AddAttachment($nombre,$ruta); en ambos casos el archivo llega dañado

  2. camilo dice:

    Excelente!!, gracias por tu aporte

  3. Andy dice:

    Hola José ,muchas gracias por tu ayuda.
    Si quiero que el usuario envíe una foto 4×4 y me llegue esa foto como hago?
    En este ejemplo toma un archivo del servidor pero yo quiero que cada usuario mande su foto.

    Desde ya, muchas gracias!

  4. Luis Lalo hdz dice:

    cómo hago que el formulario me llegue a mi y a la persona que lleno el formulario le llegue otro correo con un pdf

    • Jose Aguilar dice:

      Hola,

      Una posibilidad es crear 2 objetos de tipo PHPMailer para enviar el mismo mensaje a 2 destinatarios. PHPMailer también tiene la posibilidad de enviar correo a varios destinatarios. En Google puedes encontrar algo de información sobre eso.

      Saludos

  5. herb dice:

    como haria para que el archivo pdf que intento enviar lo pueda seleccionar desde un type=file ?

    • Jose Aguilar dice:

      Hola,

      El archivo que desea subir el usuario que debe estar en el array $_FILES que envía el formulario debes guardarlo en el servidor. Luego coger la ruta del servidor y adjuntarlo al email.

      Saludos

  6. PEDRO SANCHEZ dice:

    Fue de gran ayuda además de que esta muy bien explicado y funciona muy bien.. salu2

  7. Jose casnaova dice:

    Hola jose . El codigo esta bueno sirve para enviar el adjunto pero no hacia
    Como se puede hacer??

  8. Hola José
    estoy utilizando phpmailer y me da el siguiente error:

    — undefined function set_magic_quotes_runtime() —

    borro la linea para evitar la llamada a la función, funciona bien el procedimiento pero el subject me llega de la siguiente manera:

    =?iso-8859-1?Q??=

    Sabes por qué ?

    Muchas Gracias.

    • Jose Aguilar dice:

      Hola,

      Es muy probable que la función set_magic_quotes_runtime() ya no esté disponible en la versión PHP que estés utilizando. Quizá debes actualizar la librería PHPMAILER o enviar un ticket al servicio de alojamiento para ver si es posible habilitar esta función.

      Saluos

  9. Gian dice:

    Hola Buenas tardes:

    Podria ayudarme; necesito adjuntar en el correo un archivo que esta almacenado en una base de datos en un campo BLOB especificamente es un Zip… si tuviera un ejemplo.
    Muchas gracias.

  10. Eric dice:

    Buenas tardes,

    Estoy haciendo un formulario en php donde se envían datos a una cuenta de correo y el usuario también debe adjuntar una imagen de su ordenador.
    Después de leer los comentarios, he visto que un usuario quería algo parecido así que fui a la página: https://www.jose-aguilar.com/blog/upload-de-archivos-con-php-version-2-0/
    He ejecutado el código tal y como lo muestras pero tengo un problema: Una vez seleccionada la imagen, cuando le doy al botón submit la imagen es como reemplazada.
    Así pues, no me detecta la imagen y, por lo tanto, el email se envia pero sin el archivo.
    Como puedo solucionarlo?
    Muchas gracias

    • Jose Aguilar dice:

      Hola buenas tardes,

      Siento decirle que no le acabamos de entender. Reemplazada como? que estás subiendo la misma imagen o con el mismo nombre? prueba a subirla con otro nombre es mi recomendación.

      Saludos

  11. Norma dice:

    hola, me descargue los archivos y los probe en un servidor pero no llegam los mail, debo cambiar alguna configuracion o modificar el php?

  12. Gabriel dice:

    Hola José, te importaría pasarme el código del ejemplo completo con la clase PHPMailer? es que ya he salido loco con todo esto. Si es así te lo agradecería mucho. Gracias

  13. Pedro dice:

    s qe estapregunta es medio tonta, pero para que corra necesit tener el codig alojado en un servidor web verdad?

  14. Jesus dice:

    saludos jose he estado corriendo tu cigo pro me lanza error de autentcacion, me podria ayudar??? gracias de antemano.

  15. jorge dice:

    no me funciona

  16. gustavo dice:

    Hola Jose, tengo un problema al enviar muchos mails con adjuntos que son archivos csv. El tema es que los limita al tamaño 3.2 Kb, no uso formularios, directamente uso archivos que tengo en el servidor para mandarlos. Usando formularios vi que se agrega un campo hidden MAX_FILE_SIZE, pero no es mi caso, probé subiendo el limite de upload en apache pero tampoco me funcionó, donde se setea ese límite? gracias!

  17. camila dice:

    Hola Jose, una consulta, como tengo que hacerlo para poder enviar más de un archivo ?

    Saludos,

  18. Alito dice:

    yo ya tengo un formulrio donde los datos me llegan al mail. Pero quisiera agregrle al cliente/visitante la opción de adjuntar una imagen. ¿qué debo agregar al PHP?.

    • Jose Aguilar dice:

      HOla,

      Si estás utilizando PHPMailer para enviar los emails tan solo tienes que añadir la siguiente linea:

      $mail->AddAttachment($archivo,$archivo);

      Saludos

  19. Mario dice:

    Buenas excelente tutorial, como hago para elegir el archivo con un boton «search», eso en caso que fuera para elegir un archivo cada vez diferente sin tener que estar tocando el código?

    De antemano muchas gracias.

  20. Mikel G. dice:

    Hola amigos..queria preguntar algo…hay forma de enviar dicho correo pero tomando como archivo adjunto uno que tengo en el servidor…por ejemplo…suponiendo que tengo un archivo excel…(prueba.xls) que esta en una carpeta del servidor como lo apunto en un campo para que se envie?…muchisimas gracias!

    • Jose Aguilar dice:

      Hola yo creo que simplemente tienes que modificar la siguiente linea:

      $archivo = ‘prueba.pdf’;

      Por

      $archivo = ‘(ruta del archivo)/prueba.xls’;

  21. Humberto dice:

    Hola Jose, muy buen tutorial, gracias. Tengo una consulta, si quiero un formulario en el que el usuario adjunte y envíe pdfs. Una vez que se envíe el correo, ese pdf adjunto va a parar a algun directorio de mi servidor? hay alguna forma de saber o eliminar para que no llene el espacio de disco del servidor.? Eso es todo gracias.

    • Jose Aguilar dice:

      Los archivos que suban en un formulario irán a parar al servidor. Lo que puedes haces es un script que los elimine temporalmente. Puedes configurar un cron en el servidor que se ejecute cada cierto tiempo.

  22. Edgar dice:

    HOLA PARA ENVIAR UN ADJUNTO ES NECESARIO CONFIGURAR SMTP.. EN EL SCRIPT

  23. Ivan dice:

    hola, disculpa para poder usar la función phpmailer se necesita instalar algo o un código especifico o ¿para que sirve la linea require_once(«classes/class.phpmailer.php»); ?
    y ¿donde se le asigna el correo al que tiene que llegar?

    Gracias.

    • Jose Aguilar dice:

      Si, te tienes que descargar la clase phpmailer e incluirla en tu script tal como hago en los ejemplos.

      Al correo que le va a llegar se asigna con:

      $mail->AddAddress($_POST[‘email’], «User Name»);

  24. Jose dice:

    pUEDES PASARME EL ARCHIVO PUES NO ME EJECUTA BIEN

  25. stiven gordillo dice:

    funciona pero como le hago para anexar el archivo desde un input en html?

  26. Toni dice:

    Hola Jose,

    estoy utilizando phpMailer y funciona correcto. El problema es que las variables que recojo por $_POST y las asigno a $mail->Body, cuando leo el email veo los caracteres %20, F1, etc. para los caracteres ñ,ó, etc. Sabes como puedo solucionarlo ??

    gracias.

    • Jose Aguilar dice:

      Hola buenas tardes,

      Prueba con las tipicas funciones de codificación de php:
      utf8_encode($variable);
      o
      utf8_decode($variable);

      Y si no te resulta también puedes probar de guardar el archivo como utf8.

      Espero que te sirva,
      saludos

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.