Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] mail() en php

Estas en el tema de mail() en php en el foro de PHP en Foros del Web. Hola a tod@s. Tengo un pequeño problema con el metodo mail() de php y sinceramente, no se que puede estar fallando porque a simple vista, ...
  #1 (permalink)  
Antiguo 07/03/2016, 06:30
 
Fecha de Ingreso: noviembre-2015
Mensajes: 23
Antigüedad: 9 años
Puntos: 0
mail() en php

Hola a tod@s. Tengo un pequeño problema con el metodo mail() de php y sinceramente, no se que puede estar fallando porque a simple vista, el codigo esta bien.
Antes de poner el codigo, tengo que decir que mi objetivo es hacer una pequeña aplicacion que envie un correo electronico a una direccion dada con unos datos que se generan automaticamente dependiendo de la opcion que se elija. Inicialmente pense hacerlo en Java, pero tenia que escribir mucho, ademas de la interfaz y las ventanas y no tenia mucho tiempo , asi que decidi hacerla en html y php. Como es algo que solo iba a usar yo, no le he dado mucha importancia a la estetica, sino a la funcionalidad, ya que originalmente diseñe esto para que me ahorrara tiempo.

Paso codigo:

El HTML

Código HTML:
<?php
if (isset ( $_COOKIE ["usrSndKey"] ) and isset ( $_COOKIE ["passSndKey"]) and ($_GET["usr"] == yes)) {
	?>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Enviar clave</title>
</head>
<body style="background-color: black">
<?php if($_GET["mail"] == yes){?>
<h4 style = "color:red">El mensaje ha sido enviado con exito</h4>
<?php }?>
<h1 style = "text-align: center; color: yellow">Bienvenido a la pantalla de envio de claves</h1>
<br>
<br>
<div style = "position:relative; left:20px">
<form name = "envPass" method = "post" action = "envPass.php">
<h2 style = "color: white">1.- Seleccione el/los archivo(s) cuya contraseña desea(n) ser enviada(s)</h2>
<p style = "color:white">
<input type="checkbox" name = "eleccion[0]" value="A moment in a million years(pdf)">A moment in a million years(pdf)<br>
<input type="checkbox" name = "eleccion[1]" value="A moment in a million years(mid)">A moment in a million years(mid)<br>
<input type="checkbox" name = "eleccion[2]" value="Card Captor Sakura Cap 26 (pdf)">Card Captor Sakura Cap 26 (pdf)<br>
<input type="checkbox" name = "eleccion[3]" value="Card Captr Sakura Cap 27 (mid)">Card Captr Sakura Cap 27 (mid)<br>
<input type="checkbox" name = "eleccion[4]" value="Another Dawn (pdf)">Another Dawn (pdf)<br>
<input type="checkbox" name = "eleccion[5]" value="Deai (pdf)">Deai (pdf)<br>
<input type="checkbox" name = "eleccion[6]" value="Deai(mid)">Deai(mid)<br>
<input type="checkbox" name = "eleccion[7]" value="Eden World Theme 2 (pdf)">Eden World Theme 2 (pdf)<br>
<input type="checkbox" name = "eleccion[8]" value="Melodia Sagrada (pdf)">Melodia Sagrada (pdf)<br>
<input type="checkbox" name = "eleccion[9]" value="Saori theme (pdf)">Saori theme (pdf)<br>
<input type="checkbox" name = "eleccion[10]" value="Super Duper Love Love Days (pdf)">Super Duper Love Love Days (pdf)<br>
<input type="checkbox" name = "eleccion[11]" value="Tomo He (pdf)">Tomo He (pdf)<br>
<input type="checkbox" name = "eleccion[12]" value="Tomo He (mid)">Tomo He (mid)<br>
<input type="checkbox" name = "eleccion[13]" value="Yasashisa no Tane (pdf)">Yasashisa no Tane (pdf)<br>
</p>
<h2 style = "color: white">2.- Escriba la direccion email donde desea enviar la(s) clave(s) y el nombre del destinatario</h2>
<p style = "color:white">
Nombre:&nbsp;&nbsp;<input type = "text" name = "nombre" value = "">
<br>
<br>
Correo:&nbsp;&nbsp;<input type = "text" name = "email" value = "">
</p>
<h2 style = "color: white">3.- Escriba el asunto del mensaje</h2>
<br>
<input type = "text" name = "asunto" value = "">
<br>
<h2 style = "color: white">4.- Seleccione si el mensaje desea que sea en ingles o en castellano</h2>
<p style = "color:white">
<select name = "idioma">
	<option value = "0">--------
	<option value = "1">Castellano
	<option value = "2">Ingles
</select>
</p>
<br>
<input type = "submit" name = "env" value = "enviar" style = "position:relative; left: 650px">
</form>
</div>
<br>
<br>


</body>
</html>
<?php
} else {
	?>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Autentificacion de usuario</title>
</head>
<body style="background-color: black">
	<div>
		<h1 style = "text-align: center;color: white">Autentificacion de Usuario</h1>
		<?php if($_GET["usr"] == no){?>
		<p style = "text-align: center; color: yellow">Usuario o contrase&ntilde;a incorrectos
		<?php }?>
		<form name = "auth" method = "post" action = "Authent.php">
			<p style = "text-align: center; color: white">Nombre de Usuario:&nbsp;&nbsp;<input type="text" name="user" value="">
			<p style = "text-align: center; color: white">Contrase&ntilde;a:&nbsp;&nbsp;<input type = "password" name = "pass" value = "">
			<br>
			<br>
			<input name = "env" type = "submit" value = "enviar" style = "text-align: center">
		
		</form>
	
	</div>

</body>
</html>
<?php
}
?> 
Y aqui el codigo PHP

