PHP aneb Jak odeslat e-mail (2)

Autor: Ji?í Luká? <jirilukas(at)supersvet.cz>, Téma: PHP, Vydáno dne: 13. 02. 2001

Vítám v?echny PHP p?íznivce u dne?ního druhé dílu mého malého t?ídílného seriálu "PHP aneb Jak odeslat e-mail", ve kterém se sna?ím nastínit v?echny reálné mo?nosti pou?ití PHP funkce Mail();.

Jak zprovoznit ?e?tinu?

Historie problému: V?e za?alo ji? na prvopo?átku novodobých d?ji po?íta??, kdy byla pam?ť velmi drahým a nedostatkovým zbo?ím a pro úsporu místa se pou?ívalo pouze 7bitové kódování, které bylo schopno svou kapacitou obsáhnou pouze znaky anglické abecedy a na ostatní znaky specifické pro jiné národní abecedy ji? nezbylo v takto koncipované kódové tabulce ?ádné místo. Pozd?ji s nástupem výkonn?j?ích po?íta?? a levn?j?ích pam?tí se za?alo pou?ívat 8bitové kódování, které celou kódovou tabulku zv?t?ilo na tolik, ?e bylo mo?né do takové tabulky umíst?ní i znaky s ?eskou diakritikou. Bohu?el v?ak najednou vzniklo n?kolik navzájem nekompatibilních zp?sob?, jak rozmístit ?eské znaky do kódové tabulky a tak se celý problém s ?e?tinou jako by op?t ocitl znovu na startovní ?á?e. - V DOSu si oblibu získalo kódování bratr? Kamenických, které vyu?ívalo podobnost n?kterých semigrafických znak? s ?eskými znaky. ?eský text tak ?lo ?íst i na star?ích grafických adaptérech a tiskárnách, které neum?ly p?edefinovat znakovou sadu. Microsoft v?ak ve svých nov?j?ích verzích MS DOSu p?i?el s vlastním kódováním CP 852. S nástupem Windows Microsoft p?edstavil pro ?e?tinu dal?í vlastní kódování CP 1250. To bylo (podle n?kterých pam?tník? zám?rn?) drobn? pozm?n?no, aby se li?ilo od v té dob? ji? existujícího standardního kódování ISO 8859-2 (ISO Latin 2). ISO 8859-2 je kódování p?ijaté jako standard mezinárodní standardiza?ní organizací ISO a tak má asi nejv?t?í ?anci na p?e?ití, i kdy? Microsoft je silný soupe? a pokud nebude chtít, tak s ním nehne ani ISO. Pro úplnost dodávám, ?e vlastní kódování ?e?tiny mají i po?íta?e Macintosh.

Popis problému: Pokud chcete odeslat ?eský e-mail, tak stojíte p?ed dv?ma problémy: 1) T?lo (?i-li samotná zpráva) by m?lo být slo?eno pouze ze znak? obsa?ených v "7bitovém kódování" (tedy ze znak? umíst?ných v kódové tabulce na pozici 0 a? 127). - Tato skute?nost v podstat? vylu?uje pou?ití ?eských znak?, jeliko? ty jsou práv? umíst?ny a? za pozicí 127. 2) Druhým problémem je správná volba ?eského kódování, do kterého p?evedeme "7bitové kódování", jeliko? by se vám také mohlo stát, ?e p?íjemce va?eho ji? po?e?t?ného dopisu by zvolené kódování také nemusel znát. - V sou?asné dob? jsou nejpou?ívan?j?ími zp?soby ?eského kódování: windows-1250 (- pou?ívá se ve Windows) a iso-8859-2 (standardní kódování, pou?íváno zejména na unixu).

?e?ení problému: Celá v?c se dá velmi jednodu?e vy?e?it p?ekódováním ?eského textu do tzv. MIME roz?í?ení, které umo??uje prost?ednictvím elektronického dopisu p?enést r?zné typy dat: text, binární data, obrázky, atd. - Pokud tedy pot?ebujete v t?le dopisu p?enést 8bitová data (- nap?.: ?eský text), musíte ho nejprve p?ekódovat jednou ze dvou metod base64 nebo quoted-printable a pak jej odeslat jako MIME. První z vý?e uvedených metod p?evádí trojici 8bitových znak? na ?tve?ici 7bitových. Quoted-printable p?evádí znaky s kódem v?t?ím ne? 127 na sekvenci =XX, kde XX je kód znaku zapsaný v ?estnáctkové soustav?.

Av?ak dost teorie, na ?adu p?ichází praxe:

windows-1250

Ukázkový kód:

<? ... dal?í kód ...
$zprava="Zde se nalézá text s ?eskou diakritikou!";
$zprava=Base64_Encode($zprava);
$hlavicka .= "From: admin@jmeno_serveru\n".
    "MIME-Version: 1.0\n".
    "Content-Type: text/plain; charset=\"windows-1250\"\n".
    "Content-Transfer-Encoding: base64";
... dal?í kód ...
Mail($prijemce,$predmet,$zprava,$hlavicka);
... dal?í kód ... ?>

Poznámka: ?ervená barva ozna?uje ve zdrojovém kódu taková místa, bez kterých by se celá v?c rozhodn? nedala provést. Také bych vám rád p?ipomn?l, ?e se jedná pouze o co mo?ná nejvíce zjednodu?ený kód a tudí? jsem zde nap?. nepou?il kontrolu odeslání e-mailu (viz. minulý díl), atd. Dále bych vás rád upozornil na skute?nost, ?e pro zdar celé této "kódovací hry" je nezbytné, aby do?la p?íjemci va?eho dopisu celá a hlavn? nijak nepo?kozená hlavi?ka, jinak se vá? dopis stane rázem ne?itelný.

iso-8859-2

Ukázkový kód:

<? ... dal?í kód ...
$zprava="Zde se nalézá text s ?eskou diakritikou!";
$zprava=StrTr($zprava,
    "\x8A\x8D\x8E\x9A\x9D\x9E",
    "\xA9\xAB\xAE\xB9\xBB\xBE");

$zprava=Base64_Encode($zprava);
... dal?í kód ... ?>

Pro tento zp?sob kódování ?e?tiny platí úpln? stejné podmínky, jaké jsem vám sd?lil u p?ede?lého kódování s tím, ?e je je?t? nutné p?ed zakódováním celého textu pou?ít funkci StrTr(); s nále?itými parametry a upravit hodnotu polo?ky Content-Type: text/plain; na iso-8859-2, aby po?tovní klient obdr?el správné informace o zp?sobu kódování doru?eného dopisu.

"Content-Type: text/plain; charset=\"iso-8859-2\"\n".

Jeliko? jsem se zase neuv??iteln? rozepsal a rozhodn? nechci, aby jste jeden ?lánek museli ?íst "n?kolik dní", tak si p?eci jenom minule slíbené téma "hromadné rozesílání jednoho e-mailu na více adres" rad?ji schovám do t?etí dílu. P?eji p?íjemné mailování ...




Copyright supersvet.cz, 1998-2005