Foros del Web » Programando para Internet » PHP »

Problemas con Yahoo!, htmlentities(), caracteres especiales y PHPMailer

Estas en el tema de Problemas con Yahoo!, htmlentities(), caracteres especiales y PHPMailer en el foro de PHP en Foros del Web. Hola a todos. Tengo una base de datos donde guardo los correos y nombres de mis suscriptores. Completo un formulario, recupero los datos de la ...
  #1 (permalink)  
Antiguo 06/10/2009, 20:14
 
Fecha de Ingreso: junio-2008
Mensajes: 51
Antigüedad: 15 años, 10 meses
Puntos: 2
Problemas con Yahoo!, htmlentities(), caracteres especiales y PHPMailer

Hola a todos.

Tengo una base de datos donde guardo los correos y nombres de mis suscriptores.
Completo un formulario, recupero los datos de la base de datos y envío los emails.
Tengo tres emails de prueba (GMail, Windows Live Hotmail y Yahoo!).
A GMail el mensaje llega perfectamente sin problemas.

Primer problema: Yahoo! recibe los caracteres acentuados y me los convierte en Ã* á ó...
Probé con htmlentities() pero no sirvió y empeoró porque GMail empezó a mostrar esos caracteres. Ahora no uso htmlentities() y sigo donde estaba desde el principio.
¿Cuál puede ser el problema y la solución?

Segundo problema: el correo llega vacío, nulo, en blanco a Windows Live Hotmail.
¿Cuál puede ser el problema y la solución?

El código que uso es el siguiente:
Código PHP:
include("class.phpmailer.php");
include(
"modelo.php"); //Modelo contiene el mensaje en HTML y el mensaje alternativo en texto plano con las variable correspondientes donde debe ser.
// El texto en HTML se llama $cuerpo y el texto alternativo $cuerpo2
$mail = new PHPMailer();

// Recupero la información del formulario
$titulo $_POST['titulo'];
$texto $_POST['texto'];
$url1 $_POST['url1'];
$url2 $_POST['url2'];
$url2 $_POST['url3'];
$id1 $_POST['id1'];
$id2 $_POST['id2'];
$id3 $_POST['id3'];
$nombre1 $_POST['nombre1'];
$nombre2 $_POST['nombre2'];
$nombre3 $_POST['nombre3'];

// Configuro los parámetros de PHPMailer
$mail->Host "localhost";
$mail->From "[email protected]";
$mail->FromName "Mail";
$mail->Subject $titulo;

$mail->Body $cuerpo;
$mail->AltBody $cuerpo2;

// Obtengo los datos de la base de datos y envío tantos emails como suscriptores tenga
$contactos mysql_query("SELECT * FROM suscriptores"$sql_c) or die (mysql_error());
while (
$mails=mysql_fetch_array($contactos)) {
    
$mail->ClearAddresses();
    
$mail->AddAddress($mails['mail'],$mails['nombre']);
    
$mail->Send();
    
$c++;
}

// Guardo en el archivo mensaje.html el correo que envío más un extra de código HTML
// Este archivo es la página a la que debería ir la gente si no ve correctamente el mensaje
$fd fopen('../mensaje.html''w+');
$html ="<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\">
<head>
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />
<title>Mensaje Semanal</title>
</head>
<body>
"
.$cuerpo."
</body>
</html>"
;
fwrite ($fd,$html);
fclose ($fd); 
Ese es todo el código, espero que no sea muy dificil de entender.

Saludos.
  #2 (permalink)  
Antiguo 06/10/2009, 20:35
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: Problemas con Yahoo!, htmlentities(), caracteres especiales y PHPMailer

Hola
Pues revisate las funciones de utf8_encode o decode, tal vez alguna te funcione, o htmlspecialchars()

En cuanto a hotmail, el mensaje te llega a correo no deseado?
y si es asi, te advierte que el contenido del mensaje esta bloqueado
o algo asi?
porque si es asi, tal vez llega bien el correo pero como esta
bloqueado no te lo muestra, basta con que le des desbloquear y
podrias ver el contenido

Bueno, revisa y nos cuentas
saludos
  #3 (permalink)  
Antiguo 07/10/2009, 07:34
 
Fecha de Ingreso: junio-2008
Mensajes: 51
Antigüedad: 15 años, 10 meses
Puntos: 2
Bueno, no utilizé utf8_encode() ni utf8_decode porque no sabía que existían jeje.
htmlspecialchars() no sirve para transformar caracteres acentuados o eñes.

En Hotmail me llegan en la bandeja de entrada, sin ningún tipo de advertencia y el cuerpo del mensaje en blanco totalmente, inclusive si busco algo viendo el código fuente no encuentro nada.

Utilizaré el utf8_encode() a ver si se soluciona el problema de Yahoo! Mientras tanto me preocupa mucho el hecho de que llegue de esa forma a Hotmail porque mucha gente usa ese servicio.