Código PHP:
<?php
include 'data.php';

$i 0;
$array;
foreach(
$_POST['eleccion'] as $indice => $valor ) {
    
$array[$i] = array($valor$indice);
    
$i++;
}

for(
$j 0$j $i$j++){
    
$array[$j][1] = $sheet[$array[$j][1]];
}

for(
$j 0$j $i$j++){
    
$aux[$j] = $array[$j][0]." ==> ".$array[$j][1];
}

$name $_POST["nombre"];
$correo $_POST["email"];
$subj $_POST["asunto"];
$lang $_POST["idioma"];

if(
$lang == or $name == "" or $correo == "" or $subj == ""){
    echo 
"Te falto poner algunos datos. Vuelve atras";
}else{
    if(
$lang == 1){
        
$mensaje "Muy buenas, $name. Soy ****** y aqui te envio las claves de los siguientes archivos:\r\n
        \r\n"
;
        for(
$j 0$j $i$j++){
            
$mensaje $mensaje ."$aux[$j]";
            
$mensaje $mensaje."\r\n";
        }
        
$mensaje $mensaje."\r\n";
        
$mensaje $mensaje."Espero que lo disfrutes y no olvides suscribirte :). Que tengas un buen dia";
        
mail($correo$subj$mensaje"From: ls_52");
        
header("Location:userAuth.php?usr=yes&mail=yes");
    }else{
        if(
$lang == 2){
            
$mensaje "Hi!, $name. I'm ****** and here you have the keys for this files:\r\n
            \r\n"
;
            for(
$j 0$j $i$j++){
                
$mensaje $mensaje ."$aux[$j]";
                
$mensaje $mensaje."\r\n";
            }
            
$mensaje $mensaje."\r\n";
            
$mensaje $mensaje."I hope you enjoy that and do not forget to suscribe my channel :). Have a nice day";
            
mail($correo$subj,$mensaje"From: ls_52");
            
header("Location:userAuth.php?usr=yes&mail=yes");
        }
    }
}

?>
Y aqui viene el dato mas curioso. El codigo lo cree el sabado. El sabado funciono a la perfeccion y el domingo lo probe y ya los mensajes no llegaban a su destino. Lo unico que cambie fue que antes en esta parte:

