Enviar Email con Adjuntos

La presente es una breve guía para implementar un formulario para enviar email con archivos adjuntos, para ello utilizaremos la librería PHPMailer, de la cual ya hemos hablado en Introducción a PHPMailer.

mailattach.gif

Creando el Formulario
Lo primero es crear un formulario en el cual el usuario ingresará los datos del destinatario, asunto, mensaje y seleccionar el archivo que se desea adjuntar. Para ello creamos un formulario con los campos necesarios:

<form action="" method="post" enctype="multipart/form-data">
Destinatario <input type="text" name="destino"><br>
Asunto <input type="text" name="asunto"><br>
Adjunto <input type="file" name="archivo"><br>
Mensaje <textarea name="mensaje"></textarea><br>
<input type="submit" name="btsend" value="Enviar Email">
<input type="hidden" name="action" value="send" />
</form>

Notese que hemos utilizado la propiedad enctype con la cual permitimos el envío de archivos adjuntos en el formulario. Además hemos agregado un campo oculto llamado action para verificar que se ha enviado el formulario.

Enviando el Email
Es el momento de recibir los datos enviados en el formulario y enviarlos por email, para ello utilizaremos la clase PHPMailer para lo cual lo adjuntamos en la primera linea. Lo que sigue es verificar si se ha envíado el formulario para ello comprobamos la variable action del formulario. Luego recuperamos el nombre del archivo adjunto y el archivo temporal en las variables $varname y $vartype. Lo siguiente es crear una instancia de la clase PHPMailer donde le pasamos todas las variables necesarias.

