Čeština v předmětu e-mailu (PHP)

Programátoři, kteří nevyužívají osvědčená řešení k posílání e-mailů (třeba phpmailer), občas narazí na problém s diakritikou (háčky, čárky) v předmětu e-mailu. Mají za to, že nastavení kódování v SMTP hlavičkách dostačuje. Předmět e-mailové zprávy se přenáší hlavičkami, jejichž kódování je omezeno na US-ASCII (tedy sedmibitové kódování, které neobsahuje žádné znaky s diakritikou). Pokud chceme v předmětu přenést diakritiku, využijeme rozšíření MIME, které definuje, jakým způsobem je možno v hlavičkách používat obsáhlejší znakové sady.

MIME určuje dva možné způsoby zápisu diakritiky do hlaviček. První je takzvaný „quoted-printable“, druhým pak „base64“. Obecný formát pro zápis je:

=?znaková sada?X?kódovaný text?=

kde „znaková sada“ určuje znakovou sadu původního textu (utf-8, windows-1250 atd.), X označuje, která ze dvou uvedených metod kódování byla použita (Q = quoted-printable, B = base64), a poslední částí je samotný text, zakódovaný uvedenou metodou.

Quoted-printable

Toto kódování přiřazuje každému bajtu vstupního textu tři bajty výstupu. Prvním znakem je rovnítko (=), následuje hexadecimální reprezentace ASCII kódu ukládaného znaku. Písmeno A se tedy zakóduje jako =41, písmeno Z jako =5A, písmeno á jako =E1. Aby nebyl kódovaný text zbytečně nafouknutý, stačí takto kódovat pouze znaky mimo rozsah tisknutelných znaků US-ASCII (tedy znaky s ordinálními hodnotami od 33 do 126), pochopitelně s výjimkou rovnítka, které se kódovat musí.

Vícebajtové znaky vícebajtových kódování (např. UTF-8) se zapisují po jednotlivých bajtech – český znak s diakritikou v UTF-8 tedy vyprodukuje =XY=XZ (tedy 6 znaků).

V PHP se dá quoted-printable vyrobit pomocí funkce imap_8bit(), celý předmět pak například pomocí
$predmet = "=?utf-8?Q?".imap_8bit($predmet)."?=";

kde $predmet je řetězec v UTF-8.

Base64

Toto kódování převádí posloupnost tří osmibitových znaků na čtyři znaky s šestibitovým kódováním. Výsledný text tedy není jednoduše čitelný (na rozdíl od quoted-printable, které se většinou dá dekódovat pouhým pohledem). V PHP nám k tomuto účelu poslouží funkce base64_encode(). Celý kód pro řetězec v UTF-8:

$predmet = "=?utf-8?B?".base64_encode($predmet)."?=";

Tanto příspěvek byl zařazen do kategorie PHP a označen štítkem , . Do oblíbených si můžete uložit trvalý odkaz.

3 komentáře k Čeština v předmětu e-mailu (PHP)

  1. Sandokan napsal(a):

    Děkuji mockrát, tento článek se mi opravdu hodil a pomohl mi. Aneb není nic lepšího než vysvětlit řešení těm, co ho hledají a zároveň poskytnou jednoduchý kód těm, co nic víc nehledají

  2. Ondrej napsal(a):

    OK, funguje to, tak isto, aj mne to pomohlo pri probléme s predmetom správy.
    Ďakujem

  3. Tomáš napsal(a):

    Díky, tento článek mi pomohl. I když se to řeší od roku 2000, nenašel jsem nikde takto přehlednou interpretaci …

    Ještě jednou díky …

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *