mboost-dp1

PHP: Problemer med \r\n linjeskift i HTML mail


Gå til bund
Gravatar #1 - Jace
1. dec. 2009 01:02
Hej alle

Jeg har lavet dette php script som sendes en mail ud:

# -=-=-=- MIME BOUNDARY
$mime_boundary = "----jacobworsoe----".md5(time());
# -=-=-=- MAIL HEADERS
$subject = "Ny kommentar på www.jacobworsoe.dk";
$headers = "From: jacobworsoe.dk <[email protected]>\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/alternative; boundary=\"$mime_boundary\"\n";

$message .= "--$mime_boundary\n";
$message .= "Content-Type: text/html; charset=iso-8859-1\n";
$message .= "Content-Transfer-Encoding: 8bit\n\n";

$message .= "<html>\n";
$message .= "<body style=\"font-family:Verdana, Verdana, Geneva, sans-serif; font-size:12px; color:#666666;\">\n";
$message .="<p>Ny kommentar skrevet af <b>$name:</b></p>";
$message .="<p>$comment</p>";
$message .="<p>Læs hele indlægget her:<br> ";
$message .="<a href=\"$redirect\">$redirect</p>";
$message .= "</body>\n";
$message .= "</html>\n";
# -=-=-=- FINAL BOUNDARY
$message .= "--$mime_boundary--\n\n";
# -=-=-=- SEND MAIL
mail( $to, $subject, $message, $headers );


Det virker stort set perfekt, men linjeskift i $comment bliver bare udskrevet som \r\n i mail-klienten. F.eks. sådan her:

In at magna ac lorem ornare aliquam accumsan nec arcu.\r\n\r\nMaecenas rhoncus tempor ornare. Maecenas non ante eget mauris suscipit convallis. Lorem ipsum dolor sit amet, consectetur adipiscing elit.\r\n\r\nPraesent justo tortor, condimentum vitae molestie at, imperdiet sed urna.

Hvis man kigger i kildekoden til mailen i ThunderBird, ser det således ud:

Subject: Ny kommentar på www.jacobworsoe.dk
From: "jacobworsoe.dk" <[email protected]>
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary="----jacobworsoe----759c91402b789c37b32d9f3bac50a094"


------jacobworsoe----759c91402b789c37b32d9f3bac50a094
Content-Type: text/html; charset=iso-8859-1
Content-Transfer-Encoding: 8bit

<html>
<body style="font-family:Verdana, Verdana, Geneva, sans-serif; font-size:12px; color:#666666;">
<p>Ny kommentar skrevet af <b>Mads:</b></p><p>In at magna ac lorem ornare aliquam accumsan nec arcu.\r\n\r\nMaecenas rhoncus tempor ornare. Maecenas non ante eget mauris suscipit convallis. Lorem ipsum dolor sit amet, consectetur adipiscing elit.\r\n\r\nPraesent justo tortor, condimentum vitae molestie at, imperdiet sed urna.</p><p>Læs hele indlægget her:<br> <a href="http://www.jacobworsoe.dk/overskrift-til-indlaegget-12/#comments">http://www.jacobworsoe.dk/overskrift-til-indlaegget-12/#comments</p></body>

</html>
------jacobworsoe----759c91402b789c37b32d9f3bac50a094--


Jeg har prøvet at sætte nl2br på variablen $comment, men det ændrer ingenting. I kan prøve det her:
http://www.jacobworsoe.dk/

I skal bare tilføje en kommentar og sætte hak i at I gerne vil have mails når der kommer nye kommentarer og så bare tilføje endnu en kommentar, så får I en mail...

Jeg har også testet det i gmail og det er samme fejl..
Gravatar #2 - Windcape
1. dec. 2009 01:10
Hvad laver du med $comment før du kører dit mail script?

Jeg tvivler meget på at du kører den direkte fra $_POST['comment'], og derfor er det din efterbehandling, fra før mailscriptet, som ødelægger linjeskiftene.
Gravatar #3 - Jace
1. dec. 2009 01:41
Puha, jeg tror vist det er på tide at komme i seng nu. Det er næsten for pinligt til at afsløre :) Men sådan er det når man ser sig blind på tingene... Nåh men tak for hjælpen!

$comment	= $_POST['comment'];
$comment = mysql_real_escape_string($comment);
$comment = trim($comment);
$comment = htmlentities($comment);
Gravatar #4 - arne_v
1. dec. 2009 01:55
#3

mysql_real_escape_string erstatter linieskift med 4 bogstaver backslash r backslash n.

Gravatar #5 - arne_v
1. dec. 2009 01:55
#4

Moralen må være noget i retning af ikke at køre indhold som skal sendes ud som email gennem en database formatering.
Gravatar #6 - Jace
1. dec. 2009 02:08
arne_v (4) skrev:
#3

mysql_real_escape_string erstatter linieskift med 4 bogstaver backslash r backslash n.

Okay, det skal jeg lige huske til en anden gang.

arne_v (5) skrev:
#4

Moralen må være noget i retning af ikke at køre indhold som skal sendes ud som email gennem en database formatering.

Moralen kunne også være ikke at kode kl. 3 om natten på en mandag :)
Gravatar #7 - kasperd
1. dec. 2009 10:25
Jeg bemærkede lige et par andre problemer med den kode.

For det første giver det ikke ret meget mening at beregne en md5 hash af tidspunktet. Skal koden bruges med bruger input, hvor brugerne dermed kan gætte hvad din seperator er og dermed sætte ekstra seperatorer ind i indholdet og konstruere ekstra attachments?

Din multipart/alternative har kun en part. Det betyder at i nogle email klienter vil dine emails vises uden indhold. Du er nødt til at have en text/plain part for at være sikker på at det virker. Det er en god idé at sætte text/plain først så den er nem at finde, hvis nogen bruger en mail klient helt uden mime support. (Du kan også bare nøjes med ren tekst, det virker med alle mail klienter jeg nogensinde har set).

Du bør undgå at blande forskellige formater af newlines. Jeg ved ikke præcis hvad php forventer. I SMTP protokollen sendes emails med to tegn som newline. Men på de systemer jeg kender gemmes de lokalt som et enkelt tegn, og koden til at håndtere SMTP står også for at tilføje og fjerne det ekstra tegn.

Du skal være opmærksom på, at linier startende med et punktum og linier startende med From efterfulgt af et mellemrum begge håndteres specielt. Jeg ved ikke hvordan php håndterer dem, men hvis du har mulighed for at escape dem hvis de skulle forekomme, så er du på den sikre side. Der findes encodings hvor de kan escapes.

Du angiver et afsender domæne som anvender domain keys, men du sætter ingen signatur på mailen. Hvis du bruger samme afsender adresse som envelope afsender adressen, så kan du risikere at modtagerserveren afviser det.
Gravatar #8 - Jace
1. dec. 2009 13:55
Hej kasperd

Mange tak fordi du gider kigge koden igennem. Jeg ved ikke ret meget om at skrive til mail klienter, så jeg snuppede et kode eksempel fra php's side og ændrede lidt i det:
http://dk2.php.net/manual/en/function.mail.php#857...

Så jeg har ikke den store forståelse af hvordan det ligger med kompatibilitet og sikkerhed. Jeg har kun testet i gmail og thunderbird, så jeg må lige støve lidt flere klienter frem og teste i dem :)
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login