[PHP] Diakritika a fce mail()

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Shaky 30. 9. 2005 19:26

Mam takovy problemecek:
posilam PHP skriptem mail, pres funkci mail(). Potreboval bych ale vedet, jak docilim toho, aby se mi ve zprave u adresata objevovala pismenka s diakritikou. Š, Č, Ř atd. - toho nemuzu docilit
***SHAKY***
Shaky
Junior
Uživatelský avatar

Odeslat příspěvekod AraxoN 30. 9. 2005 20:14

Odpoveď na tvoju otázku je netriviálna, a nájdeš ju v dokumentoch RFC. Presné čísla dokumentov a odkazy na ne nájdeš v PHP manuáli, pri popise funkcie mail().

Ale v krátkosti: problém tkvie v tom, že protokol SMTP bol navrhnutý na 7-bitový prenos znakov. To stačí na anglickú abecedu, nie na abecedy iných národov. Telo správy dokážeš cez MIME znásilniť k tomu, aby sa prenieslo v ôsmich bitoch, ale adresy "od", "do" a subjekt (plus ďalšie veci, ale tie nie sú pre teba momentálne podstatné) sa prenášajú v hlavičke mailu. Hlavička mailu musí obsahovať len 7 bitové znaky. Kľúčom je escape-ovanie znakov, ktoré sú 8-bitové na sedembitovú sekvenciu. To je možné dvoma spôsobmi: 1) base64, 2) quoted_printable. Spôsob zápisu oboch nájdeš niekde v tých RFC.
Naposledy upravil AraxoN dne 30. 9. 2005 20:17, celkově upraveno 1
Podporujte baktérie - pre veľa ľudí je to jediná kultúra, ktorú majú.
AraxoN
Junior
Uživatelský avatar

Odeslat příspěvekod o@k 30. 9. 2005 20:17

Myslim, ze se to resi pridanim informace o kodovani do zahlavi zpravy, tj. napr.
Kód: Vybrat vše
/*
zde jsou zadany retezcove promenne $recipients (prijemci), $subject (predmet), $message (telo zpravy kodovane zde konkretne v ISO Latin 2) a $headers (vsechny nezbytne hlavicky jako From: ..., Cc: ..., Bcc: ..., X-Sender: ..., X-Mailer: ..., MIME-Version: ..., X-Priority: ... atp.)
*/
// nasledne (ne nutne na konec) prilepime jeste informaci o kodovani
$headers .= "Content-Type: text/plain; charset=ISO-8859-2\r\n";
// a pro jistotu jeste
$headers .= "Content-Transfer-Encoding: 8bit\r\n";

// ...

mail($recipients, $subject, $message, $headers);
V zasade staci napodobit hlavicky z nejakeho vam dosleho mailu s diakritikou ;)
Naposledy upravil o@k dne 30. 9. 2005 20:22, celkově upraveno 1
o@k
Junior
Uživatelský avatar

Odeslat příspěvekod Shaky 30. 9. 2005 20:22

Diky vam obema - uz jsem to rozchodil - chtelo to opravdu jenom udat charset :wink:
njn, trivialni problemy byvaji vzdy nejhorsi :lol:
***SHAKY***
Shaky
Junior
Uživatelský avatar

Odeslat příspěvekod Putana 1. 10. 2005 09:36

Čus .. zkoušel jsem to , ale píše mi to tuto chybu :

Kód: Vybrat vše
Warning: mail(): SAFE MODE Restriction in effect. The fifth parameter is disabled in SAFE MODE. in /3w/borec.cz/a/aoc/member_area/registrace.php on line 170


řádek 170 vypadá takto :
Kód: Vybrat vše
mail($email_address, $subject, $message $headers, "From: Webmaster<admin@domena.cz>\nX-Mailer: PHP/" . phpversion());

jsem začátečník , nesmějte se , jestli je tam nějaká fatální chyba , kterou byste neudělali :D
Dík za odpověď
Putana
Junior

Odeslat příspěvekod martynez 1. 10. 2005 09:59

Shaky píše:Diky vam obema - uz jsem to rozchodil - chtelo to opravdu jenom udat charset :wink:
njn, trivialni problemy byvaji vzdy nejhorsi :lol:


Každopádně necpi diakritiku do hlaviček e-mailu (tj. subject, from, to) nebo si najdi funkce, které umí správně vytvořit a foldovat encoded words. RFC 2043, které to popisuje, nezvládl správně naimplementovat snad žádný český freemail (konkrétně vím o seznamu, centru a postu).
martynez
Junior

Odeslat příspěvekod martynez 1. 10. 2005 10:02

Putana píše:
Kód: Vybrat vše
Warning: mail(): SAFE MODE Restriction in effect. The fifth parameter is disabled in SAFE MODE. in /3w/borec.cz/a/aoc/member_area/registrace.php on line 170

jsem začátečník , nesmějte se , jestli je tam nějaká fatální chyba , kterou byste neudělali :D
Dík za odpověď /quote]


Je tam fatální chyba, že to pouštíš u někoho, kdo má zaplý safe mode.
martynez
Junior

Odeslat příspěvekod Putana 1. 10. 2005 10:19

a jak to mám řešit ???
Putana
Junior

Odeslat příspěvekod Shaky 1. 10. 2005 11:34

Putana píše:a jak to mám řešit ????/quote]

no ja bych rekl, ze tam mas jinou chybu - mezi promennou message a headers nevidim carku, takze tam posilas JAKOBY dve zpravy - to si myslim, ze bude ten problem
Davas tam vlastne pet parametru a to uz je syntakticka chyba
***SHAKY***
Shaky
Junior
Uživatelský avatar

Odeslat příspěvekod Putana 1. 10. 2005 13:22

v tom problém není , to jsem asi zapomněl dopsat tady na forum...
Putana
Junior

Odeslat příspěvekod Shaky 1. 10. 2005 13:35

Putana píše:v tom problém není , to jsem asi zapomněl dopsat tady na forum..../quote]

no jo, ale v tom pripade tam posilas 5 parametru a to je chyba - maximalne 4
Kód: Vybrat vše
mail($email_address, $subject, $message, $headers);
a v headers mit ulozene to From atd.
***SHAKY***
Shaky
Junior
Uživatelský avatar

Odeslat příspěvekod martynez 1. 10. 2005 13:38

Shaky píše:no ja bych rekl, ze tam mas jinou chybu - mezi promennou message a headers nevidim carku, takze tam posilas JAKOBY dve zpravy - to si myslim, ze bude ten problem
Davas tam vlastne pet parametru a to uz je syntakticka chyba


Syntaktická chyba by bylo vynechání té čárky, na to si ale PHP nestěžuje, a tak to kolega asi jen špatně opsal.

Nedalo mi to a zjistil jsem, jak je to s tím pátým parametrem. Zajímavé je, že podle dokumentace na webu (která je k verzi 5), pátý parametr není. Podíval jsem se do zdrojáků PHP4 a funckce mail() skutečně volitelný pátý parametr má a jsou jím přídavné parametry sendmailu - není se tedy čemu divit, že je to v safe módu zakázáno.

Tazatel samozřejmě přídavné parametry k sendmailu nepotřebuje, takže fatální závada není safe mód, ale špatné předávání parametrů :-).
martynez
Junior


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků