FAQ |
Kalender |
![]() |
#11 | |||
|
||||
Mycket flitig postare
|
Kollar jag headers/källkod för meddelandet som tas emot finns följande felmeddelande. Vet i katten hur jag ska ta mig runt detta:
Thunderbird: X-Amavis-Alert: BAD HEADER Non-encoded 8-bit data (char C3 hex) in message header 'Subject': Subject: ***EPOST FR\303\205N HEMSIDAN***\n Outlook Express: X-Amavis-Alert: BAD HEADER Non-encoded 8-bit data (char C5 hex) in message header 'Subject': Subject: ***EPOST FR\305N HEMSIDAN***\n Varför den bara klagar på Subject förstår jag inte. På From fungerar ju inte å, ä och ö heller. |
|||
![]() |
![]() |
![]() |
#12 | |||
|
||||
Mycket flitig postare
|
Jag har äntligen löst det!
Nu fungerar även svenska tecken i From och Subject genom att dra berörda strängar genom följande funktion: Kod:
function encode_iso88591($string) { $text = '=?iso-8859-1?q?'; for( $i = 0; $i < strlen($string); $i++ ) { $val = ord($string[$i]); if($val > 127) { $val = dechex($val); $text .= '='.$val; } else { $text .= $string[$i]; } } $text .= '?='; return $text; } ![]() |
|||
![]() |
![]() |
![]() |
#13 | |||
|
||||
Mycket flitig postare
|
Lite grundläggande info om mime-encoding (mime är inte bara att sätta en header till mime
![]() Mejlstandarden är urgammal och egentligen får man inte skicka något annat är "amerikanska" ascii-tecken, dvs endast 7-bitars (iso-8859 har 8 bitar, unicode 16 bitar). Det går alltså inte att skicka svenska tecken. Eftersom detta snabbt blev otillräckligt så utvecklades mime-standarden som gör det möjligt att skicka "vanlig" (svensk) text och allehanda filer genom att omvandla dessa till 7-bitars text innan de skickas. För headers i mejlet innebär detta att text som innehåller "oamerikanska" tecken inkapslas i Kod:
From: =?utf-8?Q?=c3=85sa=20H=c3=b6gland=c3?= <[email protected]> Hela strängen byggs alltså upp genom [header]: =?[använd_encoding]?Q?[text_med_åäö_ovandlade_till_=XX]?= I synnerhet är det headers: Subject:, From: och To: som behöver detta. Hur fixar man då detta i php? Jo man glömmer alltihop ovan och använder bara funktionen iconv_mime_encode() eller mb_encode_mimeheader("TExtsträng", "utf-8", "Q") alltså exempelvis: Kod:
$subject = "Subject: ".mb_encode_mimeheader("Om våra produkter", "utf-8", "Q")."\r\n"; Kod:
$from = "From: ".mb_encode_mimeheader("Åsa", "utf-8", "Q")."<".$email.">\r\n"; Kod:
preg_replace('/[^\x21-\x3C\x3E-\x7E\x09\x20]/e','sprintf( "=%02x", ord("$0"));',$mimetext); 1. Ingen rad får längre än 80 (ascii)tecken 2. Varje rad måste avslutas med "\r\n" 3. Ingen tecken får förekomma som är "större än" 7 bitar Du behöver dessa headers: Kod:
MIME-Version: 1.0; Content-Type: text/plain; charset=utf-8; Content-Transfer-Encoding: quoted-printable; Content-Type ochContent-Transfer-Encoding varierar givetvis beroende på vad skicka, t ex bilagor, bilder, html, och hur du encodar det, base64 är lämpligt för bilagor, se http://de2.php.net/manual/en/function.base...se64-encode.php Tyvärr finns ingen smart funktion såvitt jag vet för att mime-encoda meddelandet som quoted-printable så jag använder: Kod:
function encodeQuotedPrintable($textblock) { $textblock = preg_replace( '/[^\x21-\x3C\x3E-\x7E\x09\x20]/e', 'sprintf( "=%02x", ord ( "$0" ) );', $textblock ); return preg_replace ( '/(.{73}[^=]{0,3})/', '$1'."=\r\n", $textblock); } Om man inte mime-kodar sina mejl riktigt så finns det ingen garanti att dom ser bra ut när dom kommer fram... Men egentligen kan man använda mb_send_mail() som sköter allt detta självt... Så, det här får ni i hemläxa tills imorgon! :P ![]() PS. Reply-to: används för att ange en annan svars adress än den som anges i From: t ex Kod:
From: kampanjer@företag.se Reply-to: kundtjänst@företag.se |
|||
![]() |
![]() |
![]() |
#14 | |||
|
||||
Mycket flitig postare
|
Citat:
Jag skulle alltså använda: Kod:
mail("[email protected]", mb_encode_mimeheader($subject,"iso-8859-1","Q"), encodeQuotedPrintable($body), *"From: " . mb_encode_mimeheader($name,"iso-8859-1","Q") ."<".$email.">\r\n" . *"MIME-Version: 1.0\r\n" . *"Content-type: text/plain; charset=iso-8859-1\r\n" . *"Content-Transfer-Encoding: quoted-printable;\r\n" De flesta mejlservrar bråkar inte med å ä ö etc i meddelandedelen men för att vara säker bör man hålla sig till mime-standarden så man inte får några bokstäver ersatta med X (och framförallt vara noga med att ange rätt charset). |
|||
![]() |
![]() |
![]() |
#15 | |||
|
||||
Mycket flitig postare
|
Ojojojojojoj.... vilken klippa du är!
Har fick man maaaassa grym information rakt upp och ner, en massa information som jag kom över inatt efter några timmars googlande och pusslade från en massa sajter... dock så fick jag inte fram riktigt allt det du nämnde här på några rader! All heder åt dig Martine! ![]() Men du... jag ska nu testa göra som du visar ovan istället för min lilla kodsnutt jag satte ihop inatt... men en fråga kvarstår då: UTF-8 vs ISO-8859-1... vilket bör man välja? Finns det webbläsare som är ofta förekommande hos t ex svenska företag som inte klarar UTF-8? Egentligen är det väl bara Outlook (med eller utan Express) som används av dessa, i stort sett, men den har inga som helst problem med UTF-8 i dess olika versioner? |
|||
![]() |
![]() |
![]() |
#16 | |||
|
||||
Mycket flitig postare
|
Citat:
Om du vill ha reda på exakt hur det är så läs RFC 1521 (om du har tid och tålamod) där hur man formaterar mime-email (även med flera delar, bilagor etc) beskrivs in i minsta detalj: http://www.faqs.org/rfcs/rfc1521.html (För dig mest "Appendix 2", "5.1. Quoted-Printable Content-Transfer-Encoding", "1. Introduction" och egentligen hela kapitel 3, 4 och inledningen på kap. 5) Det finns också ett antal sidor som tar upp RFC:erna på föreklat och även på svenska, googla.. Rättelse: Jag tror jag i punkt 2 i mitt inlägg ovan ska vara "=\r\n" för ett s k soft-break som tas bort när mejlet kommer fram. Jag tror också att det är så att man måste ange en giltig email som avsändare i From-headern, inte bara ett namn. |
|||
![]() |
![]() |
![]() |
#17 | |||
|
||||
Mycket flitig postare
|
Tack för dina svar Martine!
Dessa har hjälpt mig oerhört och jag har helt kommit underfund med hur mail fungerar nu (tror jag iaf hehe). Dina sista tips fungerade klockrent! Du är en klippa! Iaf vad gäller mailuppbyggnad ![]() |
|||
![]() |
![]() |
![]() |
#18 | |||
|
||||
Mycket flitig postare
|
Citat:
Kul att du fått ordning på det, jag har ju också kämpat med mejl ett bra tag innan jag fick ordning på det... Men har man inte ordning på det får man ständigt klagomål på det ena eller andra. Dessutom finns ju alltid risken för mejlinjektioner om man inte sköter det ordentligt (så länge man mime-encodar är det svårt att göra mail-injektioner eftersom injektionen bara enkodas och skickas med som ett meddelande...). Det är ju bra mycket krångligare än man tror när man just lyckats skicka iväg sitt första mejl med (det egentligen ganska enkla och kassa) mail()... ![]() |
|||
![]() |
![]() |
![]() |
#19 | ||
|
|||
Hej, jag är ny här.
|
Får jag fortsätta på denna tråd.
Jag har ett konstigt problem. Det är panik När Subject består av ett å eller ä eller ö så skickas formuläret iväg mailet. Men står det ä ö eller liknande Strängnäs ( 2 ä i subject alltså) så funkar det inte. Funkar inte heller om man skriver " Fläsk med sås" inte alls med 2 exotiska tecken i subjekt. Det hjälper inte med att ta bort "stripslashes" Det är från ett phpscript som heter "phpreview", och nu får jag inte tag på han som gjort scriptet. Kod:
//THE LINE BELOW MUST NOT CONTAIN ANY CARRIAGE RETURNS IT MUST ALL BE ON ONE LINE mail("$UserEmail", stripslashes("$mailSubject"), stripslashes($UserMessage), "From: $SiteEmail\r\n" . "Reply-To: $UserMail\r\n" . "X-Mailer: PHP/" . phpversion() . "\r\. "MIME-version: 1.0\r\n" . "Content-Type: text/html"); |
||
![]() |
![]() |
Svara |
|
|