Trädvy Permalänk
Medlem
Registrerad
Jan 2017

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)); } ?>

Trädvy Permalänk
Legendarisk
Hedersmedlem
Plats
::1
Registrerad
Dec 2002

@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!

Abstractions all the way down.

Trädvy Permalänk
Medlem
Registrerad
Sep 2014

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...

Trädvy Permalänk
Legendarisk
Hedersmedlem
Plats
::1
Registrerad
Dec 2002

@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. ^_^

Abstractions all the way down.

Trädvy Permalänk
Medlem
Registrerad
Sep 2014

@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

Trädvy Permalänk
Medlem
Registrerad
Jan 2017

@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}"

Trädvy Permalänk
Legendarisk
Hedersmedlem
Plats
::1
Registrerad
Dec 2002

@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.

Abstractions all the way down.

Trädvy Permalänk
Medlem
Registrerad
Jan 2017

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

Trädvy Permalänk
Medlem
Registrerad
Jan 2017

@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

Trädvy Permalänk
Legendarisk
Hedersmedlem
Plats
::1
Registrerad
Dec 2002

@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.

Abstractions all the way down.

Trädvy Permalänk
Medlem
Registrerad
Jan 2017

@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)); } ?>

Trädvy Permalänk
Legendarisk
Hedersmedlem
Plats
::1
Registrerad
Dec 2002

@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å.

Abstractions all the way down.

Trädvy Permalänk
Medlem
Registrerad
Jan 2017

@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)); } ?>

Trädvy Permalänk
Legendarisk
Hedersmedlem
Plats
::1
Registrerad
Dec 2002

@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)); }

Abstractions all the way down.

Trädvy Permalänk
Legendarisk
Hedersmedlem
Plats
::1
Registrerad
Dec 2002

@Pippi2: Fungerade det?

Abstractions all the way down.

Trädvy Permalänk
Medlem
Registrerad
Jan 2017

@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