Comunidad de diseño web y desarrollo en internet online

Formulario de Contacto no envía correo

Citar            
MensajeEscrito el 15 Dic 2014 08:53 pm
Buenas noches!

Voy directo al grano. Llevo varios días peleándome con un asunto... Estoy desarrollando una página web y no me termina de funcionar. Esta está creada a partir de HTML, CSS y PHP. En ella habrá un formulario el cual la gente usará para ponerse en contacto... ¡¡Pero no consigo hacer que mande el pu#etero correo!!
Tengo instalado el XAMPP 1.8.3 (Quise probar el WampServer, pero me daba un error en unas librerías al instalar, que por mucho que las descargaba y las metía, seguía dando...) para que corra el PHP, y cual me funciona perfecto, creo.

Yo ejecuto "http://localhost/contacto.php" y el PHP me contesta "Enviado correctamente". Entiendo así que el PHP funciona bien... También he estado probando a instalar, que es donde creo que me falla, un Servidor SMTP para que sea el que realice el envío... Sé que el proveedor del Hosting tendrá configurado todo correctamente y funcionará a las mil maravillas cuando hospede la web en su servidores... pero es que quiero probarlo antes. He probado con varios servidores SMTP (Fake SendMail, el cual viene incluido con el XAMP. He puesto mi cuenta de GMAIL y nada... También he probado el PostCast Server Free Ed v2.6 y tampoco. No salía nada... También he probado a usar el Mercury que viene con el XAMPP, que no se muy bien si solo abre los puertos o también hace algo más...) He probado a hacer esto mismo en un Windows XP S3, Windows Server 2003 x64 o un Windows 7 Profesional x64 (En máquinas virtuales, menos la última) y con idéntico resultado... He comprobado (Con Netstat -an) que los puertos 25 y 110 funcionen correctamente... ¡¡Incluso me monté un servidor de correo en el Windows 2003 Server!! Eso sí, solo para mandar correos entre el mismo dominio del correo, nada de Certificados de confianza para mandar fuera del dominio (Lo probé para ver si aún así, mandaba el correo del formulario entre cuentas del mismo dominio, y nada...)

El código que estoy usando ahora es este (Para probar que manda bien. Posteriormente lo cambiaré para que recoja los datos del mismo formulario.)

Código PHP :

<?php
//escribo un texto para el mensaje.
$mensaje='Prueba de correo';

//envío el mensaje.
if(mail("[email protected]", "Asunto", $mensaje)){
   echo "Enviado correctamente.";
}else{
   echo "Fallo.";
}
?>


He modificado el típico php.ini, o el correspondiente del Fake SendMail... ¿Alguien sabe qué más puedo probar o en su defecto... Que hago mal? Gracias!! Siento el rollo que he soltado!!

Si este tema no corresponde a este subforo, ruego que me disculpen y que cualquier moderador lo mueva a su sitio oportuno.

Saludos, Cherno.

Por Cherno

1 de clabLevel



 

chrome
Citar            
MensajeEscrito el 16 Dic 2014 12:33 pm
No uses mail().

Usa la biblioteca PHPMailer. No trates de hacer pruebas con GMail, necesitas tener configuradas otras cosas que solamente añaden complejidad al desarrollo que de todas formas luego no vas a usar en el hosting.

En vez de eso usa un servidor de correos SMTP simple, como el que te proporciona tu ISP. Vas a necesitar el nombre de dominio del servidor SMTP (o su IP), el puerto (a veces no es el 25), un usuario y su contraseña.

Con PHPMailer es tan simple como:

Código PHP :

require("class.phpmailer.php");
require("class.smtp.php");

   $phpmail = new PHPMailer();
   $phpmail->isSMTP();
   $phpmail->isHTML(true);
   $phpmail->Host      = "smtp.example.com";
   $phpmail->Port      = 25;
   $phpmail->SMTPDebug = true;
   $phpmail->CharSet = "utf-8";
   $phpmail->Username  = "[email protected]";
   $phpmail->Password  = "lacontraseña";
   $phpmail->SMTPAuth  = true;
   $phpmail->From      = "[email protected]";
   $phpmail->FromName  = "Usuario de pruebas";
   $phpmail->Subject = "Mensaje de prueba";
   $phpmail->Body = "<p>Esto es una prueba</p>";

   $phpmail->AddAddress("[email protected]","Usuario receptor");
   $sent = $phpmail->Send(); 

   if ($sent) { echo "Mensaje enviado";  } else { echo $phpmail->ErrorInfo; }



Debes tener en cuenta que a veces el problema no es tuyo sino del servidor SMTP. A veces el servidor de correo del receptor se niega a entregar el mensaje por considerarlo spam. Y estas son cosas que están fuera de tu control. Ante la duda, intenta con otro SMTP.

