Foros del Web » Programando para Internet » PHP »

Formulario con envio de mail

Estas en el tema de Formulario con envio de mail en el foro de PHP en Foros del Web. Hola de nuevo, tengo problemillas con un formulario que adjunta fichero y lo manda por ma¡l. No sé por qué pero si no adjunto ficheros ...
  #1 (permalink)  
Antiguo 24/09/2006, 05:16
 
Fecha de Ingreso: agosto-2006
Mensajes: 18
Antigüedad: 13 años, 5 meses
Puntos: 0
Formulario con envio de mail

Hola de nuevo, tengo problemillas con un formulario que adjunta fichero y lo manda por ma¡l. No sé por qué pero si no adjunto ficheros el mensaje se envía correctamente con la hora y la IP del remitente, pero si adjunto un fichero sólo llega el fichero pero nada de texto, ni el mensaje esctito ni dada

Me podéis ayudar por favor?

Código PHP:
/*
        Comprobar fichero adjunto
    */
    
if($adjunto_enviar==TRUE)
    {
        
$archivo=$_FILES['form_archivo']['name'];                // Nombre del archivo
        
$temporal=$_FILES['form_archivo']['tmp_name'];            // Ruta del fichero temporal
        // Comprobar si existe archivo a adjuntar
        
if($temporal!='')                                        // $temporal=='' si no hay adjunto
        
{
            
// Comprobar tamaño máximo del archivo
            
$adjunto_tamano=filesize($temporal)/1024;            // Tamaño del adjunto en KB
            
if($adjunto_tamano>=$adjunto_max)
                
$mensaje_error.=$mensaje_adjunto_max;
        }
    }
    else
        
$temporal='';                                            // Para indicar que no hay adjunto

    
if(empty($mensaje_error))                                    // No ha habido error, puedo enviar el mail
    
{
        
// Al mensaje del usuario le añado datos de control, como IP y hora.
        
$ip=ip();                                                    // IP del usuario.
        
setlocale (LC_TIME,$idioma);                                // Parametros locales para el tiempo.
        
$fecha=gmstrftime("%a, %d/%b/%y %H:%M:%S (%Z)",time());        // Hora de envio.
        
$mensaje_texto=$form_mensaje."\n\n".$numero_de_telefono.' '.$form_telefono."\n\n".$enviado_por.' '.$ip."\n".$enviado_el.' '.$fecha;

        
// Comprobar si verdaderamente hay adjunto
        
if($temporal!='')
        {
            
// Leer el adjunto
            
$buffer implode("",file($temporal));            // Leer fichero
            
$buffer chunk_split(base64_encode($buffer));    // Codificación en base64 y divido

            // Cabeceras necesarias para enviar el mail
            
$cabecera "MIME-version: 1.0\n";
            
$cabecera .= "From: $form_nombre<$form_email>\n";
            
$cabecera .= "Return-Path: $email_admin\n";
            
$cabecera .= "Content-type: multipart/mixed; ";
            
$cabecera .= "boundary=\"Message-Boundary\"\n";
            
$cabecera .= "Content-transfer-encoding: 7BIT\n";
            
$cabecera .= "X-attachments: $temporal";

            
// Adjuntar el fichero
            
$mensaje "\n\n--Message-Boundary\n";
            
$mensaje .= "Content-type: Binary; name=\"$archivo\"\n";
            
$mensaje .= "Content-Transfer-Encoding: BASE64\n";
            
$mensaje .= "Content-disposition: attachment; filename=\"$archivo\"\n\n";
            
$mensaje .= "$buffer\n";
            
$mensaje .= "--Message-Boundary--\n";

            
// Mensaje de texto plano
            
$mensaje .= "--Message-Boundary\n";
            
$mensaje .= "Content-type: text/plain; charset=ISO-8859-1\n";
            
$mensaje .= "Content-transfer-encoding: 7BIT\n";
            
$mensaje .= "Content-description: Mail message body\n\n";
            
$mensaje .=$mensaje_texto;
        }
        else
        {
            
// Cabeceras necesarias para enviar el mail
            
$cabecera "From: $form_nombre<$form_email>\n";
            
$cabecera .= "Return-Path: $email_admin\n";

            
// Mensaje de texto plano
            
$mensaje $mensaje_texto;
        }
        
// Envia mail. La @ evita que muestre por pantalla posibles fallos.
        
if (@mail($email_admin,$form_asunto,$mensaje,$cabecera))    // Envio del email correcto
            
echo gracias($mensaje_mail_enviado);                    // Mensaje final de agradecimiento
           
else                                                        // Ha fallado el envido del email
            
echo gracias($mensaje_mail_fallido);                    // Mensaje final de indicación de error
    
}
    else                                                            
