Permalänk
Medlem

PHP mail ser fel ut i dator.

Hej.
Jag försöker att hitta vad som är fel då mail ser helt fel ut i mailprogram i datorer men rätt på smartphones och plattor. Jag har två filer Send.mail.php och mail.inc.php och jag kan inte för mitt liv se vad som skapar denna output

http://bmhab.se/gabi/1111.JPG

Någon som kan hjälpa till? Det syns kod i ämnes- meddelande- och bifogatfältet.

**Send.mail.php** <?php header("Content-Type: text/html; charset=iso-8859-1"); include_once("php_includes/check_login_status.php"); // If user is already logged in, header that weenis away if($user_ok != true){ header("location: secure.php"); exit(); } include_once("php_includes/db_conx.php"); include_once("php_includes/init.inc.php"); $query = "SELECT email FROM xxxxx2 WHERE regional = 1 OR regional = 2"; $result=mysqli_query($db_conx, $query); while ($row = mysqli_fetch_array($result)) { $email = $row["email"]; if (isset($_POST['name'], $_FILES['file'])) { $body = <<<BODY Ämne:<br> {$_POST['name']} <p> Meddelande:<br> {$_POST['meddelande']} BODY; mail_file($email, 'auto_responder@xxxxxx.se', 'Svemod Mail', $body, $_FILES['file']); } } ?> <!DOCTYPE html> <html> <head> <META HTTP-EQUIV="Expires" CONTENT="Mon, 27 Jul 1997 00:00:00 GMT" /> <META HTTP-EQUIV="Pragma" CONTENT="no-cache" /> <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache" /> <title>Xxxxxx - Mail</title> <link rel="icon" href="favicon.ico" type="image/x-icon"> <link rel="stylesheet" href="styles/style.css"> <style type="text/css"> <!-- tr:hover{ background: #333; } .style1 {color: #FF0000} --> </style> </head> <body bgcolor="#000000"> <?php include_once("template_pageTop.php"); ?> <div id="pageMiddle"> <form action="" method="post" enctype="multipart/form-data"> <table align="center"> <tr> <td>Skriv nytt meddelande (gl&ouml;m inte skriva i meddelandet vem avs&auml;ndaren &auml;r)</td> </tr> <tr> <td class="style1">OBS! Klicka bara 1 g&aring;ng. Det tar n&aring;gon minut innan n&auml;sta sida kommer fram. OBS!</td> </tr> <tr> <td><label for="name">&Auml;mne</label></td> </tr> <tr> <td><input type="text" name="name" id="name" /></td> </tr> <tr> <td><label for="meddelande">Meddelande</label></td> </tr> <tr> <td><textarea name="meddelande" id="meddelande" cols="50" rows="10" wrap="hard"></textarea></td> </tr> <tr> <td><label for="file">V&auml;lj fil</label></td> </tr> <tr> <td><input type="file" name="file" id="file" /></td> </tr> <tr> <td><input type="submit" value="Skicka mail" /></td> </tr> </table> </form> </div> <?php include_once("template_pageBottom.php"); ?> </body> </html> **mail.inc.php** <?php header("Content-Type: text/html; charset=iso-8859-1"); function mail_file($to, $from, $subject, $body, $file) { $boundary = md5(rand()); $headers = array( 'MIME-Version: 1.0', "Content-Type: multipart/mixed; boundary=\"{$boundary}\"", "Content-type: text/html; charset=iso-8859-1", "From: {$from}" ); $message = array( "--{$boundary}", 'Content-Type: text/HTML; charset=iso-8859-1', 'Content-Transfer-Encoding: 7bit', '', chunk_split($body), "--{$boundary}", "Content-Type: {$file['type']}; name=\"{$file['name']}\"", "Content-Disposition: attachment; filename=\"{$file['name']}\"", "Content-Transfer-Encoding: base64", '', chunk_split(base64_encode(file_get_contents($file['tmp_name']))), "--{$boundary}--", '', ); mail($to, $subject, implode("\r\n", $message), implode("\r\n", $headers)); } ?>

Permalänk
Legendarisk

@Pippi2: Du skickar två olika Content-Type-headers (i $headers) vilket får dina klienter att tolka hela meddelandet som text/html istället för multipart/mixed. Att formatera e-post korrekt är dock en mindre vetenskap och det lättaste är ofta att använda ett färdigt bibliotek som hjälper till med alla detaljer.

