Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
PHP
Email s diakritikou a přílohou v PHP
php
6. ledna 2003, 00.00 | Funkce API mail() je velmi užitečná. Autoři ji ale nevybavili některými potřebnými vlastnostmi, jako např. možností zasílat přílohy. V tomto článku si ukážeme jak na to. Součástí je samozřejmě i funkční skript.
Funkce API mail() je velmi užitečná. Autoři ji ale nevybavili některými potřebnými vlastnostmi, jako např. možností zasílat přílohy. Zde je návod jak na to.Nejprve si musíme o emailu něco málo říct. Email se skládá z hlaviček a vlastního těla emailu. Hlavičky jsou normou RFC definované informace, ktaré určují jak email vlastně vypadá, jak je kódován a další užitečné informace. Informace v hlavičce mají formát:
Nazev hlavicky: hodnota
Na každém řádku je vždy jedna hlavička. Po hlavičkách následuje jeden prázdný řádek a pak vlastní tělo emailu. O tom se toho už tolik říct nedá, protože většinu obstarávají právě hlavičky.
Hlavičky, které budeme používat
From: - odesílatel. Jako odesílatele můžete někdy narazit i na tohle: "Petr Macek" <> Pro uživatele je vhodnější, když vidí jméno člověka, emailový klient používá to co je uvedeno v ostrých závorkách, zbytek ignoruje
MIME-version: 1.0 - určuje, jakou verzi mime mail používá. Zatím existuje jen tato. Mime nám říká typ souboru (např: jpg => image/jpeg, txt => text/plain), podle něj potom emailový program s přílohou pracuje.
X-Mailer: PHP - hlavičky začínající x nejsou pro funkci důležité. Většinou nesou informace o použitém mailovacím programu a další. Nejsou nutné
Subject: text - subject, nadpis zprávy
Return-Path: <> - kvůvi chybám
Reply-To: - z této hlavičky se bere, na kterou adresu se odpoví (většinou se rovná hlavičce from)
Content-Type: multipart/mixed; boundary="$boundary"
Content-Type: text/plain; charset="windows-1250" - určuje mime typ zprávy, přílohy a další informace (znaková sada, boundary)
Content-Transfer-Encoding: quoted-printable - nese informaci o kódování (base64 nebo quoted-printable)
Content-Disposition: attachment; filename="neco.txt" - nese informace o příloze
Znakové sady
V tomto příkladu jsem použil windows 1250. Ti, kdo pracují na linuxu budou patrně používat latin2. V tom případě si nastavte správně hlavičku Content-Type (Content-Type: text/plain; charset="iso-8859-2").
Kódování emailů
V PHP máme dva způsoby kódování:
Base64 - kóduje trojici bajtů do čtyřbajtového kódu. Výsledek je pro člověka naprosto nečitelný. Tímto kódováním budeme kódovat přílohy (je to výhodnější, ale je možné s ním kódovat i běžný text)
Quoted-printable - znaky, které v ascii leží výš než 127 nahradí kombinací =xx, kde xx je hexa hodnota daného znaku. Většina textu je i po zakódování čitelná. Na kódování příloh nepoužívat. Asi by to nedopadlo dobře :-)
Zde se můžete podívat, jak takový zakódovaný text vypadá:
<?
$text = "Smál se, až se za břicho popadal.";
echo "8bit: " . imap_8bit($text); // zobrazí Sm=E1l se, a=9E se za b=F8icho popadal.
echo "base64: " . base64_encode ($text); // zobrazí U23hbCBzZSwgYZ4gc2UgemEgYvhpY2hvIHBvcGFkYWwu
?>
Struktura mailu s přílohou
UVOD
tady je informace, že se jedná o mail s více částmi a je zde definována boundary (hranice, která se používá k oddělení jednotlivých částí emailu)
--BOUNDARY
první část emailu, nejprve jsou samozřejmě hlavičky určující, jak je část emailu kódovaná, jakou používá znakovou sadu a další. Pak následuje prázný řádek a po něm obsah této části
--BOUNDARY
další část emailu, je tvořena stejně jako předchozí. Částí může být více. Vždy jsou oddělené pomocí boundary . . .
--BOUDARY--
PHP
|
K tomuto kódu ještě patří soubor mime.php (podle přípony souboru vrátí MIME typ. U uploadovaných souborů ji může vracet přímo php). Mírně jsem ho osekal, ale měl by postačit pro běžné přílohy:
|
Způsoby volání funkce extra_mail
Funkci je možné volat když máte přílohu uloženou na disku nebo i v případě, že byla právě nauploadována z formuláře.
Pokud skript voláte hned po upoladu doporučuji použít i $new_name, jinak se v mailu bude příloha v emailu bude jmenovat např. c:\winnt\tmp\aoi332kl.
extra_mail ($to,$from,$subj,$body,$attach,$new_name);
Pokud máte přílohu ve stejném adresáři, voláme:
extra_mail ($to,$from,$subj,$body,"soubor.txt",null);
nebo
extra_mail ($to,$from,$subj,$body,"soubor.txt","novysoubor.txt");
(v prvním případě se bude příloha v mailu jmenovat jako soubor na disku.)
Když máte přílohu v jiném adresáři, volejte takhle:
extra_mail ($to,$from,$subj,$body,"../data/soubor.txt","novysoubor.txt");
(platí to samé jako u uploadu, zadejte i nové jméno, jinak se příloha bude jmenovat ../data/soubor.txt.)
Důležitá poznámka
Testoval jsem skript na 7 strojích. Bohužel na 3 PC s os Win 2000, Win NT (každý měl jiný SMTP server) se mi nedařilo odmailovat přílohu větší než 2KB. Chyba je někde v komunikaci se SMTP serverem. Na ostatních strojích (linux) je situace o dost lepší, během chvilky odmailujete cokoli.
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007