Finalmente, luego de bastantes consultas recibidas por este tema, he programado un formulario en PHP que permite a un usuario adjuntar múltiples archivos en un email.
Esta versión es una continuación de versiones anteriores del primer formulario de contacto en PHP. Este formulario -muy simple- permitía a los usuarios enviar un email. Para mi sorpresa, la cantidad de descargas de este script fue enorme. Por eso, me puse a programar una segunda versión incorporando algunos de los pedidos que me dejaron en los comentarios.
Así salió una segunda versión, que permitía cargar un archivo, que se copiaba en el servidor y enviaba el enlace al archivo en el email. Luego, utilizando la excelente clase PHP mailer, reprogramé la versión 2 y salió la versión tres, en la que el archivo va como adjunto en el email.
Este formulario también tuvo muchísimas descargas, y en los comentarios surgió una y otra vez la misma consulta: ¿Cómo hacer para adjuntar más de un archivo?
Esta nueva versión permite que los usuarios adjunten múltiples archivos a un email. El código está escrito en PHP. Y para manejar la carga de archivos múltiples, he utilizado la librería jQuery y un excelente plugin de jQuery llamado Multifile. En el caso de que javascript esté deshabilitado, el input vuelve por defecto a permitir cargar un sólo archivo.
El uso es muy sencillo. Es necesario editar las primeras lineas del archivo contactenos-v4.php para configurar 3 parámetros:
- la dirección de email a donde se enviará el formulario.
- la url donde está publicado el email
- la cantidad de archivos que vas a permitir adjuntar
$direccion_envio= ‘su@email.com’;
//la direccion a la que se enviara el email.
$url= ‘http://www.alfonsocatron.com.ar/ejemplos/form-adjunto-multiple’;
//la URL donde esta publicado el formulario. SIN la barra al final
$cantidad_archivos= 10;
//la cantidad máxima de archivos que se permitirá enviar.
Atención: Este formulario se ofrece solamente a modo de ejemplo, para demostrar una forma en la que se puede encarar el envío de archivos múltiples. Antes de usar este formulario en producción de sitios es importante verificar los campos para evitar inyección de headers, tamaño máximo de archivos, etc.
Bueno, espero que les sirva y no duden en enviar sus consultas. Acá pueden ver un Demo
Te sirvió el formulario y tenés ganas de agradecer?
TE FELICITO POR TU APORTE, PERO NO HE PODIDO CONFIGURARLO, ME SALE LO SIGUIENTE:
Warning: require(../../AppData/Local/Temp/Rar.493/inc/class.phpmailer.php) [function.require]: failed to open stream: No such file or directory in /home/cssei/public_html/contactenos.php on line 40
Warning: require(../../AppData/Local/Temp/Rar.493/inc/class.phpmailer.php) [function.require]: failed to open stream: No such file or directory in /home/cssei/public_html/contactenos.php on line 40
Fatal error: require() [function.require]: Failed opening required ‘../../AppData/Local/Temp/Rar.493/inc/class.phpmailer.php’ (include_path=’.:/usr/lib/php:/usr/local/lib/php’) in /home/cssei/public_html/contactenos.php on line 40
mmm, es raro.
Al descomprimir el archivo zip, deberías tener una carpeta /inc que contiene el archivo class.phpmailer.php. Ese es el archivo que está tratando de llamar el script y tira el error.
fijate si está bien eso.
saludos!
me han servido mucho los formularios , ahora necesito poder enviar videos cortos y mp3 para un evento de jazz, al incribir las bandas pero no he logfrado nada ni modificando la version tuya .3 pense que podia pedirles que enviaran los videos comprimidos en rar o zip pero no logro adjuntar ninguno y tampoco en extenciones mpeg o wmv, agradesco tu colaboracion
esta version no está limitando las extensiones de los archivos ni los tamaños.
Debería aceptar cualquier extensión y cualquier tamaño. Al enviar el formulario, ves algún error?
si , esta llegando el mensaje y aparece el nombre del archivo adjunto pero no llega el archivo como tal, no lo encuentro en ninguna parte, lo estoy reciviendo en un correo hotmail.
gracias
Alfonso Buenas tardes nada que he podido enviar archivos, estoy intentando con la ver 0.3 colocando un case para mp3 y uno para mpeg pero no me permite, tengo la duda respecto al codigo de este en el case siguiente :
case “application/octet-stream”:
$extension_type= explode (‘.’, $_FILES['archivo']['name']);
$ext= end($extension_type);
if($ext!=”rar”) {$ext=”error”;}
break;
default:
$ext=”error”;
break;
no se si es por esto que no deja aduntar .rar ni .zip
gracias
muy bueno el aporte pero no he podido hacer que me llegue el correo pero el archivo adjunto si sube al servidor y se aloja en la carpeta de archivo
Hola que tal, he probado el formulario y trabaja de maravilla. Lo he implementado en un proyecto pero tengo una duda, me gustaria saber si me podrias ayudar. Que tengo que hacer para que al presionar el boton enviar me aparezca un mensaje de que si estoy seguro que deseo enviar esa informacion, si le doy aceptar me envia los datos al correo, si le doy cancelar me regresa al formulario para poder corregir lo que escribi. Me podrias apoyar en ese sentido?.
Muchas gracias de antemano y felicidades por la pagina.
Hola Jesús,
me alegro que te haya servido el formulario.
Para avisar al usuario podés hacerlo con javascript, con un alert simple:
http://www.shiningstar.net/articles/articles/javascript/confirmsubmit.asp?ID=AW
en el alert podrías mostrar los campos que completo, y si está seguro y confirma, se envía el mail. O si no, se cancela y vuelve a editarlo.
O bien, con PHP.
En vez de hacer el envio del email en el primer submit, tendrías que armar otro form con la información en campos ocultos (o guardarlos en una sesión), en ese 2ndo paso ponés un echo del contenido del email, y al darle el segundo submit hacés el envío real del form.
alfonso desde ya agradecerte un montonazo desde hace tiempo uso tu sistema me vade maravillas y desearte lo mejor porque te lo mereces…. gracias groso
Hola Alfonso! muchisimas gracias por compartir el código. ¿Cómo tendría que hacer si quiero que al usuario le llegue un mail de confirmación una vez enviado el form? Desde ya muchas gracias.
Hola eNIAC, gracias por la onda :)
Paula, Para que le llegue un email de confirmación, podés agregar debajo de la línea 47:
$mail->AddAddress($direccion_envio);
esta línea:
$mail->AddCC($_POST['email']);
Pero OJO, aunque va a funcionar es MUY MALA IDEA hacerlo así.
Porque le estás pasando directamente a la función lo que ingresó el usuario en el form, y tu formulario va a quedar vulnerable usuarios malintencionados que pueden, por ejemplo, inyectar encabezados: te pueden pegar una lista de 1000 emails separados por comas y usarlo para enviar spam. Lo hacen, creeme.
Así que deberías filtrar el valor de $_POST['email'] antes de pasárselo a la función. Es un tema de otro post, pero se puede hacer usando una función como esta:
http://stackoverflow.com/questions/1826044/secure-email-form-header-injection-query
De esa manera te asegurás que en campo remitente no te “inyecten” encabezados no deseados.
Suerte!
Gracias por tu respuesta! Perdón la ignorancia, es que no soy programadora.
Quedaría asi? Dónde agrego el contenido o cuerpo del mail?
$mail->AddAddress($direccion_envio);
$name = strip_tags(stripslashes($_POST['nombre']));
//this is repeated for several other fields, then:
if(isInjected($nombre)) { die(); }
/* see isInjected function below */
function isInjected($str) {
$inject = “/(\r|\t|%0A|%0D|%08|%09)+/i”;
return (preg_match($inject, $str) > 0);
}
// send the mail
buenas!! Quería agradecerte tus aportes. me acabo de bajar los formularios php que colgaste hace unos años y me han servido de grandísima ayuda!!! MUCHAS GRACIAS y ENHORABUENA por tu trabajo!
Saludos desde Vitoria-Gasteiz!
hola como estas qeria consultarte por que no me llega el mail con el adjunto y si me guarda en el servidor en la carpeta archivos saludos
Hola,
muchas gracias por tu aportación, me ha servido de mucho :)
el problema que tengo ahora es que estoy intentando modificar el código para controlar el tamaño máximo de los archivos que se adjuntan, y no se cual sería el mejor modo de controlar esto, crees que me podrías ayduar?
gracias
Hola excelente script me funciono de maravilla, aunque tuve algunos problemas. No me dejaba ver la pagina, le cambie el nombre al archivo y le puse “index.php” y a toda la carpeta le puse permisos “755″ y a la de archivos “777″.
Te queria realizar un consulta sobre como hacer que tambien se guarde en una base de datos y adjunte a la base de datos el link de los archivos que adjunto el usuario. Espero alguien me ayuda y gracias por el excelente trabajo
Muy buen tutorial, al parecer me funciona y me arroja el resultado de que ya envió con éxito el archivo, pero aun no me llega el correo con el archivo adjunto. me podrías ayudar y explicar porque no llega, muchas gracias igual es un excelente aporte.
Hola, en primer lugar quiero agradecer por el gran aporte. Me ha facilitado mucho el trabajo y funciona perfectamente pero, con un error que sale después de enviar los archivos y no se como sacarlo:
Deprecated: Function set_magic_quotes_runtime() is deprecated in /home/content/86/7061986/html/cochegolpescom/inc/class.phpmailer.php on line 1091
Deprecated: Function set_magic_quotes_runtime() is deprecated in /home/content/86/7061986/html/cochegolpescom/inc/class.phpmailer.php on line 1095
Deprecated: Function set_magic_quotes_runtime() is deprecated in /home/content/86/7061986/html/cochegolpescom/inc/class.phpmailer.php on line 1091
Deprecated: Function set_magic_quotes_runtime() is deprecated in /home/content/86/7061986/html/cochegolpescom/inc/class.phpmailer.php on line 1095
Deprecated: Function set_magic_quotes_runtime() is deprecated in /home/content/86/7061986/html/cochegolpescom/inc/class.phpmailer.php on line 1091
Deprecated: Function set_magic_quotes_runtime() is deprecated in /home/content/86/7061986/html/cochegolpescom/inc/class.phpmailer.php on line 1095
Deprecated: Function set_magic_quotes_runtime() is deprecated in /home/content/86/7061986/html/cochegolpescom/inc/class.phpmailer.php on line 1091
Deprecated: Function set_magic_quotes_runtime() is deprecated in /home/content/86/7061986/html/cochegolpescom/inc/class.phpmailer.php on line 1095
Me interesa saber si se puede solucionar.
Gracias
Resuelto
¿Como se pueden añadir mas campos al formulario? Por ejemplo necesitaría poner ‘provincia’ , ‘marca’ , ‘año’ , ‘combustible y ‘km’
Muchas Gracias!
@matias78 para guardar en una base de datos, junto con el envío del email, hacer el query sql que guarde los datos. Fijate aca hay algo de información: http://es.kioskea.net/forum/affich-26890-grabar-formulario-php-a-mysql
@william y todos los que tengan problemas que no le llegan los mails, tienen que ver si está habilitada la función mail() de php. muchos servidores no la traen habilitada por defecto. También pueden revisar si editaron correctamente el mail de destino del form
@alejandro para agregar mas campos, tenés que crear nuevos inputs con el nombre necesario, y luego, recogerlos con $_POST y pasárselos al contenido del email.
El problema que te salía, probablemente sea por incompatibilidades de phpmailer con PHP5
esta chido gracias por el scrip les pongo 100 puntos graciasssss
Hola,
me gustaría saber si puedo acoplar la funcionalidad de adjuntar archivos a mi script. La verdad es que estoy empezando en esto y mi script ya lo conozco, por lo ue quiiera hacer esto si es posible.
Aquí va mi código:
<?php
$EmailTo = Trim(stripslashes($_POST['to']));
$Subject = Trim(stripslashes($_POST['subject']));
$email = Trim(stripslashes($_POST['email']));
// To send HTML mail, the Content-type header must be set
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
// Additional headers
$headers .= 'From: Mi Nombre ‘ . “\r\n”;
$headers .= “Cc: {$_POST['cc']}\r\n”;
$headers .= “Bcc: {$_POST['bcc']}\r\n”;
// prepare email body text
$Body = “”;
$Body .= $email;
$Body .= “\n”;
$Body .= “\n”;
// send email
$success = mail($EmailTo, $Subject, stripslashes($Body), $headers);
// redirect to success page
if ($success){
print “”;
}
else{
print “”;
}
?>
Hola, gracias por la respuesta. He conseguido añadir mas campos al formulario. Tus consejos me han ayudado mucho. Has dejado por aqui un post explicando como podemos dar un comand para que borre los datos del “archivos” despues de enviar. ¿Podrias explicarlo como lo puedo hacer en el formulario de contacto PHP con envios de múltiples archivos adjuntos? Gracias.
para eliminar los archivos del servidor, se puede agregar una línea en el PHP que vaya borrando los archivos.
Después de la línea 119:
$mensaje=’
Su archivo ha sido adjuntado con éxito
Gracias por Contactarnos
‘;
deberías agregar:
unlink($_FILES['archivo']['tmp_name'],’archivos/’.$nuevonombre);
avisame si te funciona, saludos!
Sale este error: Warning: unlink() expects parameter 1 to be string, array given in /home/content/86/7061986/html/cochegolpescom/en/test.php on line
Hola. no me sale bien el codigo cuando añado la funccion de borrar despues de enviar.
Aqui esta el formulario. http://www.cochegolpes.com/servicio-de-tasacion.php Lo demas todo perfecto. Muchas gracias
Sos un capo! muchas gracias por compartir tus conocimientos y por sobre todo dedicar tu tiempo!
Fuerza!
Como podría hacer para que salga un mensaje “su archivo se esta cargando” ya que hay archivos muy pesados y dura mucho sin yo saber que pasa.
Puede ser una barra de progreso de la carga de los archivos. Lo de más me funciona exelente.
De lo mejor en este tema!!!
Gracias!!!