För att testa formatet kan du t.ex. använda den här sidan:
https://tools.ietf.org/tools/msglint/

Välkommen till forumet!

Visa signatur

Abstractions all the way down.

Permalänk
Medlem

Borde det inte bara ett par fnuttar här:

'Content-Type: text/HTML; charset=iso-8859-1', -------- 'Content-Type: text/HTML; charset="iso-8859-1"',

Kan vara ute och cykla också

Edit: Det som Tunnelsork skrev lät mer vettigt!
Edit2: Jag var ute och cykla, se nedan...

Permalänk
Legendarisk

@noyce: Värden för parametrar i Content-Type-headern kan vara antingen "quoted-strings" (som har sitt eget format), eller så kallade "tokens" som kort sammanfattat kan bestå av (i ASCII) bokstäver, siffror och vissa (men inte alla) skiljetecken. Just "iso-8859-1" är tillåtet att skriva ociterat. Formatet beskrivs mer i detalj här: https://tools.ietf.org/html/rfc2045#section-5.1.

Tycker man inte det är särdeles upphetsande att läsa RFC:s så gör man klokt i att låta någon annan lösa det istället för att anropa mail() direkt. ^_^

Visa signatur

Abstractions all the way down.

Permalänk
Medlem

@Tunnelsork: Där lärde jag mig något nytt, tackar! Hade lite på känn att det nog inte var problemet, hade å andra sidan inte varit första gången i världshistorien ett missat tecken ställde till det

Permalänk
Medlem

@Tunnelsork: Tack så mycket för välkomnandet
Antar att du menat i filen **mail.inc.php**?
Hur ska jag fixa till det bäst? Tips?

