Foros del Web » Programando para Internet » PHP »

funcion mail

Estas en el tema de funcion mail en el foro de PHP en Foros del Web. Hola a todos queria comentar un problema que tengo al enviar los campos de un formulario por email con la funcion mail() Tengo un formulario ...
  #1 (permalink)  
Antiguo 09/08/2011, 11:36
c0c
 
Fecha de Ingreso: octubre-2004
Mensajes: 38
Antigüedad: 20 años, 1 mes
Puntos: 0
Pregunta funcion mail

Hola a todos
queria comentar un problema que tengo al enviar los campos de un formulario por email con la funcion mail()

Tengo un formulario sencillo, con pocos campos, que una vez rellenados, el usuario pulsa enviar, y en la misma pagina, agradece por el envio y muestra a su vez, una copia de lo enviado, sin embargo, el email no llega a ser enviado, y no se es cosa del hosting, o mas bien mia, que poco se de php.

El formulario, a grandes rasgos, es asi:

Código PHP:
<!DOCTYPE html>
<html lang="es-ES">
<head>
<title>Contacto</title>
</head>

<body>

<div id="contacto">
<?php
if (!$_POST){
?>
<p>Informacion para el usuario que rellena el formulario </p>


<form action="<? $PHP_SELF ?>" method="post">
<fieldset>
  <legend>Contacto</legend>
<label for="nombre">Nombre <span class="help" title="Campo obligatorio">*</span></label>
<input name="nombre" type="text" size="30" required autofocus /><br />

<label for="apellido">Apellidos <span class="help" title="Campo obligatorio">*</span></label>
<input name="apellido" type="text" size="30" required /><br />

<label for="email">Email <span class="help" title="Campo obligatorio">*</span></label>
<input type="email" name="email" size="30" required /><br />

<label for="grupo">Grupo</label>
<input name="grupo" type="text" size="30" /><br />

<label for="url">Sitio Web</label>
<input type="text" name="url" size="30" placeholder="Web, Facebook, Myspace..."/><br />

<label for="asunto">Asunto <span class="help" title="Campo obligatorio">*</span></label>
<select name="asunto" id="asunto">
   <option value="">Contratación</option>
    <option value="">Tarifas y presupuestos</option>
    <option value="">Más información</option>
    <option value="">Otro</option>
    </select><br />

<label for="comentarios">Comentarios <span class="help" title="Campo obligatorio">*</span></label>
<textarea name="comentarios" cols="50" rows="8" required ></textarea><br />

<input type="submit" name="enviar" id="enviar" value="Enviar comentarios" />
<input type="reset" name="borrar" id="borrar" value="Borrar"  />

</fieldset>
<p>Los campos marcados con  <span class="help" title="Campo obligatorio">*</span> son obligatorios</p>
</form>

<?
}else{
    
//ajuste de email
    
$cuerpo "Formulario enviado\n";
    
$cuerpo .= "Nombre: " $_POST["nombre"] . "\n";
    
$cuerpo .= "Apellidos: " $_POST["apellido"] . "\n";
    
$cuerpo .= "E-mail: " $_POST["email"] . "\n";
    
$cuerpo .= "Grupo: " $_POST["grupo"] . "\n";
    
$cuerpo .= "Pagina Web: " $_POST["url"] . "\n";
    
$cuerpo .= "Asunto: " $_POST["asunto"] . "\n";
    
$cuerpo .= "Mensaje: " $_POST["comentarios"] . "\n";
    


   
//envio del correo
    
mail("[email protected]","$asunto","$cuerpo""$email");

    
//agradezco
    
echo "Gracias por rellenar el formulario. Se ha enviado correctamente.";
}
?>
   //muestro lo que se ha enviado
<? echo($cuerpo); ?>


</div>
</body>

</html>
Bien, como vereis el codigo es sencillo, y obviamente la variable del email en el archivo original apunta a mi direccion, las variables introducidas por el usuario, una vez pulsado enviar se reflejan en la pagina, pero no llega el email.

Si alguien es tan amable de mostrarme donde esta el error que cometo, me seria de gran ayuda.

No obstante, quiero agradecer de antemano por leerme :)

Un saludo.
PD: He revisado en foro y preguntado a google antes de postear, pero no he encontrado ninguna diferencia significativa con mi script de email, y es por eso que pregunto.
  #2 (permalink)  
Antiguo 09/08/2011, 22:47
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: funcion mail

Aqui mismo en FDW hay un aporte para que los correos se envien y lleguen a su destino, pero para ello usan PHPMailer: http://www.forosdelweb.com/f18/metod...otmail-630896/

La razon por la que no se envian tus correos es que te falta incluir una serie de encabezados, sin ellos, la mayoria de servidores consideraran el contenido como spam y lo pasaran a correo no deseado o simplemente lo borraran.

Pregunta a san google por php mail encabezados, curiosamente los primeros enlaces son de FDW.
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 10/08/2011, 06:00
c0c
 
Fecha de Ingreso: octubre-2004
Mensajes: 38
Antigüedad: 20 años, 1 mes
Puntos: 0
Respuesta: funcion mail

Gracias por tu respuesta Triby, no habia caido en que podia ser esa la causa. Lo cierto es que use este mismo script de php hace unos años para un formulario casi identico me funciono sin problemas, y no tuve que añadir ningun encabezado. El correo al que se enviaba (como ahora, dicho sea de paso) era a Gmail, y me llegaba directo a mi bandea de entrada. Ahora no llega ni a la bandeja de entrada ni a spam, directamente no llega. Supongo que sera lo que dices de que lo borran directamente.

Estoy usando un hosting gratuito para las pruebas, concretamente byethost15,

