Foros del Web » Programando para Internet » PHP »

mail(), encabezados y saltos de linea

Estas en el tema de mail(), encabezados y saltos de linea en el foro de PHP en Foros del Web. Bueno, el enviar mails me funciona, mi server tiene Linux y tanto en los encabezados como en el mensaje todo funciona perfecto usando \n. El ...
  #1 (permalink)  
Antiguo 29/11/2002, 13:29
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 21 años, 10 meses
Puntos: 0
mail(), encabezados y saltos de linea

Bueno, el enviar mails me funciona, mi server tiene Linux y tanto en los encabezados como en el mensaje todo funciona perfecto usando \n.

El problema se presenta cuando quiero hacer el envio de mails compatible con todos los SO.
Para ello uso esto para determinar el salto:

if (stristr(PHP_OS,"win"))
$salto_server="\r\n";
elseif ((stristr(PHP_OS,"Unix"))||(stristr($soft,"Linux") ))
$salto_server="\n";
elseif (stristr(PHP_OS,"Mac"))
$salto_server="\r";
else
$salto_server="\n";

Cuando suplanto \n por $salto_server en el mensaje funciona perfecto, el mensaje llega con los saltos que le di. Pero cuando cambio los \n por $salto_server en los encabezados, aca no le presta atencion y viene todo junto, como si no existiera el salto.

Alguien sabe a que se puede deber esto? que solo funcione con \n y no con $salto_server ($salto_server="\n")
  #2 (permalink)  
Antiguo 29/11/2002, 19:30
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 21 años, 10 meses
Puntos: 0
Hay alguien ahi?
  #3 (permalink)  
Antiguo 30/11/2002, 06:44
Avatar de Kernellover  
Fecha de Ingreso: noviembre-2002
Ubicación: Perdido
Mensajes: 251
Antigüedad: 21 años, 5 meses
Puntos: 0
Por que no tratas de hacerlo con un switch, bueno es solo una idea.

Sería bueno que nos dijeras que versión de PHP usa tu sever para poder tener mas definido tu problema.

Has provado de detectar si hay algo en PHP_OS con un print ?

Puede que me equivoque pero prueva a poner el $ al PHP_OS.
Por otro lado yo le pondría los {} para cada estructura de control, puede ser que el provlema venga por allí.

De todos modos te pongo el codigo que pondría yo con el switch.

