Foros del Web » Programando para Internet » PHP »

Formulario para enviar mails con adjunto + texto

Estas en el tema de Formulario para enviar mails con adjunto + texto en el foro de PHP en Foros del Web. Hola, buenas tardes... Tengo un problema con un formulario para enviar un email, con su respectivo cuerpo en HTML (Texto) y algún archivo adjunto. Resulta ...
  #1 (permalink)  
Antiguo 29/01/2013, 16:26
Avatar de Middrel  
Fecha de Ingreso: abril-2005
Mensajes: 804
Antigüedad: 15 años, 1 mes
Puntos: 25
Formulario para enviar mails con adjunto + texto

Hola, buenas tardes...

Tengo un problema con un formulario para enviar un email, con su respectivo cuerpo en HTML (Texto) y algún archivo adjunto. Resulta que, o me envía sólo el texto o me envía sólo el adjunto. Busque por internet algunos ejemplos de como hacer esto pero no me están funcionando como debieran. Les explico:

Mi formulario es este:

Código HTML:
<form action="form-inscripcion.php" method="post" enctype="multipart/form-data" accept-charset="utf-8">
    <input id="nombre" class="forma-a" type="text" name="nombre" placeholder="Nombre del solicitante ( * Requerido )" />
    <input id="direccion" class="forma-a" type="text" name="direccion" placeholder="Dirección ( * Requerido )" />
    <input id="postal" class="forma-b" type="text" name="postal" placeholder="Dirección postal" />
    <input id="telefono" class="forma-b" type="text" name="telefono" placeholder="Teléfono ( * Requerido )" />
    <input id="fax" class="forma-b" type="text" name="fax" placeholder="Fax" />
    <input id="celular" class="forma-b" type="text" name="celular" placeholder="Celular" />
    <input id="email" class="forma-b" type="text" name="email" placeholder="Correo electrónico ( * Requerido )" />
    <input id="madre" class="forma-a" type="text" name="madre" placeholder="Nombre de la madre o tutora" />
    <input id="padre" class="forma-a" type="text" name="padre" placeholder="Nombre del padre o tutor" />
    ¿Cómo te enteraste del programa de verano?
    <textarea id="progverano" name="progverano"></textarea>
    ¿Qué sabes de la fundación?
    <textarea id="fundacion" name="fundacion"></textarea>
    <input id="escuela" type="text" name="escuela" placeholder="Escuela de procedencia" /><input id="grado" type="text" name="grado" placeholder="Grado" />
    ¿Trabajas? <select id="trabajas" name="trabajas"> 
                             <option value="0">Opción</option> 
                             <option value="Si">Si</option> 
                             <option value="No">No</option> 
                      </select>      
                      <input id="espef" type="text" name="espef" value="Especifica" />
    ¿Perteneces a organizaciones estudiantiles?
    <select id="organizaciones" name="organizaciones"> 
          <option value="0">Opción</option> 
          <option value="Si">Si</option> 
          <option value="No">No</option>
    </select>
    <input id="org" type="text" name="org" value="Especifica" />
    ¿Qué sección del programa prefiere?

    <select id="seccion" name="seccion"> <option value="0">Opción</option> <option value="Junio">Junio</option> <option value="Julio">Julio</option> </select>
    <input id="variable" type="hidden" name="variable" value="ES" />

    <strong>Para adjuntar tus documentos sobre ensayos, trabajos o material solicitado da cilck en el botón siguiente</strong> <input type="file" name="formfile" id="formfile" />

    ¿Terminaste? ¡Ahora envía tu solicitud de inscripción!

    <input id="enviar" class="forma-c" type="submit" name="enviar" value="¡Sí! ¡Quiero enviar mi solicitud ahora!" /><input id="limpiar" class="forma-c" type="reset" name="limpiar" value="No, reiniciaré el formulario" />

</form> 
y este es el código en PHP para enviar el formulario:

