Č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.

Napsat komentář

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

*

Můžete používat následující HTML značky a atributy: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>