require("class.phpmailer.php");
if ($_POST['action'] == "send") {
	$varname = $_FILES['archivo']['name'];
	$vartemp = $_FILES['archivo']['tmp_name'];
	
	$mail = new PHPMailer();
	$mail->Host = "localhost";
	$mail->From = "blog@unijimpe.net";
	$mail->FromName = "Blog Unijimpe";
	$mail->Subject = $_POST['asunto'];
	$mail->AddAddress($_POST['destino']);
	if ($varname != "") {
		$mail->AddAttachment($vartemp, $varname);
	}
	$body = "Mensaje

"; $body.= $_POST['mensaje']."
"; $body.= "Enviado por http://blog.unijimpe.net"; $mail->Body = $body; $mail->IsHTML(true); $mail->Send(); }

En el código anterior hay que notar que hemos verificado si existe un archivo adjunto para luego añadirlo como adjunto utilizando la propiedad AddAttachment. Finalmente asignamos el texto del mensaje y procedemos a enviar el correo con $mail->Send().

No olvidar que estamos utilizando PHPMailer, asi que es necesario descargar los archivos fuente de esta clase. Para finalizar he creado un archivo de prueba en http://samples.unijimpe.net/mailattach.php y también les dejo los archivos fuente para su descarga.

Comentarios Total 131 comentarios

Roberto
Publicado: 17/11/2010 12:01 pm

Hola, el blog super bueno..Felicitaciones

Mi consulta es la siguiente:

Recibo el correo pero no el documento adjunto q’ podra ser ???

Gracias

carlos
Publicado: 22/11/2010 6:18 pm

algun servidor de correo que me recomiendes para probar

enviar e-mail con adjunto. bloqueado
Publicado: 14/12/2010 3:10 pm

[…] enviar e-mail con adjunto. bloqueado Buenas, Encontre esto aver si esto te vale http://blog.unijimpe.net/enviar-email-con-adjuntos/ Saludos Reply With […]

Angel
Publicado: 24/01/2011 2:50 pm

Hola, excelente explicación.

Seria posible que la imagen adjunta aparesca dentro del contenido del mensaje? Por ejemplo, si es un formulario de bolsa de trabajo y se requiere la fotografia del solicitante…podria estar embebida en el $body?

NIco
Publicado: 22/02/2011 12:25 pm

Hola, como estan, gracias por este codigo me vino de primera, pero tengo un problemita, me funciona perfecto con «crome» pero no con mozilla ni con IE.
alguien me puede ayudar, adjunto el codigo ya que le hice algunas adaptaciones..

muchas gracias

Irving
Publicado: 17/03/2011 11:23 pm

Hola me da este error «Could not instantiate mail function. » alguien tiene la solucion?

Julio59
Publicado: 18/03/2011 2:47 am

Magnifico blog felicitaciones unijimpe y a todos los que ponen sus conocimientos aqui, gracias

a quien me pueda ayudar

mi problema es que tube que hacer dos archivos separados para enviar los emails y un buen rollo de cosas, si lo pongo en la forma mas sencilla, el formulario en html y el PHPMailer en php al correrlo me sale el sgte error

Notice: Undefined index: action in C:\Miweb\mailattach.php on line 4, que es la linea donde esta:
if ($_POST[‘action’] == «send») {

al regresar a la pag siempre sale el error

ayuda porfavor, gracias anticipadas

Julio59
Publicado: 22/03/2011 10:23 pm

Gracias amigos, segui buscando y encontre la solucion, y para el que tenga este problema aqui le va:

if (isset($_POST[‘action’]) && $_POST[‘action’] == «send») {

moises
Publicado: 01/04/2011 2:59 pm

Hola, quería preguntar alguien sabe como enviar los datos del formulario como archivo adjunto a un correo???

encontré como hacerlo con php en http://www.desarrolloweb.com/articulos/1694.php pero la verdad no pude hacerlo funcionar ….. les ruego si alguién pudiese interesarse y ayudarme en esto por favor mi mail es moisesneveu @ gmail

Además creo que UNIJIMPE podría mejorarlo y ponerlo aqui en esta web…

Saludos a todos y muchas gracias.

Ruben Juarez
Publicado: 21/05/2011 11:36 am

me aparece esto en arriba del formulario en el navegador
Notice: Undefined index: action in C:\wamp\www\PruebasPHP2\formularioMail.php on line 3

Patricio
Publicado: 20/06/2011 11:19 pm

Hola, necesito hacer una consulta a lo mejor alguien me puede ayudar. Tengo una pagina web y dentro un formulario de contacto, hace un tiempo no me esta funcionando el envío ya que en el hosting esta bloqueda esta forma de envío debido a que no tiene ninguna verificación. Me comunique con ellos y me informaron que debido a un Spam que perjudico a la empresa optaron por esta opcion de bloqueo ( lo cual lo encuentro razonable), me dijeron que implementara en mi formulario el sistema phpmailer. Mi formulario es super sencillo nombre,correo, teléfono y mensaje el cual me llega a mi correo , me pueden ayudar a implementar este sistema por favor, lo necesito urgente.

Gracias.

unijimpe
Publicado: 21/06/2011 10:04 am

Patricio, ese el problema de contratar hosting barato, en muchas ocaciones te bloquean el envío de correos o tienen IPs que estan marcados en el Black List de SPAM.

Ahora si tienes que hacer el envío utilizando PHPMailer, puedes leer el siguiente artículo: http://blog.unijimpe.net/introduccion-a-phpmailer/

Patricio
Publicado: 21/06/2011 8:41 pm

Gracias por contestar unijimpe, no si no es para nada barato, se paga $ 40.000 anuales en Chile ( U$ 84 aprox. ) pienso que no es poco, si el hosting es muy bueno. Voy a ver lo que me propones y te aviso como me fue.

Gracias.

Patricio
Publicado: 21/06/2011 8:59 pm

Disculpa que sea tan tonto pero como lo puedo implementar en mi formulario HTML, te puedo enviar el formulario que tengo para que me ayudes por favor?, realmente estoy totalmente atorado. Si no puedes lo comprenderé. Realmente hay cosas que se como se cambiarían pero hay otras que son mas técnicas y esas no las entiendo.

Gracias

Larry
Publicado: 30/06/2011 2:54 pm

unijimpe:
Primeramente aprovecho para felicitarte por el blog y agradecerte el acceso a tanta información valiosa de la cual mucho hemos aprendido.

Te agradecería si es posible, me indicaras como agrego un captcha a este script (php no es mi fuerte), ya lo intenté con reCaptcha y con otros captcha pero aunque no le escriba el código, el mensaje y el adjunto llegar al email perfectamente.

Desde ya, muchas gracias por tu atención y paciencia para los que estamos aprendiendo. Saludos cordiales

javier
Publicado: 04/07/2011 3:41 pm

Que tal, probe el código del ejemplo de mail y adjunto, pero me marca un error, es el siguiente: «Could not instantiate mail function.» No se que podría ser, espero ma puedan dar alguna ayuda.
Gracias!!

David
Publicado: 18/07/2011 7:50 pm

grande maestro!!! muchas gracias, estaba buscando esto por mucho tiempo, funciona a la primera. te pasaste.
me encanta tu blog.
saludos

agustin
Publicado: 22/08/2011 2:28 am

si me funcione pero no vemo los archivos adjuntps

Peter
Publicado: 30/08/2011 7:12 pm

Hola utilice el formulario, cambie algunos cogidos pero como lo podria validar porque intente validarlo con java script y no pude.

Gala
Publicado: 31/08/2011 12:27 pm

Hola, muchas gracias por la ayuda, me funcionó todo perfecto, menos una cosa, necesito adjuntar más de un archivo y no consigo encontrar la manera.

Lo he buscado en la documentación de la web del autor pero tampoco encuentro la solución, ¿alguien puede ayudarme? por favor, es muy importante.

¡¡Muchas gracias!!

rs
Publicado: 07/09/2011 5:23 pm

excelente me ayudo mucho

decoracion con globos
Publicado: 17/11/2011 10:46 am

Estoy tratando de aplciar esto del archivo adjunto, tengo un formulario que lleno y lo guardo, y lo programo para que se envie 24 horas despues automaticamente, y despues otras 24 horas otra vez lo enia automaticamente. Mi pregunta es, cuanto tiempo se mantiene el archivo temporal. Y si se puede hacer esto que quiero hacer.

Carlo
Publicado: 05/01/2012 2:15 pm

Hola, antes que nada gracias por los buenos post me han servido de mucho
pero tengo un pequeño problema y que ria ver si me pueden ayudar.

lo que quiero hacer es al terminar de mandar el mail
redireccionar a otra pagina
en php lo estoy haciendo con header(‘location:paginados.php’);
pero me marca un warring Cannot modify header information – headers already sent by

alguna idea de como solucionarlo o de como hacer lo que pretendo de antemano gracias

patricio silva
Publicado: 01/02/2012 9:38 am

hola muy bueno dias la consulta que tengo esque ejecuto el programa y me sale que envia correctamente pero no manda a mi correo bueo dejo el codigo como lo tengo para ver si me pueden indicar la falla:

Host = «localhost»;
$mail->From = «lordblack_snake@hotmail.com»;
$mail->FromName = «correo hotmail»;
$mail->Subject = $_POST[‘asunto’];
$mail->AddAddress($_POST[‘destino’]);
if ($varname != «») {
$mail->AddAttachment($vartemp, $varname);
}
$body = «Mensaje«.$_POST[‘mensaje’].»»;
$body.= «Enviado por http://www.hotmail.com«;
$mail->Body = $body;
$mail->IsHTML(true);
$mail->Send();
$msg = «Mensaje enviado correctamente»;
}
?>

PHP Email Attach

Envíar Email con Adjuntos
Ingresar los datos en el formulario.

Destinatario

Asunto

Adjunto

Mensaje

por favor ayudenme es mi trabajo para mi curso de verano de php

MAria
Publicado: 25/05/2012 8:41 pm

saludos,
Primero agradecer infinitamente por toda la informacion.
Segundo, tengo un problema con el envio de datos adjuntos,
el mensaje llega sin ningun problema. Mi servidor de correos
es contratado pero mi servidor web es local.Como es que tengo que colocar la ruta del archivo a adjuntar????

Porfas…es de vida o muerte…

Gracias de antemano.

yony
Publicado: 08/06/2012 12:17 pm

no envia correo a hotmail, gmail. pero a otros si.. ?? que se pude hacer

Marina
Publicado: 24/07/2012 12:21 pm

Genial el tutorial, me funciona perfecto. Ahora te hago una pregunta, puedo hacer que esto sea obligatorio en mi formulario? te muestro lo que estoy haciendo…
http://www.kingdomconsultora.com.ar/consultora/bolsadetrabajo/bolsadetrabajo.php

edmilson
Publicado: 24/07/2012 4:57 pm

hola , lo he probado , me envia el email pero no el anexo ,,llevo dias intentado ,con la class php mailer he leido 1milion de tutos y no encuentro solucion, mi host es 1and1 ,sera este el problema?

diego
Publicado: 22/05/2015 5:35 am

Buenas unijimpe, copie tu codigo y añadi al final lo siguiente:

if(!$mail->Send()){
echo "Error";
}else{
echo "Mensaje enviado!!";
}

El caso es que me aperece la linea mensaje enviado pero no llega el correo a la direccion que especifico. La cuenta es de gmail, podrias ayudarme?

Un saludo y gracias!

diego
Publicado: 22/05/2015 6:01 am

Hola otra vez, se me olvidaba decir que estoy intentando mandarlo desde un servidor local, no lo tengo subido a un host, por si tuviera algo que ver.

Gracias de nuevo.

unijimpe
Publicado: 31/05/2015 9:26 pm

Diego, es probable que lo este marcando como SPAM y por ello no llega a la bandeja de correo. Te recomiendo usar login con SMTP para asegurarte que no llegue al SPAM.

 

Comentar

En este blog los comentarios están moderados, serán mostrados cuando el administrador los apruebe. Por favor, evita comentarios ofensivos u obscenos por que no serán aprobados.
Si deseas publicar código fuente debes hacerlo entre las etiquedas <code> y </code>, además debes reemplazar los carácteres < por &lt; y > por &gt;.

(Requerido)

(Requerido, no será publicado)

(Requerido)

(Tags aceptados: <a> <em> <strong> <code> <ul> <li>)