// Ha habido algun error, vuelvo al formulario
    
{
        
// Indicación de los errores.
        
$mensaje_error=$mensaje_error_inicial.$mensaje_error.$mensaje_error_final;

        
// Volver a mostrar el formulario con los campos previamente escritos y el error.
        
echo formulario($form_nombre,$form_email,$form_telefono,$form_asunto,$form_mensaje,$mensaje_error);
    }
}
else                                                            
// Entrada por primera vez
    
echo formulario();                                            // Imprimir el formulario sin valores iniciales

// Función que elimina espacios en blancos innecesarios, html y similares.
function limpiar($texto)
{
    
$texto trim($texto);                            // Elimina espacios del principio y final de una cadena
    
$texto stripslashes($texto);                    // Eliminar barras invertidas
    
$texto strip_tags($texto);                    // Eliminar marcas html y php
    
return $texto;                                    // Volver de la función
}

/*
Función para validar un mail.
Devuelve TRUE si el mail tiene el formato correcto.
Devuelve FALSE si el mail tiene un formato incorrecto o el dominio no exista.
*/
function email_valido($email)
{
    if (
preg_match('!^[a-z0-9.+-_][email protected]([a-z0-9-]+(?:.[a-z0-9-]+)+)$!i',$email,$partes))
    {
        
// Comprobar que el dominio es correcto
        
if (!checkdnsrr($partes[1]))
            return 
FALSE;
        else
            return 
TRUE;
    }
    else
        return 
FALSE;
}

// Conocer IP
function ip()
{
    if (isset(
$_SERVER['HTTP_X_FORWARDED_FOR']))
        
$ip $_SERVER['HTTP_X_FORWARDED_FOR'];
    elseif (isset(
$_SERVER['HTTP_VIA']))
        
$ip $_SERVER['HTTP_VIA'];
    elseif (isset(
$_SERVER['REMOTE_ADDR']))
        
$ip $_SERVER['REMOTE_ADDR'];
    else
        
$ip 'desconocida';

    return 
$ip;                                        // Devolver la IP
}

