Autor Zpráva
MHav
Profil
Ahoj, PHP moc neovládám, ale poskládal jsem z různých návodů si formulář, který v podstatě funguje, jen nedokáži provést, aby byl doručen v správné diakritice. Leží na serveru pod Linuxem. Na toto téma jsem toho našel spustu a hodně věcí vyzkoušel a zkusil aplikoval, ale jakoby mělo vliv jakou má ten kdo vyplňuje formulář nastavenu znakovou sadu. Neznáte někdo nějaké řešení?

Formulář mám zde Odkaz

A vlastní soubor vypadá takto:

<html>
<head>

<meta http-equiv="Content-Type" content="text/html; charset=íso-8859-2" />

<title>Napište nám!</title>

</head>

<body>

<?
function vypisForm($jmeno,$prijmeni,$predmet,$email,$tlf,$text) {
echo "
<form method=post action=\"mail.php\">
Jméno:<br>
<input name=jmeno value=\"".$jmeno."\"><br>

Příjmení:<br>
<input name=prijmeni value=\"".$prijmeni."\"><br>

Předmět:<br>
<input name=predmet value=\"".$predmet."\"><br>

E-mail:<br>
<input name=email value=\"".$email."\"><br>

Telefon:<br>
<input name=tlf value=\"".$tlf."\"><br>

Text zprávy<br>
<textarea style=\"width:200px; height:150px;\" name=text>".$text."</textarea><br><br>
<input type=submit value=Odeslat>
</form>
<br><br>
";
}

$headers = "From: <".$_POST['email'].">\r\n".
"MIME-Version: 1.0\n".
"Content-Type: text/plain; charset=\"iso-8859-2\"\n".
"Content-Transfer-Encoding: base64";

function win1250_to_iso88592($str = '')
{
return StrTr($str,"\x8A\x8D\x8E\x9A\x9D\x9E","\xA9\xAB\xAE\xB9\xBB\xBE");
}

$predmet=win1250_to_iso88592( $predmet);
$predmet=Base64_Encode($predmet).'?=';

$datum = date( "d.M.Y H:i:s");
$useragent = $_SERVER['HTTP_USER_AGENT'];
$ip = $_SERVER['REMOTE_ADDR']; // IP odesilatele
$ja = 'mail@email.cz'; // muj e-mail

$message = "Text zprávy:\r\n\r\n".$_POST['text']."\r\n\r\nPoslal: [".$_POST['jmeno']."] [".$_POST['prijmeni']."] Telefon:[".$_POST['tlf']."]\r\nDne: (".$datum.")\r\nZ IP adresy: (".$ip.")\r\nPoužívá prohlížeč: (".$useragent.") "; // zprava

$message=win1250_to_iso88592($message);
$message=Base64_Encode($message);

if (empty($_REQUEST)) vypisForm("","","");