Código PHP:
if($lang == or $name == "" or correo == "" or $subj == ""){
    echo 
"Te falto poner algunos datos. Vuelve atras";

la variable "$correo" estaba sin '$', por lo que si se me olvidaba introducir el campo de correo, igualmente me decia que el mensaje habia sido enviado correctamente. Igualmente, un cambio de esta indole no puede hacer que mi codigo falle de esta forma. Extrañado, me fui a data.php (que es un documento php que incluyo en el archivo php actual) y busque alguna variable $correo que pudiera estar jodiendo por ahi, pero nada.

Ya estaba un poco desquiciado, asi que cree un documento php nuevo y le introduje esto:

Código PHP:
<?php
mail
("[email protected]","example","example""example");
?>
donde "[email protected]" viene a ser mi correo electronico y ejecute la aplicacion web desde el mismo dominio que la aplicacion que estaba fallando y tampoco me llegan los mensajes.

Cabe mencionar que cuando probe la aplicacion web por ultima vez (domingo), lo hice exigiendole lo maximo. Me explico mejor...En el codigo php hay unos cuantos bucles for cuya funcion es capturar las elecciones de la etiqueta <selection>, almacenar esos datos en un array multidimensional y luego agarrar ese array multidimensional y transformarlo a bidimensional para trabajar mejor con el. En condiciones normales, esos bucles solo harian 2 pasadas (en el caso de que solo seleccionara 2 elementos de la etiqueta <selection>) pero cuando ejecute por ultima vez el codigo, selleccione todas las casillas marcables, por lo que el bucle for tendria que hacer unas 13 pasadas cada uno. La pagina tardo un poco en cargar, pero al final me dijo que el mensaje habia sido enviado satisfactoriamente, pero ese mensaje nunca llego. Se me paso por la mente que a lo mejor ese bucle for habia entrado en algun bucle infinito, pero estudiando el codigo, parece que nunca podra entrar en ese tipo de circulo vicioso asi que descarto esa posibilidad.

Pensando que a lo mejor es algun fallo de mi correo electronico, me fui a otra web mia (en otro dominio), donde tambien tengo la opcion de enviar mensajes y para mi sorpresa, esos mensajes si llegan a mi correo. Por lo tanto, no es problema de mi correo. Ambas web's (tanto la que funciona bien como la que no) las tengo alojadas en Hostinger.es, pero en dominios distintos. Pense que Hostinger habia detectado el envio masivo de emails desde la pagina web (la que ya no va bien) y por eso ya no podia enviar correos, asi que para comprobar si eso podia ser, me fui a la web que si funciona bien y realice un envio masivo de correos, pero sin embargo puedo seguir enviando correo sin problemas. Compare ambos codigos para ver si algo se me habia pasado por alto, pero lo esencial para que funcione el metodo mail() es igual en ambos codigos.

La verdad es que estoy un poco perdido porque ya no se que puede estar fallando. Y que un dia me funcione y al otro no hace pensar que el problema no es de codigo, pero a lo mejor modifique algo sin darme cuenta y no encuentro el fallo por ningun lado.

Antes de publicar ninguna respuesta, ruego que se abstengan de comentar cosas como "vaya chapuza" o "eso es mejor hacerlo en c++ o java". Soy consciente que parece que el remedio fue peor que la enfermedad y en un intento de ahorrarme tiempo haciendolo en html y php solo me ha generado problemas, pero llegados a este punto me gustaria saber donde esta fallando mi codigo para que no me vuelva a suceder.

Muchas gracias por su atencion y espero que haya alguien en el foro que pueda ayudarme :).
  #2 (permalink)  
Antiguo 07/03/2016, 08:50
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 5 meses
Puntos: 379
Respuesta: mail() en php

si quieres saber donde esta el error comienza a hacer debug de tus variables y prueba diferentes casos.
Para conocer el valor de una variables puedes usar var_dump
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 07/03/2016, 09:24
 
Fecha de Ingreso: agosto-2008
Mensajes: 64
Antigüedad: 16 años, 4 meses
Puntos: 3
Respuesta: mail() en php

