Foros del Web » Programando para Internet » PHP »

Enviar Archivo Adjunto Desde Formulario

Estas en el tema de Enviar Archivo Adjunto Desde Formulario en el foro de PHP en Foros del Web. Buenas compañeros; Tengo un problemilla a la hora de adjuntar un archivo en un formulario y enviar todos los datos y el archivo adjunto por ...
  #1 (permalink)  
Antiguo 13/07/2006, 11:05
Avatar de susaninhax  
Fecha de Ingreso: noviembre-2004
Mensajes: 358
Antigüedad: 13 años
Puntos: 3
Enviar Archivo Adjunto Desde Formulario

Buenas compañeros;

Tengo un problemilla a la hora de adjuntar un archivo en un formulario y enviar todos los datos y el archivo adjunto por email.
Los datos me llegan perfectamente excepto el archivo adjunto.

Os adjunto mi código para que le echéis un ojo, y si alguien me puede ayudar con el tema del archivo adjunto. Os lo documento :

Código PHP:
//Es necesario que al menos halla una dirección de destino
   
$error="";

 
//aquí tendré que hacer la consulta para sacar el email del usuario para enviarle el fichero aceites vegetales.xsl
    
$usuario="[email protected]";
 
    
//En vez de dos direcciones pongo directamente la que me interesa
     
$direcciones="$usuario ";//$usuario
    
      //pasamos a enviar el correo

      // primero hay que incluir la clase phpmailer para poder instanciar 
      //un objeto de la misma
      
require "includes/class.phpmailer.php";

      
//instanciamos un objeto de la clase phpmailer al que llamamos 
      //por ejemplo mail
      
$mail = new phpmailer();

      
//Definimos las propiedades y llamamos a los métodos 
      //correspondientes del objeto mail

      //Con PluginDir le indicamos a la clase phpmailer donde se 
      //encuentra la clase smtp que como he comentado al principio de 
      //este ejemplo va a estar en el subdirectorio includes
      
$mail->PluginDir "includes/";

      
//Con la propiedad Mailer le indicamos que vamos a usar un 
      //servidor smtp                            
      
$mail->Mailer "smtp";

      
//Asignamos a Host el nombre de nuestro servidor smtp
      
$mail->Host "mail.aclass.es"
      
      
//Le indicamos que el servidor smtp requiere autenticación
      
$mail->SMTPAuth true;

      
//Le decimos cual es nuestro nombre de usuario y password
      
$mail->Username "[email protected]"//username= [email protected]
      
$mail->Password "123456";                   //contraseña de mi correo outlook
      
      //Indicamos cual es nuestra dirección de correo y el nombre que 
      //queremos que vea el usuario que lee nuestro correo
      
$mail->From "[email protected]"//[email protected]

      
$mail->FromName "Svenson";

      
//Asignamos asunto y cuerpo del mensaje
      //El cuerpo del mensaje lo ponemos en formato html, haciendo 
      //que se vea en negrita
      
$mail->Subject "Solicitud de Empleo";
      
$mail->Body "<b>Estimado señores;</b><br><br> Deseo formar parte Svenson. Les adjunto mis datos personales y mi curriculum. Gustosamente espero vuestras noticias al respecto. Muchas gracias.
        Nombre: <b>"
.$_POST["nombre"]."</b><br>
        
        Apellidos: <b>"
.$_POST["apellidos"]."</b><br>
                
        Telefono: <b>"
.$_POST["telf"]."</b><br>
        
        E-mail: <b>"
.$_POST["email"]."</b><br>
        
        Dirección: <b>"
.$_POST["direccion"]."</b><br>
        
        Poblacion: <b>"
.$_POST["poblacion"]."</b><br>
        
        Codigo Postal: <b>"
.$_POST["cp"]."</b><br>

        Provincia: <b>"
.$_POST["prov"]."</b><br>
        
        Comentarios: <b>"
.$_POST["comen"]."</b><br>";

      
//Definimos AltBody por si el destinatario del correo no admite 
      //email con formato html
      
$mail->AltBody ="<b>Estimado señores;</b><br><br> Deseo formar parte Svenson. Les adjunto mis datos personales y mi curriculum. Gustosamente espero vuestras noticias al respecto. Muchas gracias.
        Nombre: <b>"
.$_POST["nombre"]."</b><br>
        
        Apellidos: <b>"
.$_POST["apellidos"]."</b><br>
                
        Telefono: <b>"
.$_POST["telf"]."</b><br>
        
        E-mail: <b>"
.$_POST["email"]."</b><br>
        
        Dirección: <b>"
.$_POST["direccion"]."</b><br>
        
        Poblacion: <b>"
