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.
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
Excelente!!, gracias por tu aporte
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!
Hola,
Una solución es programar la subida del archivo al servidor para luego enviarla adjunta en el email.
Saludos
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
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
como haria para que el archivo pdf que intento enviar lo pueda seleccionar desde un type=file ?
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
Fue de gran ayuda además de que esta muy bien explicado y funciona muy bien.. salu2
Hola jose . El codigo esta bueno sirve para enviar el adjunto pero no hacia
Como se puede hacer??
Hola, nos puedes explicar con mas detalles que ocurre? Saluds
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.
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
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.
Hola buenos días,
Para este tipo de ayudas que se salen de lo que hay en el blog debe enviarnos un ticket al centro de soporte y allí le indicaremos como podemos proceder:
https://www.jose-aguilar.com/soporte/
Saludos
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
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
hola, me descargue los archivos y los probe en un servidor pero no llegam los mail, debo cambiar alguna configuracion o modificar el php?
hola, revisa el phpinfo para ver si es posible enviar emails. saludos
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
Hola, lo hemos subido a GitHub:
https://github.com/joseaguilarblog/send-email-attachment/
Saludos
s qe estapregunta es medio tonta, pero para que corra necesit tener el codig alojado en un servidor web verdad?
efectivamente. En localhost no funciona
saludos jose he estado corriendo tu cigo pro me lanza error de autentcacion, me podria ayudar??? gracias de antemano.
hOla buenas tardes, para ayudarte necesitaríamos ver el problema en directo. Quizás una url nos vendría bien. Saludos
no me funciona
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!
Hola Jose, una consulta, como tengo que hacerlo para poder enviar más de un archivo ?
Saludos,
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?.
HOla,
Si estás utilizando PHPMailer para enviar los emails tan solo tienes que añadir la siguiente linea:
$mail->AddAttachment($archivo,$archivo);
Saludos
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.
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!
Hola yo creo que simplemente tienes que modificar la siguiente linea:
$archivo = ‘prueba.pdf’;
Por
$archivo = ‘(ruta del archivo)/prueba.xls’;
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.
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.
HOLA PARA ENVIAR UN ADJUNTO ES NECESARIO CONFIGURAR SMTP.. EN EL SCRIPT
En principio no hace falta
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.
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»);
pUEDES PASARME EL ARCHIVO PUES NO ME EJECUTA BIEN
funciona pero como le hago para anexar el archivo desde un input en html?
Necesitarás que tu página sea .php y utilizar un script similar al siguiente:
http://www.jose-aguilar.com/blog/upload-de-archivos-con-php-version-2-0/
Espero te sirva,
saludos
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.
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