Visa ett inlägg
Oläst 2006-10-16, 14:16 #13
martines avatar
martine martine är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Mar 2005
Inlägg: 767
martine martine är inte uppkopplad
Mycket flitig postare
martines avatar
 
Reg.datum: Mar 2005
Inlägg: 767
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]>
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 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);
}
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
Kod:
From: kampanjer@företag.se
Reply-to: kundtjänst@företag.se
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... )
martine är inte uppkopplad   Svara med citatSvara med citat