Código PHP:
Ver original
  1. if ($_POST['enviar']) {
  2.        
  3.         $num = md5(time());  /* Agregado */
  4.  
  5.         $sqlEnviarForma = mysql_query("Insert into wp_forms (form_nombre, form_direccion, form_postal, form_telefono, form_fax, form_celular, form_email, form_tutora, form_tutor, form_textarea_1, form_textarea_2, form_escuela, form_grado, form_trabajo, form_trab_especific, form_organizacion, form_org, form_programa, form_textarea_3, form_forma) Values ('$_POST[nombre]','$_POST[direccion]', '$_POST[postal]', '$_POST[telefono]', '$_POST[fax]', '$_POST[celular]', '$_POST[email]', '$_POST[madre]', '$_POST[padre]', '$_POST[progverano]', '$_POST[fundacion]', '$_POST[escuela]', '$_POST[grado]', '$_POST[trabajas]', '$_POST[espef]', '$_POST[organizaciones]', '$_POST[org]', '$_POST[seccion]', '1', '$_POST[variable]')");
  6.        
  7.         /* Sección de envio a el instituto */
  8.        
  9.         $today = date("Ymd");
  10.         $deemail=$_POST['email'];
  11.         $sfrom=$_POST['email'];
  12.         $sdestinatario= email@sitio.com.mx';
  13.         $ssubject="Formulario de Inscripción";
  14.                        
  15.         $shtml = ' Cuerpo del mensaje ';
  16.        
  17.  
  18.                 $num = md5(time());
  19.  
  20.                 //MAIL BODY
  21.                 $body = $shtml;
  22.  
  23.                 $_name=$_FILES["formfile"]["name"];
  24.                 $_type=$_FILES["formfile"]["type"];
  25.                 $_size=$_FILES["formfile"]["size"];
  26.                 $_temp=$_FILES["formfile"]["tmp_name"];
  27.  
  28.                 if( strcmp($_name, "") ) //FILES EXISTS
  29.                 {
  30.                 $fp = fopen($_temp, "rb");
  31.                 $file = fread($fp, $_size);
  32.                 $file = chunk_split(base64_encode($file));
  33.  
  34.                 // MULTI-HEADERS Content-Type: multipart/mixed and Boundary is mandatory.
  35.                 $headers = "From: <$sdestinatario>\r\n";
  36.                 $headers .= "MIME-Version: 1.0\r\n";
  37.                 $headers .= "Content-Type: multipart/mixed; ";
  38.                 $headers .= "boundary=".$num."\r\n";
  39.                 $headers .= "--".$num."\n";
  40.  
  41.                 // HTML HEADERS
  42.                 $headers .= "Content-Type: text/html; charset=UTF-8\r\n";
  43.                 $headers .= "Content-Transfer-Encoding: 8bit\r\n";
  44.                 $headers .= "".$body."\n";
  45.                 $headers .= "--".$num."\n";
  46.  
  47.                 // FILES HEADERS
  48.                 $headers .= "Content-Type:application/octet-stream ";
  49.                 $headers .= "name=\"".$_name."\"r\n";
  50.                 $headers .= "Content-Transfer-Encoding: base64\r\n";
  51.                 $headers .= "Content-Disposition: attachment; ";
  52.                 $headers .= "filename=\"".$_name."\"\r\n\n";
  53.                 $headers .= "".$file."\r\n";
  54.                 $headers .= "--".$num."--";
  55.  
  56.                 }else { //FILES NO EXISTS
  57.  
  58.                 // HTML HEADERS
  59.                 $headers = "From: $sdestinatario \r\n";
  60.                 $headers .= "MIME-Version: 1.0\r\n";
  61.                 $headers .= "Content-Type: text/html; charset=UTF-8\r\n";
  62.                 $headers .= "Content-Transfer-Encoding: 8bit\r\n";
  63.                 }
  64.  
  65.                 // SEND MAIL
  66.                 mail($sdestinatario, $ssubject , $body, $headers);
  67.  
  68.                 echo "<div class='ok'>
  69.                 <strong>El formulario se ha enviado correctamente.</strong></div>";

No localizó el porque no me deja enviar ambos (cuerpo y adjunto) al mismo tiempo. ¿Alguna idea?

De antemano les agradezco por sus comentarios.

Saludos!
  #2 (permalink)  
Antiguo 29/01/2013, 17:25
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.065
Antigüedad: 11 años, 9 meses
Puntos: 2215
Respuesta: Formulario para enviar mails con adjunto + texto

$_name=$_FILES["formfile"]["name"];
$_temp=$_FILES["formfile"]["tmp_name"];

$name es el nombre del archivo original, en la PC del usuario.
$_temp es la ruta y el nombre del archivo subido y almacenado en directorio temporal en el servidor.

Entonces, debes leer el archivo desde $_temp y no desde $name.

Por cierto, te convendría revisar $_FILES['formfile']['error'], si es 0 (cero) es porque se subió correctamente el archivo, si tiene otro valor, hay un error.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 30/01/2013, 08:42
Avatar de Middrel  
Fecha de Ingreso: abril-2005
Mensajes: 804
Antigüedad: 15 años, 1 mes
Puntos: 25
Respuesta: Formulario para enviar mails con adjunto + texto

Sigo teniendo el mismo problema, funciona bien la parte de los adjuntos más sin embargo no envía el texto del cuerpo del mail. En la condición que tiene:

Si hay algún archivo -> Sólo me envía el adjunto y no el cuerpo del correo.
Si no hau archivo -> Me envía correctamente el cuerpo del correo.

Honestamente no he ahondado en la parte de los adjuntos porque no me había tocado hacer algo similar, sin embargo ahora me esta causando algunos problemas.

Sigo investigando sobre el tema. Triby agradezco tu comentario y ayuda :D

Saludos!

Etiquetas: formulario, html, mails, mysql, select, sql
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 22:25.