:::: MENU ::::

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 = "<strong>Mensaje</strong><br><br>";
	$body.= $_POST['mensaje']."<br>";
	$body.= "<i>Enviado por http://blog.unijimpe.net</i>";
	$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.


128 Comentarios

  • Irving |

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

  • Julio59 |

    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 |

    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 |

    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 |

    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 |

    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.

  • Patricio |

    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 |

    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 |

    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 |

    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 |

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

  • Peter |

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

  • Gala |

    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!!

  • decoracion con globos |

    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 |

    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 |

    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 |

    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 |

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

  • edmilson |

    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?

Publica tu comentario

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