<?php header("Content-Type: text/html; charset=iso-8859-1"); function mail_file($to, $from, $subject, $body, $file) { $boundary = md5(rand()); $headers = array( 'MIME-Version: 1.0', "Content-Type: multipart/mixed; boundary=\"{$boundary}\"", "Content-type: text/html; charset=iso-8859-1", "From: {$from}"

Permalänk
Legendarisk

@Pippi2: Radera den markerade raden:

<?php header("Content-Type: text/html; charset=iso-8859-1"); function mail_file($to, $from, $subject, $body, $file) { $boundary = md5(rand()); $headers = array( 'MIME-Version: 1.0', "Content-Type: multipart/mixed; boundary=\"{$boundary}\"", "Content-type: text/html; charset=iso-8859-1", "From: {$from}"

Den ersätter innehållstypen för hela meddelandet nu, när det egentligen bara är en av delarna i det här formatet som är HTML.

Visa signatur

Abstractions all the way down.

Permalänk
Medlem

@Tunnelsork:
Tack!!! You're the King. Ska testa hemma.

Permalänk
Medlem

@Tunnelsork:
Det funkar perfekt nu utom en sak.
Nu återstår bara feltecken för åäö när mail går till Hotmail på androida enheter. Överallt annars funkar mailen. Outlook på dator till både gmail och hotmail men när de kommer till android smarthone hotmail ser det hemskt ut.
Vet du varför oh store guru?

Se bild http://bmhab.se/gabi/cccc.jpg

Det ska stå:
Ämne:
Test åäö
Meddelande:
åäö brödtext

Permalänk
Legendarisk

@Pippi2: Det har antagligen att göra med att HTML-blocket skickas okodat som Content-Transfer-Encoding: 7bit, men trots det innehåller 8 bitars-tecken ("åäö" i den teckentabell du använder där). Det är möjligt att du kan komma undan med att bara ändra den till 8bit, men det är ingen vidare robust lösning. Bättre vore att koda meddelandets innehåll som t.ex. quoted-printable innan det skickas; i PHP kan du göra det via quoted_printable_encode().

Headern det gäller är markerad här:

$message = array( "--{$boundary}", 'Content-Type: text/HTML; charset=iso-8859-1', 'Content-Transfer-Encoding: 7bit',

Alternativ:

1) quoted-printable

Ersätt headern med Content-Transfer-Encoding: quoted-printable och koda om meddelanden med quoted_printable_encode():

$message = array( "--{$boundary}", 'Content-Type: text/HTML; charset=iso-8859-1', 'Content-Transfer-Encoding: quoted-printable', '', quoted_printable_encode($body),

2) 8bit

Ersätt headern med Content-Transfer-Encoding: 8bit. Har du tur så räcker det så, men det kan leda till problem med radlängder och -brytningar.

Visa signatur

Abstractions all the way down.

Permalänk
Medlem

@Tunnelsork:
Tack. Vill först tacka för all fin hjälp
Tror jag går på alternativ nr 1.
Vad menar du med "och koda om meddelanden med quoted_printable_encode(): ?
Jag har varit ifrån detta i 10 år nu, rostig som ett bläckjärn.
Menar du så här i mail.inc.php?

<?php header("Content-Type: text/html; charset=iso-8859-1"); function mail_file($to, $from, $subject, $body, $file) { $boundary = md5(rand()); $headers = array( 'MIME-Version: 1.0', "Content-Type: multipart/mixed; charset=iso-8859-1; boundary=\"{$boundary}\"", "From: {$from}" ); $message = array( "--{$boundary}", 'Content-Type: text/HTML; charset=iso-8859-1', 'Content-Transfer-Encoding: 7bit', 'Content-Transfer-Encoding: quoted-printable', '', quoted_printable_encode($body), '', chunk_split($body), "--{$boundary}", "Content-Type: {$file['type']}; name=\"{$file['name']}\"", "Content-Disposition: attachment; filename=\"{$file['name']}\"", "Content-Transfer-Encoding: base64", '', chunk_split(base64_encode(file_get_contents($file['tmp_name']))), "--{$boundary}--", '', ); mail($to, $subject, implode("\r\n", $message), implode("\r\n", $headers)); } ?>

Permalänk
Legendarisk

@Pippi2: Förutom att du nu har två Content-Transfer-Encoding-headers i ditt HTML-block, ta bort den som inte längre används.

Edit: Och din $body är med två gånger också.

Visa signatur

Abstractions all the way down.

Permalänk
Medlem

@Tunnelsork:
Like this? Är det inte en '', för mycket?

<?php header("Content-Type: text/html; charset=iso-8859-1"); function mail_file($to, $from, $subject, $body, $file) { $boundary = md5(rand()); $headers = array( 'MIME-Version: 1.0', "Content-Type: multipart/mixed; charset=iso-8859-1; boundary=\"{$boundary}\"", "From: {$from}" ); $message = array( "--{$boundary}", 'Content-Type: text/HTML; charset=iso-8859-1', 'Content-Transfer-Encoding: quoted-printable', '', quoted_printable_encode($body), '', chunk_split($body), "--{$boundary}", "Content-Type: {$file['type']}; name=\"{$file['name']}\"", "Content-Disposition: attachment; filename=\"{$file['name']}\"", "Content-Transfer-Encoding: base64", '', chunk_split(base64_encode(file_get_contents($file['tmp_name']))), "--{$boundary}--", '', ); mail($to, $subject, implode("\r\n", $message), implode("\r\n", $headers)); } ?>

Permalänk
Legendarisk

@Pippi2: Det blir lättare att läsa om du indenterar koden på konsekvent sätt:

function mail_file($to, $from, $subject, $body, $file) { $boundary = md5(rand()); $headers = [ 'MIME-Version: 1.0', "Content-Type: multipart/mixed; charset=iso-8859-1; boundary=\"{$boundary}\"", "From: {$from}" ]; $message = [ "--{$boundary}", 'Content-Type: text/HTML; charset=iso-8859-1', 'Content-Transfer-Encoding: quoted-printable', '', quoted_printable_encode($body), // Här är ditt nya innehåll kodat som quoted-printable. '', // Kommer orsaka en extra radbrytning efter meddelandet. chunk_split($body), // Här har du fortfarande kvar det gamla innehållet. Ta bort det. "--{$boundary}", "Content-Type: {$file['type']}; name=\"{$file['name']}\"", "Content-Disposition: attachment; filename=\"{$file['name']}\"", "Content-Transfer-Encoding: base64", '', chunk_split(base64_encode(file_get_contents($file['tmp_name']))), "--{$boundary}--", '', ]; mail($to, $subject, implode("\r\n", $message), implode("\r\n", $headers)); }

Visa signatur

Abstractions all the way down.

Permalänk
Legendarisk

@Pippi2: Fungerade det?

Visa signatur

Abstractions all the way down.

Permalänk
Medlem

@Tunnelsork:
Ja tack
Testade idag och det funkar klockers. Du är ett GENI
Nu ska jag bara lägga in en ny tråd om ett enkelt utloggningsscript men du har varit en ängel