2010-07-16 21 views
1

Lors de la création d'un script pour envoyer des emails en utilisant la fonction PHP mail(), je rencontre des problèmes avec de nouvelles lignes. PHP sur les systèmes Unix s'attend à ce que les en-têtes soient séparés par un caractère LF, malgré ce que the docs dit, sendmail puis remplace ceux-ci par le bon CRLF. Cependant, sous Windows, le message et les en-têtes sont envoyés comme prévu. Cela a été décrit dans un long running PHP bug report.Envoi de courriels multiplateformes avec PHP, comment gérer les sauts de ligne?

Je besoin d'une méthode pour détecter si le système exécute la version Unix de sendmail afin d'utiliser LF et utiliser CRLF sous Windows. Je suis au courant de PHP_EOL mais je me demande s'il y a une manière plus élégante de manipuler ceci.

Actuellement, je construis mon message, tel que spécifié par les docs, comme ça.

<?php 
$to  = "[email protected]"; 
$subject = "Email Subject Here"; 
$message = "Hello this is a plaintext\n message with a line break."; 
$headers = array(
    "From: [email protected]", 
    "Reply-To: [email protected]", 
    "X-Mailer: PHP/" . phpversion() 
); 

$success = mail($to, $subject, $message, join("\r\n", $headers)); 
if ($success) { 
    echo "Mail Sent\n"; 
} else { 
    echo "Mail Failed\n"; 
} 

Sur les systèmes Unix cela se traduit par le message suivant envoyé à sendmail (\r et \n ont été remplacées par des représentations textuelles):

To: [email protected] 
Subject: Email Subject HereLF 
X-PHP-Originating-Script: 501:mail.phpLF 
From: [email protected] 
Reply-To: [email protected] 
X-Mailer: PHP/5.3.1LF 
LF 
Hello this is a plaintextLF 
message with a line break.LF 

Lorsque cela est passé à sendmail tous LF sont remplacés par CRLF entraînant des retours chariot en double. Certains serveurs de messagerie remplacent ensuite ce CR supplémentaire par CRLF, ce qui entraîne un saut de ligne supplémentaire et tous les en-têtes, dans ce cas, après From:, font désormais partie du corps du message.

PHP insère effectivement l'en-tête X-PHP-Originating-Script avec une fin de ligne incorrecte, ce qui est un problème secondaire, mais toujours ennuyeux. - En fait, un bug PHP 5.3, maintenant corrigé.

Des idées sur un moyen idéal de gérer cette plate-forme?

Merci,

Aron

Répondre

1

Ce fut un défaut plutôt transitoire au début 5.3 versions see this bug notice

Améliorez votre PHP

+0

Ah merci, ont mis à jour ma question pour en tenir compte. Je suis toujours à la recherche d'un moyen de gérer les différentes fins de ligne requises par 'mail()' sous Unix et Windows – ac94