Odesílání mailů s diakritikou

Jiří Kosek ml.

Ze svých skriptů bych rád odesílal maily i s českými znaky s diakritikou. Když však funkci pro odesílání mailů předám český text, jsou české znaky při čtení mailu v poštovním programu zkomolené.

Ač by si člověk rád myslel, že na konci 20. století nebude pro počítač problém nakládat s českými znaky, opak je pravdou. Příčinou všech problémů je však člověk sám. Původně počítače podporovaly pouze znaky anglické abecedy. Pro úsporu místa se používalo pouze 7bitové kódování, a na více znaků proto ani nezbýval prostor. Později s nástupem výkonějších počítačů a levnějších pamětí se začalo používat kódování 8bitové. Ve druhé půlce kódové tabulky pak byl prostor pro umístění českých znaků s diakritikou. Bohužel vzniklo několik navzájem nekompatibilních způsobů, jak rozmístit české znaky do kódové tabulky. 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 představil pro češtinu Microsoft 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. Svého času se ještě používalo kódování KOI8-CS, které má kořeny v RVHP. Vlastní kódování češtiny mají i počítače Macintosh. Situace zkrátka není jednoduchá.

Při odesílání českých mailů stojíme přede dvěma problémy. Prvním problémem je, že tělo mailu by mělo obsahovat pouze znaky s kódem 0 až 127 (tj. 7bitové kódování). České znaky jsou ve všech kódováních reprezentovány znaky s kódem větším než 127. Druhý problém je použití vhodného kódování. Dvě nejpoužívanější kódování jsou windows-1250 (to se používá ve Windows) a iso-8859-2 (standardní kódování, používáno zejména na unixu).

Oba problémy můžeme vyřešit použitím tzv. MIME. MIME je široce podporované rozšíření formátu elektronických dopisů, které umožňuje přenášení různých druhů dat (text, obrázky, zvuk, binární data). Pokud potřebujeme v těle dopisu přenášet 8bitová data (tedy i český text s diakritikou), musíme ho překódovat jednou ze dvou metod base64 nebo quoted-printable. První z nich 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ě.

Pokud tělo dopisu zakódujeme jednou z těchto metod, musíme přidat k dopisu hlavičku:

Content-Transfer-Encoding: base64
nebo
Content-Transfer-Encoding: quoted-printable

Protože používáme rozšíření MIME, musí se mezi hlavičkami objevit i definice použité verze MIME:

MIME-Version: 1.0

Jako kódování češtiny bychom měli používat pouze iso-8859-2. Text dopisu tedy musíme do tohoto kódování převést. Většina tvůrců webových stránek však pracuje ve Windows, a proto i stránky a skripty píše v kódování Windows. Obě kódování se liší jen nepatrně. V PHP pro převod textu mezi kódováními můžeme s výhodou použít funkci StrTR(). Pokud máme text dopisu převeden do správného kódování, musíme ještě přidat hlavičku, která určuje použité kódování pro tělo dopisu.

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

Nyní již známe vše potřebné, pro vytvoření správného mailu i s českým textem. Poznamenejme ještě, že v PHP máme k dispozici funkce Base64_Encode() a IMAP_8Bit(), které překódují text metodou base64 nebo quoted-printable. Nyní nestojí nic v cestě definování funkce CZMail(), která se bude chovat stejně jako Mail(), ale umožní odesílání mailů s českými texty.

<?

function CZMail($to, $subj, $text, $headers = "")
{
  // převedení z windows-1250 do iso-8859-2 (pokud je potřeba)	
  $text = StrTr($text, 
  				"\x8A\x8D\x8E\x9A\x9D\x9E", 
  				"\xA9\xAB\xAE\xB9\xBB\xBE");
  // překódování do Base64  
  $text = Base64_Encode($text);
  // přidání hlaviček
  $headers .= "MIME-Version: 1.0\n".
              "Content-Type: text/plain; charset=\"iso-8859-2\"\n".
              "Content-Transfer-Encoding: base64\n";
  // odeslání e-mailu              
  Mail($to, $subj, $text, $headers);
}

?>

Nyní můžeme bez problémů odesílat i maily s diakritikou:

CZMail("nekdo@nekde.cz", "Dopis", "Už můžu psát dopisy česky!!!");

Pokud vás problematika češtiny a počítačů zaujala, podívejte se na adresu www.cestina.cz.

© Jiří Kosek 1999