.$_POST["poblacion"]."</b><br>
        
        Codigo Postal: <b>"
.$_POST["cp"]."</b><br>

        Provincia: <b>"
.$_POST["provincia"]."</b><br>
        
        Comentarios: <b>"
.$_POST["comen"]."</b><br>";

      
//el valor por defecto 10 de Timeout es un poco escaso dado que voy a usar 
      //una cuenta gratuita y voy a usar attachments, por tanto lo pongo a 120  
      
$mail->Timeout=120;

      
//Indicamos el fichero a adjuntar si el usuario seleccionó uno en el formulario
      
$archivo ="".$_POST["curricu"].""
      
$archivo_name "curriculum-".$_POST["nombre"]."";
     
// if ($achivo !="none") {
    
$mail-> AddAttachment($archivo,$archivo_name); //ruta absoluta en vez de $archivo=biocarburantescml.es/pruebas/informacion/cuadro.xls  ES RECOMENDABLE PONER SIEMPER RUTA RELATIVA
    // }

      //Indicamos cuales son las direcciones de destino del correo y enviamos 
      //los mensajes
     //reset($direcciones);
      //while (list($clave, $valor)=each($direcciones)) {
    
$mail->AddAddress($direcciones);

    
//se envia el mensaje, si no ha habido problemas la variable $success 
    //tendra el valor true
    
$exito $mail->Send();

    
//Si el mensaje no ha podido ser enviado se realizaran 4 intentos mas 
    //como mucho para intentar enviar el mensaje, cada intento se hara 5 s
    //segundos despues del anterior, para ello se usa la funcion sleep
     
$intentos=1
       while((!
$exito)&&($intentos<5)&&($mail->ErrorInfo!="SMTP Error: Data not accepted")){
       
sleep(5);
            
//echo $mail->ErrorInfo;
            
$exito $mail->Send();
            
$intentos=$intentos+1;                
       }

    
//La clase phpmailer tiene un pequeño bug y es que cuando envia un mail con
    //attachment la variable ErrorInfo adquiere el valor Data not accepted, dicho 
    //valor no debe confundirnos ya que el mensaje ha sido enviado correctamente
    
if ($mail->ErrorInfo=="SMTP Error: Data not accepted") {
       
$exito=true;
        }
        
    if(!
$exito)
    {
       echo 
"Problemas enviando correo electrónico a ".$direcciones;
       echo 
"<br>".$mail->ErrorInfo;    
    }
    else
    {
       
//Mostramos un mensaje indicando las direccion de 
       //destino y fichero  adjunto enviado en el mensaje    
      /* $mensaje="<p>Has enviado un mensaje a:<br>";
       $mensaje.=$direcciones." ";
       if ($archivo !="none") {
        $mensaje.="Con un fichero adjunto llamado ".$archivo_name;
       }
       $mensaje.="</p>";
            echo $mensaje;*/
       
header("Location:form_enviado.php?&id_usuario=$id_usuario&tipo=$tipo");
       
// Borro las direcciones de destino establecidas anteriormente
        
$mail->ClearAddresses();
    
    } 
Mi gran duda es como puedo indicarle por POST que coja ese archivo y lo envíe... estoy intenta queintenta pero voya saturar mi email XDDD

Alguna ayudita por ahí porfiss???????????

saludoss!!!
  #2 (permalink)  
Antiguo 13/07/2006, 11:23
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Pero .. ese archivo de donde llega? .. a caso lo subes de tu formulario HTML con un campo file donde lo seleccionas del PC del usuario?

Si es así . . el archivo no está en "POST" sino en $_FILES y es el mismo proceso que un "upload" común .. salvo que tu si quieres puedes (si tienes permisos) acceder al archivo para "atacharlo" directamente en:

$_FILES['curricu']['tmp_name']

En definitiva .. falta tu código del formulario .. para ver como trabajas el archivo .. si bien lo "subes" desde ahí .. o sólo escribes el nombre de un archivo que -está- en el serivdor ya .. en cierta ruta de tu servidor y con cierto nombre.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 13/07/2006, 11:35
Avatar de susaninhax  
Fecha de Ingreso: noviembre-2004
Mensajes: 358
Antigüedad: 13 años
Puntos: 3
Hola Cluster!!

Pues como bien dices, el archivo lo adjunto desde un formulario:

Código HTML:
<form name="empleo" method="post" action="procesar_formulario.php">
<INPUT style="LEFT: 146px; TOP: 44px" type="file" name="curricu">
<input class="clase" type="button" value="Enviar" onClick="javascript: Validar();">
</form> 
y envio todos los datos por post, pero claro recoger ese archivo no se como hacerlo...
  #4 (permalink)  