Creo que el problema viene de la variable de $lang veras segun lo que leei esque si esa variable tiene valor a 1 se imprime en español y se tiene valor 2 se imprime en ingles pero como tu if tiene 0...

veras re recomiendo que hagas esto si quieres manejar lenguajes en tu pagina

1. Crea un archivo especialmente para español osea: es_MX.php o es_US.php
2. Primero lo lees en el index
Código PHP:
//verificamos el idioma desde la BD
    
$sql_idioma mysqli_query($con'SELECT idioma FROM config');
    
$res mysqli_fetch_array($sql_idioma);
     if(isset(
$res['idioma'])){
              
$idioma $res['idioma'];
          }else{
              
$idioma "es_MX";
          }
 
//Cargamos el idioma de la pagina.
include('./idioma/'.$idioma.'.php'); 
3. Luego en el archivo es_MX.php defines todo lo que quieras poner en ese idioma
Código PHP:
//php5
define('VALOR','A qui se va a imprimir lo que tengas');
//php 7 con array para no declarar tantos define
define('VALOR', array(
     
'valor 1',
    
'Valor 2'
)); 
4. en tu sistema solo imprimes
Código PHP:
//php 5
echo VALOR;
//php 7
echo VALOR[0]; 
A si evitaras tantos if con diferentes idiomas y solo cambias el idioma en el index
  #4 (permalink)  
Antiguo 07/03/2016, 10:09
 
Fecha de Ingreso: enero-2009
Ubicación: Kandor
Mensajes: 209
Antigüedad: 15 años, 10 meses
Puntos: 11
Respuesta: mail() en php

function enviar_correo($destinatarios, $mail_asunto, $mail_contendio, $from, $from_name, $archivos_adjuntos_ruta,$archivos_adjuntos_temp){
$mail= new PHPMailer(); // defaults to using php "mail()"
$mail->CharSet = 'UTF-8';
$body= $mail_contendio;
$mail->IsSMTP(); // telling the protocol to use SMTP
$mail->Host = "tu.host.com"; // SMTP server
$mail->From = $from;
$mail->FromName = $from_name;
$mail->Subject = $mail_asunto;
$mail->MsgHTML($body);
$destinatarios=explode(",", $destinatarios);
if(!empty($destinatarios)){
foreach($destinatarios as $un_destinatario){
$mail->AddAddress($un_destinatario); //destinatarios
}
}else{
return false;
}
if(!empty($archivos_adjuntos_ruta)){
foreach($archivos_adjuntos_ruta as $archivo){
$mail->AddAttachment($archivo); // attachment
}
}
if(!empty($archivos_adjuntos_temp)){
foreach($archivos_adjuntos_temp as $nombrearchivo=>$contenidoArchivo){
$mail->AddStringAttachment($contenidoArchivo,$nombrear ch ivo,'base64');
}
}
$mail->Timeout = 20;
if($mail->Send()) {
return array(true);
}else {
return array(false,"Mailer Error: ".$mail->ErrorInfo);
}
}
  #5 (permalink)  
Antiguo 07/03/2016, 11:13
 
Fecha de Ingreso: noviembre-2015
Mensajes: 23
Antigüedad: 9 años
Puntos: 0
Respuesta: mail() en php

Cita:
Iniciado por hhs Ver Mensaje
si quieres saber donde esta el error comienza a hacer debug de tus variables y prueba diferentes casos.
Para conocer el valor de una variables puedes usar [URL="http://php.net/manual/es/function.var-dump.php"]var_dump[/URL]
Gracias por responder hhs. Lo hice, pero no habia nada raro, solo cosillas de depuracion de codigo para quitar variables pero nada que explicase por que mi codigo fallaba de ese modo.


Cita:
Iniciado por 2AroN Ver Mensaje
Creo que el problema viene de la variable de $lang veras segun lo que leei esque si esa variable tiene valor a 1 se imprime en español y se tiene valor 2 se imprime en ingles pero como tu if tiene 0...

veras re recomiendo que hagas esto si quieres manejar lenguajes en tu pagina

