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
och att alla 8-bitarstecken samt kontrolltecken (retur, tab) och vissa andra tecken (komma, likamedtecken, mellanslag och liknande) ersätts med ett likamedtecken plus bytens värde i hex. Denna form av encoding kallas
printed-quotable eftersom man kan printa den och åtminstone läsa alla amerikanska tecken. T ex
å blir
=a5.
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";
och
Kod:
$from = "From: ".mb_encode_mimeheader("Åsa", "utf-8", "Q")."<".$email.">\r\n";
Om du har en slappt webhotell som inte har mb(multibyte)-support så får du använda typ:
Kod:
preg_replace('/[^\x21-\x3C\x3E-\x7E\x09\x20]/e','sprintf( "=%02x", ord("$0"));',$mimetext);
För mime-meddelandet gäller:
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;
Det är förstås viktigt att ange korrekt charset, i det här fallet utf-8.
Content-Type och
Content-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);
}
som jag kör på meddelandet.
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
Så att det står att mejlet kommer från kampanjadv. på företaget men om man klickar på svara/reply så skickas mejlet till kundtjänst. (Det finns ju förstås bättre användningsområden för detta, t ex om man vill skicka mejl som alltid kommer från
support@företag.se men man vill att svarsmejl alltid kommer tillbaks till personen som sist behandlade ärendet med reply-to:
bengtVidSupporten@företag.se och inte
alfonsVidSupporten@företag.se. Man ser ju då alltid i mejlprogrammets from att mejlet kom från den välkända supporten och inte från någon okänd bengt... )