// Función que imprime el formulario.
// En caso de llamarse sin parametros los pone en blanco.
function formulario($form_nombre='',$form_email='',$form_telefono='',$form_asunto='',$form_mensaje='',$mensaje_error='')
{
    
// Varias globales definidas al inicio
    
global $titulo_nombre,$titulo_email,$titulo_telefono,$titulo_asunto,$titulo_mensaje;
    global 
$nombre_size,$email_size,$telefono_size,$asunto_size,$mensaje_cols,$mensaje_rows;
    global 
$titulo_web,$mensaje_principal,$nombre_max,$email_max,$telefono_max,$asunto_max;
    global 
$adjunto_enviar,$titulo_adjunto,$adjunto_max,$archivo_size;

    
$url=$_SERVER['PHP_SELF'];        // Dirección del formulario. Si en el formulario escribo directamente $_SERVER['PHP_SELF'] da problemas, por eso lo hago con otra variable.

    // Formulario para el envío de un fichero adjunto
    
if($adjunto_enviar==TRUE)
    {
        
$adjunto =<<<EOT
$titulo_adjunto<br />
<input type="file" name="form_archivo" class="imputbox" size="$archivo_size" /><br />
EOT;
    }
    else
        
$adjunto ='';

    
$formulario =<<<EOT 

Última edición por jam1138; 25/09/2006 a las 04:18
  #2 (permalink)  
Antiguo 24/09/2006, 13:36
Avatar de limboings  
Fecha de Ingreso: enero-2005
Mensajes: 794
Antigüedad: 15 años
Puntos: 2
Hola buenas,

Yo no me complicaria y utilizaria la Clase MimeMail,la puedes encontrar en www.phpclasses.org, con esta clase puedes adjuntar ficheros,enviar un e-mail con contenido html..etctetc,ami me funciona correctamente..

Un Saludo y espero que te sirva..

Última edición por jam1138; 25/09/2006 a las 03:59 Razón: Arreglo el enlace
  #3 (permalink)  
Antiguo 24/09/2006, 15:35
 
Fecha de Ingreso: agosto-2006
Mensajes: 18
Antigüedad: 13 años, 5 meses
Puntos: 0
url correcta

Te inportaria poner bien la direccion? He probado varias combinaciones con la que me has dado y nada. Por cierto: Qué es eso de una clase?

Gracias.

PD.- Si alguien tiene respuesta a la presgunta inicial rogaría me la respondiera. Muchas Gracias
  #4 (permalink)  
Antiguo 25/09/2006, 03:06
 
Fecha de Ingreso: agosto-2006
Mensajes: 18
Antigüedad: 13 años, 5 meses
Puntos: 0
Una pista

A ver si no me equivoco y puedo "ayudar" a quien me ayude.

Los ficheros adjuntos, ¿No se configuran en la $cabecera?, a mi me parece que el autor de este script lo ha configurado en $mensaje.

¿Pueden ir por ahí los tiros?

Gracias
  #5 (permalink)  
Antiguo 25/09/2006, 04:33
 
Fecha de Ingreso: agosto-2006
Mensajes: 18
Antigüedad: 13 años, 5 meses
Puntos: 0
Sigo insistiendo pero creo que yo solo no puedo

Según el código que he adjuntado, se establece la condición de que si contiene fichero adjunto los datos necesarioa para enviar el mail son "cabecera, mensaje, etc.." incluido el mensaje escrito en texto plano, que es la variable $mensaje_texto.

Esto me hace suponer que si no hay fichero adjunto los datos de envío son mas sencillos y la variable $mensaje_texto (que es el texto plano) aparece, pero con los datos (que vuelvo a adjuntar) no se muestra el texto plano en el mensaje final. Todo indica que hay un error de sintaxis en la siguiente linea de códigos:

Código:
// Cabeceras necesarias para enviar el mail
			$cabecera = "MIME-version: 1.0\n";
			$cabecera .= "From: $form_nombre<$form_email>\n";
			$cabecera .= "Return-Path: $email_admin\n";
			$cabecera .= "Content-type: multipart/mixed; ";
			$cabecera .= "boundary=\"Message-Boundary\"\n";
			$cabecera .= "Content-transfer-encoding: 7BIT\n";
			$cabecera .= "X-attachments: $temporal";

			// Adjuntar el fichero
			$mensaje = "\n\n--Message-Boundary\n";
			$mensaje .= "Content-type: Binary; name=\"$archivo\"\n";
			$mensaje .= "Content-Transfer-Encoding: BASE64\n";
			$mensaje .= "Content-disposition: attachment; filename=\"$archivo\"\n\n";
			$mensaje .= "$buffer\n";
			$mensaje .= "--Message-Boundary--\n";

			// Mensaje de texto plano
			$mensaje .= "--Message-Boundary\n";
			$mensaje .= "Content-type: text/plain; charset=ISO-8859-1\n";
			$mensaje .= "Content-transfer-encoding: 7BIT\n";
			$mensaje .= "Content-description: Mail message body\n\n";
			$mensaje .=$mensaje_texto;
  #6 (permalink)  
Antiguo 25/09/2006, 05:16
 
Fecha de Ingreso: enero-2005
Ubicación: Barcelona
Mensajes: 1.473
Antigüedad: 15 años
Puntos: 10
Hola! q tal?
xq no pruebas la classe phpmailer se utiliza para mandar correo, es muy completa y a mi personalmente me ha ayudado bastante.

tu decides, pero si hay algo q ya funciona xq no utilizarlo?

saludos
__________________
"Cada hombre es el hijo de su propio trabajo"
Miguel de Cervantes Saavedra
"La experiencia es algo que no consigues hasta justo depués de necesitarla"
Laurence Olivier
  #7 (permalink)  
Antiguo 25/09/2006, 05:32
 
Fecha de Ingreso: agosto-2006
Mensajes: 18
Antigüedad: 13 años, 5 meses
Puntos: 0
cuestión de cabezonería

Muchas Gracias Segi_Climent, seguramente acabe utilizando algo de esto, pero es que me fastidia que seguramente por una estupidez en el código no lo pueda utilizar, seguro que es una tontería.
Por eso pido ayuda.

De todas formas lo tendré en cuenta.

Gracias otra vez
  #8 (permalink)  
Antiguo 25/09/2006, 05:50
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 15 años, 5 meses
Puntos: 102
... creo el problema es que no estas dividiendo bien el contenido de tu correo.

Prueba con esto:
Código PHP:
// Adjuntar el fichero
            
$mensaje "\n\n--Message-Boundary\n";
            
$mensaje .= "Content-type: Binary; name=\"$archivo\"\n";
            
$mensaje .= "Content-Transfer-Encoding: BASE64\n";
            
$mensaje .= "Content-disposition: attachment; filename=\"$archivo\"\n\n";
            
$mensaje .= "$buffer\n";


            
// Mensaje de texto plano
            
$mensaje .= "--Message-Boundary\n";
            
$mensaje .= "Content-type: text/plain; charset=ISO-8859-1\n";
            
$mensaje .= "Content-transfer-encoding: 7BIT\n";
            
$mensaje .= "Content-description: Mail message body\n\n";
            
$mensaje .=$mensaje_texto;
            
$mensaje .= "\n\n--Message-Boundary--\n";  // esta línea al final (estaba entre el adjunto y el contenido)... agrego un par de saltos de línea 
... aunque si me preguntas, creo es "meter" los adjuntos hasta el final (antes el contenido), por simple órden..

Espero sirva. Suerte!
PD: Por favor ocupa las etiquetas para código PHP
__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #9 (permalink)  
Antiguo 25/09/2006, 05:58
 
Fecha de Ingreso: agosto-2006
Mensajes: 18
Antigüedad: 13 años, 5 meses
Puntos: 0
En este Foro hay Genios

Oye tío eres un genio, funciona a la perfección, no sabes el tiempo que llevo dándole vueltas (aunque también gracias a esto estoy aprendiendo mucho)

Por cierto, ya para nota:

Cómo hago para que aparezca el nombre del remitente con acentos, ñ y demás?

MUCHAS GRACIAS

  #10 (permalink)  
Antiguo 25/09/2006, 05:58
Avatar de jam1138
/** @package Moderador */
 
Fecha de Ingreso: julio-2004
Ubicación: sèveR led onieR lE
Mensajes: 9.368
Antigüedad: 15 años, 5 meses
Puntos: 102
Cita:
Iniciado por shiddarta Ver Mensaje
A ver si no me equivoco y puedo "ayudar" a quien me ayude.

Los ficheros adjuntos, ¿No se configuran en la $cabecera?, a mi me parece que el autor de este script lo ha configurado en $mensaje.

¿Pueden ir por ahí los tiros?

Gracias
Cuando se utiliza el method POST se esta indicando que todo se envie como parte del contenido (incluso en un "clásico uploader").

A ver si shiddarta nos dice de dónde sacó el script ...

__________________
٩(͡๏̯͡๏)۶
» Cómo hacer preguntas de manera inteligente «

"100 años después, la revolución no es con armas, es intelectual y digital"
  #11 (permalink)  
Antiguo 25/09/2006, 06:08
 
Fecha de Ingreso: agosto-2006
Mensajes: 18
Antigüedad: 13 años, 5 meses
Puntos: 0
Script

Sin problemas, el script es de la página de nosetup y el autor es Juan Llanos.

disculpe señor moderador:

hachetetepe, dos puntos, barra barra, nosetup, punto, org, barra, scripts punto pehachepe

  #12 (permalink)  
Antiguo 14/11/2007, 15:55
 
Fecha de Ingreso: abril-2004
Mensajes: 21
Antigüedad: 15 años, 9 meses
Puntos: 1
Re: Formulario con envio de mail

Podrian mandar el codigo completo del formulario para ademas de enviar los datos comunes... nombre, apellido, etc podamos adjuntar un archivo ???
gracias
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 01:30.