Saludos.

Ahora que utilizé utf8_encode() estoy habilitado a decir que no funcionó, me llegó bien a GMail pero a Yahoo! me siguen llegando esos horribles caracteres.

Yo deseo que al revisar esos caracteres acentuados en el código fuente se vean sus entidades y no los caracteres acentuados. Sólo lo he logrado en un archivo de prueba con htmlentities() pero a la hora de enviar los emails no funcionan.

Ahora estoy intentando usar SMTP con PHPMailer para ver si puedo solucionar el tema de Hotmail y el cuerpo de mensaje vacío.

Saludos.

Asunto solucionado con Hotmail.
Sólo tengo que autenticar el servidor SMTP con PHPMailer de la siguiente manera:
Código PHP:
$mail->IsSMTP();
$mail->Host     "smtp.gmail.com";
$mail->SMTPAuth true;
$mail->SMTPSecure 'ssl';
$mail->Port 465;
$mail->Username '[email protected]';
$mail->Password '*****'
Ahora se unió Hotmail a Yahoo! en el problemas de los caracteres acentuados.
GMail es el único que lee perfectamente los caracteres.
Uso un texto de prueba que es:
Código:
Lórém ípsúm dálor sit amet, ...
El cual llega perfecto a Gmail pero en Yahoo! y Hotmail llega así:
Código:
Lórém Ã*psúm dálor sit amet, ...
Saludos y espero que me ayuden.

Seguí avanzando con mis pruebas y errores y no doy con la respuesta.
Utilizé htmlentities() pero me seguía devolviendo los caracteres acentuados y no las entidades de los mismos.

¿Tendrá algo que ver $_POST?
Porque he hecho una prueba en un archivo aparte y funcionó bien.

Intenté también con strtr() y no me reemplaza los caracteres de $_POST['texto'].
Cada vez estoy más convencido de que es $_POST.
Seguiré haciendo pruebas y se los informaré.

RESOLVÍ EL PROBLEMA!!!!

Al parece include() tiene un raro funcionamiento en cuanto a caracteres especiales.
Al principio del script yo llamo al archivo modelo.php que contiene dos variables ($cuerpo que contiene más variables y código HTML y $cuerpo2 con variables y texto plano).
La forma de solucionarlo es que al usar la variable $cuerpo tengo que incluiro dentro de la función utf8_decode().

Esta línea
Código PHP:
$mail->Body $cuerpo
debe escribirse
Código PHP:
$mail->Body utf8_decode($cuerpo); 
y listo, asunto solucionado.

Gracias a todos los que me ayudaron.
Oh lo siento el gracias es sólo y unicamente para mi
También debe llevarse el crédito un post de este mismo foro pero como no puedo colocar URL... y su creador que al igual que yo lo solucionó sólo.

Saludos.

Última edición por GatorV; 07/10/2009 a las 15:16
  #4 (permalink)  
Antiguo 07/10/2009, 23:12
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 7 meses
Puntos: 214
Respuesta: Problemas con Yahoo!, htmlentities(), caracteres especiales y PHPMailer

que bueno que nadie te dio ideas!! jajajaja,
en buena hora que te funciono todo
saludos
  #5 (permalink)  
Antiguo 07/10/2009, 23:26
 
Fecha de Ingreso: abril-2008
Mensajes: 453
Antigüedad: 16 años
Puntos: 16
Respuesta: Problemas con Yahoo!, htmlentities(), caracteres especiales y PHPMailer

Cita:
Iniciado por mortiprogramador Ver Mensaje
que bueno que nadie te dio ideas!! jajajaja,
en buena hora que te funciono todo
saludos

jajajajajaja la verdad, pero si no hubieses querido ayudar tarde o temprano iba a encotra la solucion
  #6 (permalink)  
Antiguo 12/03/2014, 07:39
 
Fecha de Ingreso: octubre-2010
Mensajes: 6
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Problemas con Yahoo!, htmlentities(), caracteres especiales y PHPMailer

Tuve el mismo problema que vos y lo solucioné de la misma manera:

Código PHP:
$mail->Body utf8_decode($cuerpo); 
PEEEERO me trajo oooootro problema, al abrirlo en clientes como thunderbird y outlook, aparece un rombito en vez de los caracteres especiales y en el nuevo formato de hotmail(outlook.com) pasa lo mismo.

Sin tener que decodificar, con los únicos que tengo problema es con Yahoo y Gmail.

Saludos!
  #7 (permalink)  
Antiguo 12/03/2014, 13:09
 
Fecha de Ingreso: octubre-2010
Mensajes: 6
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Problemas con Yahoo!, htmlentities(), caracteres especiales y PHPMailer

Ahora pude:


Cita:
$html = "<div>Estoy en HTML</div>";
$nohtml = "No estoy en HTML :(";