1. Crea un archivo especialmente para español osea: es_MX.php o es_US.php
2. Primero lo lees en el index
Código PHP:
//verificamos el idioma desde la BD
    
$sql_idioma mysqli_query($con'SELECT idioma FROM config');
    
$res mysqli_fetch_array($sql_idioma);
     if(isset(
$res['idioma'])){
              
$idioma $res['idioma'];
          }else{
              
$idioma "es_MX";
          }
 
//Cargamos el idioma de la pagina.
include('./idioma/'.$idioma.'.php'); 
3. Luego en el archivo es_MX.php defines todo lo que quieras poner en ese idioma
Código PHP:
//php5
define('VALOR','A qui se va a imprimir lo que tengas');
//php 7 con array para no declarar tantos define
define('VALOR', array(
     
'valor 1',
    
'Valor 2'
)); 
4. en tu sistema solo imprimes
Código PHP:
//php 5
echo VALOR;
//php 7
echo VALOR[0]; 
A si evitaras tantos if con diferentes idiomas y solo cambias el idioma en el index
Gracias por responder 2AroN. Es buena la idea pero eso es por si se quiere cambiar de idioma una pagina web. A mi no me interesa eso. Mi objetivo es enviar un mensaje personalizado, con datos distintos dependiendo de la entrada dada.
Sin lugar a dudas, hacerlo todo en distintos php para hacerlo mas claro es lo correcto, pero en mi caso solo complica mas las cosas, sin contar con que no queria tocar el tema de base de datos. No tengo la necesidad de almacenar nada en ellos. De todas formas, muchas gracias por tomarte la molestia de darme tu punto de vista :)

Cita:
Iniciado por abrahamhs
Código PHP:
function enviar_correo($destinatarios$mail_asunto$mail_contendio$from$from_name$archivos_adjuntos_ruta,$archivos_adjuntos_temp){
$mail= new PHPMailer(); // defaults to using php "mail()"
$mail->CharSet 'UTF-8';
$body$mail_contendio;
$mail->IsSMTP(); // telling the protocol to use SMTP
$mail->Host "tu.host.com"// SMTP server
$mail->From $from;
$mail->FromName $from_name;
$mail->Subject $mail_asunto;
$mail->MsgHTML($body);
$destinatarios=explode(","$destinatarios);
if(!empty(
$destinatarios)){
foreach(
$destinatarios as $un_destinatario){
$mail->AddAddress($un_destinatario); //destinatarios
}
}else{
return 
false;
}
if(!empty(
$archivos_adjuntos_ruta)){
foreach(
$archivos_adjuntos_ruta as $archivo){
$mail->AddAttachment($archivo); // attachment
}
}
if(!empty(
$archivos_adjuntos_temp)){
foreach(
$archivos_adjuntos_temp as $nombrearchivo=>$contenidoArchivo){
$mail->AddStringAttachment($contenidoArchivo,$nombrear ch ivo,'base64');
}
}
$mail->Timeout 20;
if(
$mail->Send()) {
return array(
true);
}else {
return array(
false,"Mailer Error: ".$mail->ErrorInfo);
}

Justo despues de postear mi problema, alguien posteo un problema parecido al mio y me puse a leer y parece ser que la funcion mail() da problemas si no se tiene definido un servidor SMTP (yo no lo tengo definido) y dan una alternativa a mail() y es justamente la que tu has posteado, es decir, PHPMailer, asi que no me quedara otra que intentarlo. Muchas gracias
  #6 (permalink)  
Antiguo 07/03/2016, 12:53
 
Fecha de Ingreso: noviembre-2015
Mensajes: 23
Antigüedad: 9 años
Puntos: 0
Respuesta: mail() en php

Bueno. He conseguido enviar mensajes ya con PHPMail. Sin embargo, no ha podido ser mediante servidor SMTP porque cuando ejecutaba la aplicacion web, me saltaba un error en class.phpmailer.php en la linea 1438. Al parecer no encontraba el constructor de la clase SMTP asi que decidi hacerlo sin servidor SMTP y todo perfecto.
Aqui va el codigo por si alguien lo necesita:

Código PHP:
<?php
include 'data.php';
require_once 
'PHPMailer-master/class.phpmailer.php';

$i 0;
$array;
foreach(
$_POST['eleccion'] as $indice => $valor ) {
    
$array[$i] = array($valor$indice);
    
$i++;
}

for(
$j 0$j $i$j++){
    
$array[$j][1] = $sheet[$array[$j][1]];
}

for(
$j 0$j $i$j++){
    
$aux[$j] = $array[$j][0]." ==> ".$array[$j][1];
}

$name $_POST["nombre"];
$email $_POST["email"];
$subj $_POST["asunto"];
$lang $_POST["idioma"];

$correo = new PHPMailer(); //Creamos una instancia en lugar usar mail()

//Usamos el SetFrom para decirle al script quien envia el correo
$correo->SetFrom("[email protected]""*******");

//Usamos el AddAddress para agregar un destinatario
$correo->AddAddress($email$name);

//Ponemos el asunto del mensaje
$correo->Subject $subj;

/*
 * Si deseamos enviar un correo con formato HTML utilizaremos MsgHTML:
 * $correo->MsgHTML("<strong>Mi Mensaje en HTML</strong>");
 * Si deseamos enviarlo en texto plano, haremos lo siguiente:
 * $correo->IsHTML(false);
 * $correo->Body = "Mi mensaje en Texto Plano";
 */
$correo->MsgHTML($mensaje);


//Enviamos el correo
if(!$correo->Send()) {
    echo 
"Hubo un error: " $correo->ErrorInfo;
} else {
    echo 
"Mensaje enviado con exito.";
}

if(
$lang == or $name == "" or $email == "" or $subj == ""){
    echo 
"Te falto poner algunos datos. Vuelve atras";
}else{
    if(
$lang == 1){
        
$mensaje "Muy buenas, $name. Soy ****** y aqui te envio las claves de los siguientes archivos:<p><br>";
        
$mensaje $mensaje."<ul>";
        for(
$j 0$j $i$j++){
            
$mensaje $mensaje ."<li>$aux[$j]";
            
$mensaje $mensaje."<p>";
        }
        
$mensaje $mensaje."</ul>";
        
$mensaje $mensaje."<p>";
        
$mensaje $mensaje."Espero que lo disfrutes y no olvides suscribirte :). Que tengas un buen dia<p><br><br>";
        
$mensaje $mensaje."<i>Por favor, no responda a este mensaje. Para contactar conmigo, hagalo mediante Youtube o esta direccion: ********* </i>";
        
$correo->MsgHTML($mensaje);
        if(!
$correo->Send()) {
            echo 
"Hubo un error: " $correo->ErrorInfo;
        } else {
            echo 
"Mensaje enviado con exito.";
        }
        
header("Location:userAuth.php?usr=yes&mail=yes");
    }else{
        if(
$lang == 2){
            
$mensaje "Hi!, $name. I'm ******* and here you have the keys for this files:<p><br>";
            
$mensaje $mensaje."<ul>";
            for(
$j 0$j $i$j++){
                
$mensaje $mensaje ."<li>$aux[$j]";
                
$mensaje $mensaje."<p>";
            }
            
$mensaje $mensaje."</ul>";
            
$mensaje $mensaje."<p>";
            
$mensaje $mensaje."I hope you enjoy that and do not forget to suscribe my channel :). Have a nice day<p><br><br>";
            
$mensaje $mensaje."<i>Please, do not reply this message. For any question, contact with me via Youtube or this adress: *********</i>";
            
$correo->MsgHTML($mensaje);
            if(!
$correo->Send()) {
                echo 
"Hubo un error: " $correo->ErrorInfo;
            } else {
                echo 
"Mensaje enviado con exito.";
            }
        
header("Location:userAuth.php?usr=yes&mail=yes");
        }
    }
}

?>
EDITO: if(!$correo->Send()){.....} Se puede sustituir perfectamente por solo $correo->Send(). En mi caso, ese if no tiene sentido porque no muestra nada.

Etiquetas: html, mail, select, variable
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 10:43.