No obstante, preferiria no tener que usar phpmailer, pues funciona con smtp (¿no es asi?) y no es lo que ando buscando.

He probado a poner encabezados, en concreto,
Código PHP:
//encabezadoss
$headers 'MIME-Version: 1.0' "\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";


   
//mando el correo...
    
mail("[email protected]","$asunto","$cuerpo""headers"); 
Pero sigue sin llegarme. ¿hay algun header concreto para gmail?

Muchas gracias por tu ayuda :)
  #4 (permalink)  
Antiguo 10/08/2011, 08:50
c0c
 
Fecha de Ingreso: octubre-2004
Mensajes: 38
Antigüedad: 20 años, 1 mes
Puntos: 0
Respuesta: funcion mail

Bien, luego de darme cabezazos contra la pared, he cambiado de hosting y el script ha funcionado. No como cabia esperar (headers, no envia el "from" ni el "subject"), pero ha funcionado. Al parecer, donde tenia alojado mi proyecto no permitia la funcion mail.

Quiza ayude a los que tengan un problema igual el incluir la funcion or die() tras la funcion mail(). Asi he podido saber si se enviaba y no llegaba (por motivo x) o directamente si no se enviaba. Eso es todo. Gracias por la ayuda.

Código PHP:
   //funcion mail
    
mail("$email","$asunto","$cuerpo","$headers") or die ("Error al enviar"); 
  #5 (permalink)  
Antiguo 10/08/2011, 13:19
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: funcion mail

Lo del from no llega porque no lo estas especificando en los encabezados, en el manual de PHP para la funcion mail(), el segundo ejemplo especifica como agregar el remitente (From y Reply-to), adicionalmente, tambien seria bueno que incluyas X-Mailer.

Lo del asunto, sera cuestion de como estas asignando la variable, antes de enviar el correo teclea: echo $asunto y veras si esta vacio o no.
__________________
- León, Guanajuato
- GV-Foto
  #6 (permalink)  
Antiguo 11/08/2011, 10:05
c0c
 
Fecha de Ingreso: octubre-2004
Mensajes: 38
Antigüedad: 20 años, 1 mes
Puntos: 0
Respuesta: funcion mail

He solucionado lo del asunto. Por un despiste no estaba recodiengo por separado la variable correcta, y ya me funciona.

Lo que no logro de ningun modo es sustituir parte de los encabezados por variables. Es decir, segun el ejemplo al que me has remitido (que en otro orden de cosas, me ha sido de gran ayuda) este quedaria asi:
Código PHP:
$cabeceras 'From: [email protected]"\r\n" .
    
'Reply-To: [email protected]"\r\n" .
    
'X-Mailer: PHP/' phpversion(); 
Sin embargo, me gustaria cambiar el "From: [email protected]" por el email de la persona que me envia el correo, al igual que el "Reply-To: [email protected]".


He probado recogiendo esas variables por separado, de este modo:
Código PHP:
$mail $_POST["email"]; 
dejando al final, las cabeceras de muchas maneras, sustituendo el webmaster@example por la variable $mail

Código PHP:
$cabeceras 'From: $mail' "\r\n" .
    
'Reply-To: mail' "\r\n" .
    
'X-Mailer: PHP/' phpversion(); 
Pero no hay manera.He probado con comillas simples, dobles, metiendo $mail entre <>, pero nada. O bien no me llegan los mensajes, o aparecen comillas en el mejor de los casos.

Como debo llamar a la variable para que el correo que recibo sea algo asi como:

From: "Pepito" <[email protected]>
Reply-To:"Pepito" <[email protected]>

Realmente, lo que quiero es poder contestar directamente a la persona que me envia el email desde el mismo mensaje que genera el script. ¿No es posible?

Muchas gracias por tu paciencia, de verdad.
  #7 (permalink)  
Antiguo 11/08/2011, 12:29
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 3 meses
Puntos: 2237
Respuesta: funcion mail

Bueno, para incluir variables en una cadena, puedes concatenar o encerrar la cadena entre comillas dobles para que PHP interprete la variable y la reemplace con el valor correspondiente; por supuesto, primero debes verificar que en $mail tienes un valor correcto, para evitar que te pase los mismo que con $asunto.

Concatenacion es lo mismo que tienes en el ejemplo del manual, hay que agregar mas puntos:
Código PHP:
Ver original
  1. $cabeceras = 'From: ' . $mail . "\r\n" .
  2.     'Reply-To: ' . $mail . "\r\n" .
  3.     'X-Mailer: PHP/' . phpversion();

Aunque, la verdad yo prefiero el uso de comillas dobles, siempre que es posible:
Código PHP:
Ver original
  1. $cabeceras = "From: $mail\r\n" .
  2.     "Reply-To: $mail\r\n" .
  3.     "X-Mailer: PHP/" . phpversion();

Creo que asi es un poco mas legible.
__________________
- León, Guanajuato
- GV-Foto
  #8 (permalink)  
Antiguo 11/08/2011, 12:33
Avatar de Sourcegeek
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: $mex['B.C.'];
Mensajes: 1.816
Antigüedad: 15 años, 6 meses
Puntos: 322
Respuesta: funcion mail

Además, aquí:
Código PHP:
Ver original
  1. //funcion mail
  2.     mail("$email","$asunto","$cuerpo","$headers") or die ("Error al enviar");
Por qué encerrar las variables entre comillas? Acaso estás escribiendo algun string? No, es nada más la variable, no son necesarias...
__________________
Buscas desarrollador web? Sourcegeek. Diseño web, Maquetación y Programación
¡Escribe bien! Esto es un foro, no un Facebook para que escribas con los pies

Etiquetas: funcion, mail(), formulario
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:45.