Ahí nos cuentas cómo te fue.

Saludos.

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 27 Dic 2014 11:46 am
Al final me terminó funcionando haciendo lo siguiente:

Seguí usando el SendMail que viene preinstalado con el XAMPP. Configuré el puerto en el fichero sendmail.ini así:

Código :

o   smtp_server=smtp.gmail.com
o   smtp_port=587
o   smtp_ssl=auto
o   [email protected]
o   auth_password=contraseña


y el php.ini así:

Código :

o   sendmail_path = ""C:\xampp\sendmail\sendmail.exe" -t"
o   ;sendmail_path="C:\xampp\mailtodisk\mailtodisk.exe"


Utilicé este código php:

Código PHP :

<?php
$destino="[email protected]";
$asunto="Correo de Prueba";
$mensaje="Este es un correo de Prueba.";
$encabezados="From: Yo";

If(mail($destino, $asunto, $mensaje, $encabezados)){
   echo "Mail enviado correctamente.";
}else{
   echo "Error.";
}
?>


Y muy importante, GMAIL bloquea el correo enviado desde una aplicación no oficial, así que hay que bajar la seguridad desde "Opciones>>Seguridad>>Aplicaciones Menos seguras" y habilitarlo.

Con eso debería de funcionar :)

Saludos y gracias!!

Por Cherno

1 de clabLevel



 

chrome
Citar            
MensajeEscrito el 29 Dic 2014 12:11 pm
Insisto, no uses mail()!

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 04 Ene 2015 04:31 pm

DriverOp escribió:

Insisto, no uses mail()!


DriverOp, mail no tiene nada de malo mientras que la dirección de envío coincida con la del dominio del hosting se manda. Cuando no se hace eso, el servidor de correo del remitente lo marca como spam. Sin embargo, ese mismo criterio se sigue si usas PHPMailer. o cualquier otro.

Un saludo

Por trasweb

17 de clabLevel



 

Programador Web A Medida

firefox
Citar            
MensajeEscrito el 05 Ene 2015 03:46 pm

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 05 Ene 2015 04:12 pm

DriverOp escribió:

No es por eso.

Es porque mail() es muy fácil de explotar para usarlo como pasarela de envío de spam.


Sí, pero es como todo si no validas las entradas sql también tienes sql-injection o si no validas las salidas html te pueden hacer un XSS. En el caso de los emails recomiendo la siguiente página que explica como validar convenientemente:
http://www.martiniglesias.eu/blog/3-metodos-de-evitar-la-inyeccion-de-cabeceras-en-mail-de-php/119

Por trasweb

17 de clabLevel



 

Programador Web A Medida

firefox
Citar            
MensajeEscrito el 05 Ene 2015 06:52 pm
Error, no necesitas hacer un XSS para utilizar el servidor de correo.

Si vas a utilizar sendmail, necesitas un protocolo de seguridad SSL o TSL, instalar un certificado y llaves en Apache para que todo funcione bien.

Asi esas llaves se las pones a tu aplicación que utiliza mail() de PHP y lixto para que utilizen tu servidor de correo necesitaran instalar los certificados pertinentes :P

Por elporfirio

Claber

652 de clabLevel

1 tutorial

Genero:Masculino  

FullStack Web Developer

chrome
Citar            
MensajeEscrito el 05 Ene 2015 07:12 pm

elporfirio escribió:

Error, no necesitas hacer un XSS para utilizar el servidor de correo.

Si vas a utilizar sendmail, necesitas un protocolo de seguridad SSL o TSL, instalar un certificado y llaves en Apache para que todo funcione bien.

Asi esas llaves se las pones a tu aplicación que utiliza mail() de PHP y lixto para que utilizen tu servidor de correo necesitaran instalar los certificados pertinentes :P


elporfirio, me refería a Cross Site Scripting( http://es.wikipedia.org/wiki/Cross-site_scripting ) y estaba haciendo una analogía con los otros problemas que tiene una web normalmente. Me explico de nuevo: Si no podemos usar mail porque es propenso a un email injection, por lo mismo tampoco deberíamos usar sql porque existe sql-injection o tampoco podríamos usar html/javascript porque te pueden hacer XSS.
Como ves, no tiene sentido. Lo mejor es usar mail, sql y html/javascript pero siempre haciendo una buena validación de datos.

Por trasweb

17 de clabLevel



 

Programador Web A Medida

firefox
Citar            
MensajeEscrito el 06 Ene 2015 12:14 pm
No he dicho que no se pueda usar mail().

De hecho PHPMailer también usa mail() en uno de sus modos. La ventaja de usar PHPMailer es que todos estos problemas ya están contenidos y además es más fácil de implementar que andar creando cabeceras a mano (y propenso a errores).

Por DriverOp

Claber

2510 de clabLevel



 

opera

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.