Antiguo 13/07/2006, 11:40
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Pues subir archivos por HTTP no se hace simplemente colocando un campo file en tu formulario .. hay más requisitos.

Revisa la documentación oficial de PHP al respecto:
http://www.php.net/manual/en/features.file-upload.php

Tienes que cambiar la codificación de tu formulario HTML para que sea multiparte (ahí tienes ejemplos en la documentación oficial de PHP).

Luego tomar el archivo en sí por el array asociado que te mencioné $_FILES ... Y si no tienes problemas de acceso directo a los archivos por ese médio ya te debería funcionar .. A las "malas" (recomendable en todo caso) deberías moverte el archivo con move_uploaded_file() a un directorio temporal de tu sitio .. ahí tomar el archivo por su ruta absoluta donde lo dejastes y de ahí una vez enviado el e-mail si no lo requieres más en el servidor .. lo eliminas con unlink().

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 13/07/2006, 12:48
Avatar de susaninhax  
Fecha de Ingreso: noviembre-2004
Mensajes: 358
Antigüedad: 13 años
Puntos: 3
Hola Cluster;

Perdona mi torpeza, he intentado esto:
Código PHP:

      $archivo 
=$_FILES['curricu']['tmp_name'];
      
$archivo_name "curriculum-".$_POST["nombre"]."";
     
    
$mail-> AddAttachment($archivo,$archivo_name); 
y claro, adjuntar si adjunta, pero el fichero me lo envia de la siguiente manera: curriculum- susana.dat

Lo de dat, intuyo que es por la extensión en el nombre del archivo pero no caigo como debo ponérselo, estoy muy confusa...
otra ayudita.... porfiii

gracias por todo!!!!
  #6 (permalink)  
Antiguo 13/07/2006, 12:55
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Intenta usar trim() para quitar espacios y saltos de línea en ese "nombre" que pudieran tener.

Código PHP:
$archivo_name "curriculum-".trim($_POST["nombre"]); 

Sobre el ".dat" .. que tipo de archivo adjuntas? .. un .doc? .. un .pdf? .. cual?

Deberías tomar el nombre del archivo .. el que sea originalmente (si quieres ponerle un pre-fijo por otros motivos .. OK .. pero deja el nombre como sea originalmente)

El "nombre" no sé que le colocas .. supongo que en tu formulario lo pides aparte (o debería ser el nombre del archivo real?.. por qué si es así lo tienes en $_FILES['curricu']['name'])


Has probado a enviar tu e-mail a otras direcciones (sobre todo para probar otros clientes de correo . .no siempre el mismo: hotmail, gmail .. Outlook, otros ..). Algunos clientes de correo si no identifican la extensión del archivo le ponen ".dat" .. pero eso ya no sería problema de PHP (de tu código + PHP Mailer) sino de tu servidor de correo y/o cliente de correo que uses. Lo mismo pasa si no le indicas una extensión (valida). .. Insisto que no deberías dejar poner el nombre "manualmente" o en su defecto concatenar la extensión: Pero quien te asegura que sean de la extensión que son realmente? .. y si te subo un .exe y me pones .pdf tu concatenando? ..

De hecho si tomas tu .dat (sabiendo que es un .doc o un .pdf o lo que sea ..) y lo abres con la aplicación que corresponda .. deberías abrirlo bien.


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #7 (permalink)  
Antiguo 13/07/2006, 13:10
Avatar de susaninhax  
Fecha de Ingreso: noviembre-2004
Mensajes: 358
Antigüedad: 13 años
Puntos: 3
gracias por tu tiempo cluster, soy consciente que soy un poco coñazo... jejeje

pues he intentado esto:
Código PHP:
$archivo $_FILES['curricu']['name'];
     
$archivo_name "curriculum-".trim($_POST["nombre"]); 
     
    
$mail-> AddAttachment($archivo,$archivo_name); 
y ahora no me llega nada adjunto al email...

es un .doc lo que intento adjuntar, pero nada, ...
a $archivo le debo poner el nombre real???? o es a $archivo_name,.... porque juraría que lo que acabo de hacer en este codigo es poner un nombre a las dos variables pero no la ruta del fichero no??????? snif snif snif
  #8 (permalink)  
Antiguo 13/07/2006, 13:13
Avatar de djreficul  
Fecha de Ingreso: julio-2006
Ubicación: Cork
Mensajes: 672
Antigüedad: 11 años, 5 meses
Puntos: 0
Cluster se refiere a que el nombre del archivo original lo tienes en $_FILES['curricu']['name'] con lo cual no te seria necesario solicitar un nombre para el archivo si no kieres y podrias cogerlo así:

Código PHP:
$archivo_name "curriculum-".$_FILES['curricu']['name']; 
La primera linea debes dejarla tal como estaba con tmp_name sino no pillas el archivo q se subio al server.
__________________
La muerte es un camino que todos debemos recorrer...
  #9 (permalink)  
Antiguo 13/07/2006, 13:14
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
No sé si entiendes como funciona el método de PHPMailer "addAttachment" .. ese método requiere dos parámetros: el nombre que le daras al archivo adjunto y el nombre con ruta del archivo a adjuntar.

Por ende .. tu archivo a adjuntar está en:
$archivo =$_FILES['curricu']['tmp_name'];

Y el nombre del archivo que adjuntas es:
$archivo_name = $_FILES['curricu']['name'];

Si le quieres poner otro nombre .. es cosa tuya .. pero date cuenta que -necesita- una extensión el nombre del archivo y no una cualquiera sino la que corresponda al archivo que se adjuntó .. por eso .. a no ser que "sepas" fielmente que por ahí todo va a ser de tal tipo (un .doc, .pdf .. o lo que sea) .. no podrías fijar una extensión cualquiera .. (se podría "parsear" la extensión del archivo original .. pero: ¿será necesario tanto? .. toma el nombre del archivo original y listo)

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #10 (permalink)  
Antiguo 13/07/2006, 13:17
Avatar de susaninhax  
Fecha de Ingreso: noviembre-2004
Mensajes: 358
Antigüedad: 13 años
Puntos: 3
nada , me sigue sin adjuntar nada...
Código PHP:
 $archivo $_FILES['curricu']['tmp_name']; 
     
$archivo_name "curriculum-".$_FILES['archivo']['name'];
     
    
$mail-> AddAttachment($archivo,$archivo_name); 
creo que voy a consultar con la almohada pk llevo todo el día intensamente, ya ya ni veo ni hago nada... arggg...

pos tengo que hacerlo para mañana sea como sea, manda narices... pos ya os contaré si se me ocurre como solucionarlo, pk no me adjunta nada de nada... que rabia, snif snif
  #11 (permalink)  
Antiguo 13/07/2006, 13:32
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Pero fijate bien ..

$archivo_name = "curriculum-".$_FILES['archivo']['name'];

Cual es el nombre de tu campo "file" de tu formulario? .. será "archivo" o "curricu".

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #12 (permalink)  
Antiguo 13/07/2006, 13:34
Avatar de djreficul  
Fecha de Ingreso: julio-2006
Ubicación: Cork
Mensajes: 672
Antigüedad: 11 años, 5 meses
Puntos: 0
A estas horas si llevas muxas delante del monitor ya no se vé ná de ná!!!

No desesperes susaninhax!!!

Saludos.
__________________
La muerte es un camino que todos debemos recorrer...
  #13 (permalink)  
Antiguo 13/07/2006, 13:57
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Otra cosa .. no sé si volvistes a modificar tu formulario .. pero si dices que en un momento te adjuntó el archivo y ahora no ... revisa la definición del formulario y que esté el tema del "multiparte" .. .

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #14 (permalink)  
Antiguo 14/07/2006, 02:30
Avatar de susaninhax  
Fecha de Ingreso: noviembre-2004
Mensajes: 358
Antigüedad: 13 años
Puntos: 3
Muchas gracias por vuestra apoyo, porfin!!!!!!!!!!!!!!! me ha salido jijijijii, teniais razon, me estaba haciendo un lio con los nombres.... no hay nada como descansar, unas veces le llamaba archivo, otras veces curricu, y por mas que me deciais que estaba poniendo lso nombres no me daba cuenta, XDDDDDD
en definitiva:

$archivo = $_FILES['archivo']['tmp_name'];
$archivo_name = "curriculum-".$_FILES['archivo']['name'];

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

gracias pro vuestro apoyo!!
  #15 (permalink)  
Antiguo 14/07/2006, 02:32
Avatar de susaninhax  
Fecha de Ingreso: noviembre-2004
Mensajes: 358
Antigüedad: 13 años
Puntos: 3
Muchas gracias por vuestra apoyo, porfin!!!!!!!!!!!!!!! me ha salido jijijijii, teniais razon, me estaba haciendo un lio con los nombres.... no hay nada como descansar, unas veces le llamaba archivo, otras veces curricu, y por mas que me deciais que estaba poniendo lso nombres no me daba cuenta, XDDDDDD
en definitiva:

$archivo = $_FILES['archivo']['tmp_name'];
$archivo_name = "curriculum-".$_FILES['archivo']['name'];

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

gracias pro vuestro apoyo!!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:33.