else
{
//u·ivatel odeslal data, zde následují kontroly
if ($_POST["jmeno"]=="" || ereg("^ +$",$_POST["jmeno"]))
{
echo "Zadejte prosím své jméno.";
vypisForm($_POST["jmeno"],$_POST["prijmeni"],$_POST["predmet"],$_POST[ "email"],$_POST["tlf"],$_POST["text"]);
}

elseif ($_POST["prijmeni"]=="" || ereg("^ +$",$_POST["prijmeni"]))
{
echo "Zadejte prosím Vaše příjmení.";
vypisForm($_POST["jmeno"],$_POST["prijmeni"],$_POST["predmet"],$_POST[ "email"],$_POST["tlf"],$_POST["text"]);
}

elseif ($_POST["predmet"]=="" || ereg("^ +$",$_POST["predmet"]))
{
echo "Zadejte prosím předmět.";
vypisForm($_POST["jmeno"],$_POST["prijmeni"],$_POST["predmet"],$_POST[ "email"],$_POST["tlf"],$_POST["text"]);
}

elseif (empty($_POST['email']))
{
echo "E-mail je povinná polo·ka.";
vypisForm($_POST["jmeno"],$_POST["prijmeni"],$_POST["predmet"],$_POST[ "email"],$_POST["tlf"],$_POST["text"]);
}
elseif (strlen($_POST['email']) > 255) {
echo "E-mail mů·e mít nejvý‘e 255 znaků.";
vypisForm($_POST["jmeno"],$_POST["prijmeni"],$_POST["predmet"],$_POST[ "email"],$_POST["tlf"],$_POST["text"]);
}
elseif (!ereg('^[-a-zA-Z0-9!#$%&\'*+/=?^_`{|}~.]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9- ]+)+$', $_POST['email'])) {
echo "Neplatný formát e-mailu.";
vypisForm($_POST["jmeno"],$_POST["prijmeni"],$_POST["predmet"],$_POST[ "email"],$_POST["tlf"],$_POST["text"]);
}

elseif ($_POST["text"]=="" || ereg("^ +$",$_POST["text"]) || strlen($_POST["text"]) > 500)
{
echo "Text e-mailu by měl být v rozmezí 1-500 znaků.";
vypisForm($_POST["jmeno"],$_POST["prijmeni"],$_POST["predmet"],$_POST[ "email"],$_POST["tlf"],$_POST["text"]);
}

else //nyní následuje samotné odesílání mailu

{
if ($_SERVER["SERVER_ADDR"]!="127.0.0.1") Mail ($ja, $_POST["predmet"], $message, $headers);

echo "E-mail byl úspěšně odeslán.";

}
}
?>
</body> </html>

Děkuji za každou radu.
Měsíček
Profil
No skript je hroznej .., ale pro začátek

Tohle:

<meta http-equiv="Content-Type" content="text/html; charset=íso-8859-2" />

změň na

<meta http-equiv="Content-Type" content="text/html; charset=windows-1250" />

1.) máš í místo "i"
2.) Kódování souboru je windows-1250 a kódování souboru a META tagu se musí shodovat.
Měsíček
Profil
Tohle ""Content-Type: text/plain; charset=\"iso-8859-2\"\n". " dej taky na "windows-1250" a ty nesymslné převáděcí funkce (co se týče kódování) dej pryč.
kletely
Profil
MHav
Pokúšal si hľadať? Rieši sa tu v kuse! Ak si nebudeš môcť rady tak navštív nejkú stránku o phpmailorovi a stiahisi ho.
MHav
Profil
Měsíček
Děkuji za pomoc, změnil jsem vše na windows-1250, v hlavičce jsem nechal
$headers = "From: <".$_POST['email'].">\r\n". // hlavicka #1
"MIME-Version: 1.0\n".
"Content-Type: text/plain; charset=\"windows-1250\"\n".
"Content-Transfer-Encoding: base64\n";

a k textu zprávy jsem dodal
$message=Base64_Encode($message);

vše funguje d ooutlooku chodí vše super česky.
Jen pokud přes webmail nebo náhled mailu přes net kouknu na mail, tak text v předmětu vypadá takto
POKU�N� MA�L�K - původně použity znaky Š Ý Ž Í nejsou, stránka web mailu se zobrazuje v UTF-8, to bude asi ten problém, ale divné že text zprávy je OK.
Nevěděl bys jak ten předmět ošetřit?
Díky.
Chamurappi
Profil
Reaguji na MHav:
"Content-Type: text/plain; charset=\"windows-1250\"\n".
Hodnota parametru charset by neměla být v uvozovkách.
MHav
Profil
Chamurappi
Díky za upozornění, bohužel i po odstranění uvozovek, zůstává text předmětu při náhledu přes web nečitelný.
Je čitelný pouze když změním v prohlížeči kódování z utf-8 na windows-1250, ale to se rozhodí všechny ostatní maily, tedy to nelze.
Měsíček
Profil
No v tom případě dej všechno na UTF-8 .. jak META, tak i kódování charset tak i kódování souboru samotného.
VV
Profil *
Hodnota parametru charset by neměla být v uvozovkách.

Japato - http://www.freesoft.org/CIE/RFC/1521/4.htm
VV
Profil *
No v tom případě dej všechno na UTF-8 ..

To je rada - co outlook potom? je celkem nesnasenlivej. A co potom treba lotus notes nebo thunderbird

Zatim nejlepsi (taky nefuguje vsude, prave zvlast treba webmail od seznamu je ...)

$subject = "=?cp1250?toto je subject emailu?=";
nebo
$subject = "=?cp1250?b?".base64_encode("toto je subject emailu")."?=";
Leo
Profil
"No v tom případě dej všechno na UTF-8 ..

To je rada - co outlook potom?"

Posilam emaily z PHP v utf-8 bezne a Outlook s tim nemel problem, o Thunderbirdu ani nemluve, Leo
Petr23
Profil
Mám obdobný problém s uplodem obrázků. Stránky v UTF-8, Mysql taky v UTF-8.
Pokud použiji iconv('ISO-8859-2', 'UTF-8//TRANSLIT', $file);, zobrazí se název obrázeku správně, ale dále s ním nemůžu pracovat. Exituje nějaké řešení, abych mohl zpracovávat soubor a nemusel měnit základní kodování stránek?

Taky nechápu, že když použiji u souboru if (file_exists($dir_temp_pic.$file)), tak mi to soubor najde, ale už nedokáže zpracovat např. echo "<img src='".$dir_temp_pic.$file."'>";
imploder
Profil
Petr23
Taky nechápu, že když použiji u souboru if (file_exists($dir_temp_pic.$file)), tak mi to soubor najde, ale už nedokáže zpracovat např. echo "<img src='".$dir_temp_pic.$file."'>";
To je asi proto, že do adresáře dočasného uložení má přístup skript v PHP, ale z vnějšku je nepřístupný. Abys na něj mohl na stránce odkázat a prohlížeč ho dokázal stáhnout a zobrazit, musíš soubor zkopírovat do veřejně přístupného adresáře, tj. do adresáře s webem.
AM_
Profil
Teorie o tom, že chyba je v tom, že webmail se zobrazuje v UTF-8 atd., jsou hlouposti. Na předmět se akorát nevztahuje kódování, které jsi definoval pro zprávu, takže jej musíš prohnat speciální kódovací funkcí. Mě se osvědčilo tohle:
function subjectencode($subject){
$preferences = array(
"input-charset" => "WINDOWS-1250",
"output-charset" => "WINDOWS-1250",
"line-length" => 76,
"line-break-chars" => "\n",
"scheme" => "Q"
);
return substr(iconv_mime_encode('', $subject, $preferences), 2);
}


VV

Hodnota parametru charset by neměla být v uvozovkách.

Japato - http://www.freesoft.org/CIE/RFC/1521/4.htm;
"
Díval ses vůbec na to RFC? zcela polopatě, sjeď si tam trochu dolu a najdeš ukázku definice ""Content-type: text/plain; charset=us-ascii". Ukaž mi, kde je tam charset v uvozovkách.
imploder
Profil
AM_
Teorie o tom, že chyba je v tom, že webmail se zobrazuje v UTF-8 atd., jsou hlouposti. Na předmět se akorát nevztahuje kódování, které jsi definoval pro zprávu, takže jej musíš prohnat speciální kódovací funkcí.
Nejde spíš o to, že hlavička kódování musí být v souboru dřív než předmět?
AM_
Profil
imploder
Ne, je to jedno. Pro některé mailové klienty to možná platí, to nemohu popřít, ale obecně pokud chceš, aby se ti předmět zobrazil správně, musíš ho nějakým způsobem kódovat. Způsobů je více podobných, jeden z nich je návratová hodnota iconv_mime_encode určená pro kódování headerů.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0