2010-12-11 21 views
25

He visto muchos ejemplos usando la función de correo php. Algunos de ellos usan \ r \ n como salto de línea para el encabezado, algunos usan \ n.¿Qué salto de línea en el encabezado de php mail, r n o n?

$headers = "From: Just Me\n"; 
$headers .= "Reply-To: Just me <$email>\n"; 

vs

$headers = "From: Just Me\r\n"; 
$headers .= "Reply-To: Just me <$email>\r\n"; 

cuál es la correcta?

A veces he tenido casos en los que se usa \ r \ n y algunos clientes de correo interpretan parte del encabezado como texto de correo (perdiendo la información del encabezado) - ¿esto es porque \ r \ n está mal?

Respuesta

21

El CRLF \r\n, se debe utilizar de acuerdo con php documentation. Además, para ajustarse a las líneas de especificación RFC 2822, debe delimitar el carácter de retorno de carro, CR \rinmediatamente seguido del salto de línea, LF \n.

Desde \r\n es nativa de las plataformas Windows y Unix a \n, puede utilizar la constante PHP_EOL­Docs en Windows, que es el carácter de línea nueva apropiada para la plataforma de la secuencia de comandos se está ejecutando actualmente.

+0

@Amber Ups! Editado Gracias por eso :) –

+1

Me pregunto por qué algunos clientes de correo interpretan \ r \ n como dos saltos de línea (Thunderbird parece estar entre ellos). – Sam

+0

@Sam Lamentablemente, no estoy del todo seguro. Por favor, avíseme si encuentra una respuesta. –

7

Como se indicó anteriormente, \ r \ n es lo que debe usar de acuerdo con el RFC, pero esto rompe sus encabezados en varios sistemas de correo (por ejemplo, Outlook 2003). Aunque \ n no es el salto de línea 'apropiado' para usar, en mi experiencia funciona correctamente en todos los sistemas de correo que he encontrado hasta ahora. Debido a esto, siempre uso simplemente \ n.

+1

Sería útil una lista de clientes de correo electrónico en los que \ n por sí mismo hace que los encabezados se malinterpreten. Parece raro y tonto es el programador de cliente de correo electrónico que usaría el carácter \ n como parte del valor de un encabezado de correo electrónico, ya que el RFC no lo permite explícitamente: "Un cuerpo de campo puede estar compuesto de caracteres US-ASCII, excepto CR y LF ". (Sección 2.2). El comportamiento del cliente cuando hay un \ n por sí solo antes de las dos nuevas líneas que terminan los encabezados no está definido, por lo que usar \ n como un terminador de valor de encabezado es más sensato que seguir el RFC. –

10

En caso de que un motor de búsqueda lo recoja y le ahorre a otra persona la frustración que experimenté: aquí hay una curiosidad adicional.

En php 5.2x en Linux, tenía \ r \ n en mis encabezados de correo electrónico en php mail(), después de una actualización a php 5.3.3, el formato y el envío fallaron misteriosamente. Al eliminar el archivo, se arregló el script (después de examinar muchas otras posibilidades).

+0

Acabo de tropezar con este problema, lo resolví reemplazando CRLF con nuevas líneas simples – alkar

+0

Es porque ellos convierten ** \ n ** en ** \ r \ n ** así que cuando usas ** \ r \ n ** la salida será ** \ r \ r \ n ** – user3292788

1

He tenido el problema de los encabezados de gmail malentendido \ r \ n, pero simplemente dejar los saltos de línea de encabezado en \ n no fue suficiente en mi caso, porque en ese caso algunas versiones de Outlook mostraban correos vacíos.

La solución en https://stackoverflow.com/a/7960957 (elegí instalar postfix 2.9 en lúcido desde una ppa) junto con el uso \ n parece funcionar en todas partes.

2

Mi experiencia: Los correos electrónicos HTML funcionaban en clientes web, pero se rompían en clientes de escritorio basados ​​en MS (Entourage, Outlook). Estaba usando \ r \ n. Se eliminó el \ r en la versión MIME solamente y ahora funciona en todos los ámbitos.

1

he cambiado de secuencia de comandos para utilizar PHP_EOL lugar que parece funcionar - como esto:

//Set Content-type header 
$headers = "MIME-Version: 1.0" . PHP_EOL; 
$headers .= "Content-type: text/html; charset=iso-8859-1" . PHP_EOL; 
//Additional headers 
$headers .= "From: $from" . PHP_EOL; 
$headers .= "Cc: $cc" . PHP_EOL;  
$headers .= "Content-type: text/html" . PHP_EOL; 
$headers .= "Bcc: $bcc" . PHP_EOL; 

NB. ¡Asegúrate de "en lugar de" ya que este último parece no funcionar!

2

El RFC exige formalmente CRLF (\ r \ n) pero usar rupturas de Unix (\ n) para los encabezados te ahorrará muchos problemas Algunos servidores de correo, como qmail, rechazarán tu mensaje si usa \ r \ n.

Fuente: experiencia, confirmada por esta nota: http://www.php.net/function.mail#40204

+0

esto es realmente lo que debería ser la respuesta aceptada, en mi humilde opinión. – eis

+1

En realidad, la razón por la que todo el mundo dice que \ r \ n no funciona y \ n funciona es porque están en un entorno Unix que envía correo localmente. Esto no es lo mismo que enviar un correo electrónico directamente a un servidor de correo con SMTP. – Phil

Cuestiones relacionadas