Código PHP:
switch (strtolower($PHP_OS)) {
  case 
"win":
     
$salto_server="\r\n";
     break;
  case 
"mac":
     
$salto_server="\r";
     break;
  default:
     
$salto_server="\n"
     
break;

Espero que te funcione pronto.
  #4 (permalink)  
Antiguo 30/11/2002, 13:28
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 21 años, 10 meses
Puntos: 0
Me sigue pasando lo mismo. Y efectivamente, comprobe el contenido de la variable PHP_OS y es correcto, de hecho si funciona para el mensaje. No me harias el favor de hacer la prueba en tu server? Separa las lineas por $salto_server y los encabezados tambien, a ver como te llegan.
  #5 (permalink)  
Antiguo 30/11/2002, 15:14
Avatar de Kernellover  
Fecha de Ingreso: noviembre-2002
Ubicación: Perdido
Mensajes: 251
Antigüedad: 21 años, 5 meses
Puntos: 0
Lo siento, mi server no es tanto server, no tengo configurado un smtp para el correo. Por otro lado creo que se que es lo que está pasando.

Me has dicho que cuando envias el mail llega mal, creo que tiene que ver con que el código PHP se ejecuta teniendo en cuenta el OS del usuario que envia el correo, no el OS del usuario que recibe el correo, no se si me explico.

Si yo tengo Mac y tu Linux, y tu me envias el mail a mí, me llegará con el \n no con el \r.

En fin, siento no haber podido ayudarte en lo del server, si ya se que lo tengo que montar...

Espero respuesta a ver si tengo razón o que.
  #6 (permalink)  
Antiguo 30/11/2002, 15:38
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
¿Y si pones el codigo de envio de tu email? No se, puede que estes usando ' donde deberias usar ".

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #7 (permalink)  
Antiguo 30/11/2002, 19:39
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 21 años, 10 meses
Puntos: 0
Josemi, esto es exactamente lo que uso:

Código PHP:
<?php
if (stristr(PHP_OS,"win"))
    
$salto_server="\r\n";
elseif ((
stristr(PHP_OS,"Unix"))||(stristr($soft,"Linux")))
    
$salto_server="\n";
elseif (
stristr(PHP_OS,"Mac"))
    
$salto_server="\r";
else
    
$salto_server="\n";


    
function 
enviarmail($maildestino,$cc,$bcc,$asunto,$mensaje,$nombreorigen,$mailorigen,$tipo)
    {
    
$headers"Content-type: text/$tipo; charset=iso-8859-1";
    
$headers .= $salto_server."From: $nombreorigen<$mailorigen>";
    
$headers .= $salto_server."Reply-To: $nombreorigen<$mailorigen>";
    if ((
$cc!="")&&($cc!=null))
        
$headers .= $salto_server."cc: $cc<$cc>";
    if ((
$bcc!="")&&($bcc!=null))
        
$headers .= $salto_server."Bcc: $bcc<$bcc>";
    
$headers .= $salto_server."X-Mailer: PHP/".phpversion();
    return @
mail($maildestino,$asunto,$mensaje,$headers);
    }

$maildestino="[email protected]";
$cc="";
$bcc="";
$asunto="asunto";
$mensaje="Hola".$salto_server."chau";
$nombreorigen="nombreorigen";
$mailorigen="[email protected]";
$tipo="plain";
enviarmail($maildestino,$cc,$bcc,$asunto,$mensaje,$nombreorigen,$mailorigen,$tipo);
?>
El mensaje llega con el salto tanto si uso \n como $salto_server, pero los encabezados solo llegan correctamente si utilizo \n, sino llegan pegados.
Que estara pasando?
  #8 (permalink)  
Antiguo 30/11/2002, 19:56
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
No se si será la solución .. pero yo los salto de lineas los pondria al final de cada cabecera . incluida la ultima:

Código PHP:
    $headers"Content-type: text/$tipo; charset=iso-8859-1".$salto_server;
    
$headers .= "From: $nombreorigen<$mailorigen>".$salto_server;
    
$headers .= "Reply-To: $nombreorigen<$mailorigen>".$salto_server;
    if ((
$cc!="")&&($cc!=null))
        
$headers .= "cc: $cc<$cc>".$salto_server;
    if ((
$bcc!="")&&($bcc!=null))
        
$headers .= "Bcc: $bcc<$bcc>.$salto_server";
    
$headers .= "X-Mailer: PHP/".phpversion().$salto_server
Pruebalo y nos cuentas . no pierdes nada ..

Y .. como comentario .. cuando se envian cabeceras HTTP .. entre las caberas (de typo, y otros detalles) a los propios datos en si hay q indicarle doble salto de linea \n\n .. (eso si lo hicieramos directo) ..

<especulacion>
Interamente no se como funcionará mail .. pero podria ser que mail() inserte un salto de liena entre el $mensaje .. y las $cabeceras .. y le haga falta el \n de mas ... Por lo menos siempre que he visto cabeceras extra de mail he visto q hasta la ultima cabecera incluye un salto de linea .. cosa q en tu codigo no lo usas ...
</especulacion>

Un saludo,
  #9 (permalink)  
Antiguo 30/11/2002, 22:24
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 21 años, 10 meses
Puntos: 0
Cluster, hice lo que me dijiste y nada, sigue igual.
Y se me ocurrio probar algo con un resultado realmente curioso:

Fije directamente $salto_server="XXX";

Obviamente, el mensaje llego como holaXXXchau.

Pero, llego! que paso con las cabeceras? viendo el codigo fuente del mensaje, las cabeceras siguen apareciendo una al lado de la otra, como si $salto_server no existiera, igual que cuando este valia "\n".

Que esta pasandoooooooooooooo
  #10 (permalink)  
Antiguo 01/12/2002, 11:50
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 21 años, 10 meses
Puntos: 0
A nadie se le ocurre nada
  #11 (permalink)  
Antiguo 01/12/2002, 14:57
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Gracias por poner el codigo, porque ya he visto el error. Estas creando las cabeceras dentro de una funcion y tienes definida la variable $salto_server fuera de la funcion. Con esto estoy diciendo que dentro de la funcion no existe $salto_server con el valor de fuera, sino que se crea una nueva variable con ese mismo nombre, pero que solo existe dentro de la funcion. Con el cuerpo del mensaje si funciona porque lo generas fuera de la funcion. Es un problema de "scope" (creo que se llama ambito en castellano) . Solucion: hacer que dentro de la funcion se conozca el valor de la variable definida fuera. ¿Como? Muy sencillo, con

global $salto_server;

como primera linea de codigo dentro de la funcion. Ver el manual http://www.php.net/manual/en/languag...bles.scope.php .

Suerte.

PD: Esta se te ha escapado, Cluster.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #12 (permalink)  
Antiguo 01/12/2002, 15:10
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 21 años, 10 meses
Puntos: 0
Perfecto Josemi, anduvo de diez!
Estuve leyendo un poco pero todavia no entiendo exactamente que hace esa linea, me lo explicas please?
  #13 (permalink)  
Antiguo 01/12/2002, 15:22
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Bueno, es un poco complejo de explicar (sobre todo por un tarugo como yo). Pero probemos con una metafora. La funcion el un frasco cerrado. Dentro de el solo puedes acceder a las variables definidas dentro de ella. Con la linea del global, lo que estas haciendo es crear dentro del frasco una referencia la la variable que has definido fuera del frasco. Y asi poder leer su contenido y modificarlo si quieres.

No se si se entiende la explicacion. Ya se que no es muy exacta ni muy tecnica, pero al final lo que importa es que si quieres acceder a una variable definida fuera de una funcion debes usar esa sentencia.

O el array superglobal $GLOBAL.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #14 (permalink)  
Antiguo 01/12/2002, 15:28
 
Fecha de Ingreso: junio-2002
Ubicación: Buenos Aires, Argentina
Mensajes: 876
Antigüedad: 21 años, 10 meses
Puntos: 0
Muchisimas gracias por tu ayuda, se entendio perfecto!
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 08:55.