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)."?=";