function html_txt($a){
ini_set('memory_limit', '-1');
$a = htmlentities($a, ENT_COMPAT, 'UTF-8');
$a = str_replace(array("&lt;","&gt;","&quot;"),array("< ",">","\""),$a);
return $a;
};

function nohtml_txt($a){
// convertir caracteres para evitar incompatibilidad
$especial = array('á', 'à', 'ä', 'â', 'ª', 'Á', 'À', 'Â', 'Ä','é', 'è', 'ë', 'ê', 'É', 'È', 'Ê', 'Ë','í', 'ì', 'ï', 'î', 'Í', 'Ì', 'Ï', 'Î','ó', 'ò', 'ö', 'ô', 'Ó', 'Ò', 'Ö', 'Ô','ú', 'ù', 'ü', 'û', 'Ú', 'Ù', 'Û', 'Ü','ç', 'Ç');
$limpio = array('a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a','e', 'e', 'e', 'e', 'e', 'e', 'e', 'e','i', 'i', 'i', 'i', 'i', 'i', 'i', 'i','o', 'o', 'o', 'o', 'o', 'o', 'o', 'o','u', 'u', 'u', 'u', 'u', 'u', 'u', 'u','c', 'c');
$a = str_replace($especial,$limpio,$a);
$a = str_replace(array("\\", "º","¡","¿", "¨", "´"),'',$a);
$a = str_replace("·",'-',$a);
return $a;
};

$mail->Body = html_txt($html);
$mail->AltBody = nohtml_txt($nohtml);
No acepta imagenes en base 64 pero cambiando toda la cadena después con un poco de maña ... ;)
  #8 (permalink)  
Antiguo 12/03/2014, 14:03
 
Fecha de Ingreso: octubre-2010
Mensajes: 6
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Problemas con Yahoo!, htmlentities(), caracteres especiales y PHPMailer

Ahora si... la "maña"

Cita:
function html_txt($a){

$b64 = explode('src="',$a);
$b64_db = array();
for($i = 1 ; $i < count($b64) ; $i++){
$b64_2 = explode('"',$b64[$i]);
$b64_add = $b64_2[0];
$b64_db[] = $b64_add;
}
for($i = 0 ; $i < count($b64_db) ; $i++){
$a = str_replace($b64_db[$i],"html_txt_base64_replace_".$i,$a);
}

$a = htmlentities($a, ENT_COMPAT, 'UTF-8');
$a = str_replace(array("&lt;","&gt;","&quot;"),array("< ",">","\""),$a);

for($i = 0 ; $i < count($b64_db) ; $i++){
$a = str_replace("html_txt_base64_replace_".$i,$b64_db[$i],$a);
}

return $a;
};
El código completo quedaría:

Cita:
$html = "<div>Estoy en HTML</div>";
$nohtml = "No estoy en HTML :(";

function html_txt($a){

$b64 = explode('src="',$a);
$b64_db = array();
for($i = 1 ; $i < count($b64) ; $i++){
$b64_2 = explode('"',$b64[$i]);
$b64_add = $b64_2[0];
$b64_db[] = $b64_add;
}
for($i = 0 ; $i < count($b64_db) ; $i++){
$a = str_replace($b64_db[$i],"html_txt_base64_replace_".$i,$a);
}

$a = htmlentities($a, ENT_COMPAT, 'UTF-8');
$a = str_replace(array("&lt;","&gt;","&quot;"),array("< ",">","\""),$a);

for($i = 0 ; $i < count($b64_db) ; $i++){
$a = str_replace("html_txt_base64_replace_".$i,$b64_db[$i],$a);
}

return $a;
};

function nohtml_txt($a){
// convertir caracteres para evitar incompatibilidad
$especial = array('á', 'à', 'ä', 'â', 'ª', 'Á', 'À', 'Â', 'Ä','é', 'è', 'ë', 'ê', 'É', 'È', 'Ê', 'Ë','í', 'ì', 'ï', 'î', 'Í', 'Ì', 'Ï', 'Î','ó', 'ò', 'ö', 'ô', 'Ó', 'Ò', 'Ö', 'Ô','ú', 'ù', 'ü', 'û', 'Ú', 'Ù', 'Û', 'Ü','ç', 'Ç');
$limpio = array('a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a','e', 'e', 'e', 'e', 'e', 'e', 'e', 'e','i', 'i', 'i', 'i', 'i', 'i', 'i', 'i','o', 'o', 'o', 'o', 'o', 'o', 'o', 'o','u', 'u', 'u', 'u', 'u', 'u', 'u', 'u','c', 'c');
$a = str_replace($especial,$limpio,$a);
$a = str_replace(array("\\", "º","¡","¿", "¨", "´"),'',$a);
$a = str_replace("·",'-',$a);
return $a;
};

$mail->Body = html_txt($html);
$mail->AltBody = nohtml_txt($nohtml);
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 17:03.