Autor Zpráva
Dano_V
Profil *
Zdravím vás.
Napísal som odosielatelský php skript podľa tejto stránky. Kódovanie všetko ide, ako má. Nezáleží na tom, ako je kódovaná stránka na ktorom je formulár, správa vždy príde dobre zakódovaná. Iba je taký problém, že na serveri mám nastavenú automatickú odpoveď, ale keď tam príde správa z tohoto skriptu, tak nedostanem žiadnu odpoveď. Pred tým som tam používal jednoduchší skript, ktorí mi niektoré písmená znázorňoval zle, ale na ktorý som dostával odpovede.

Zdá sa mi, že by to tam potrebovalo Return-Path, čo som mal aj v starom skripte, ale to tam neviem do tohto skriptu napísať. Inak tie rady tam na tej stránke sú vynikajúce, ale žiaľ, o tom sa nehovorí, ako by tento riadok mal vyzerať. Preložiť zo starého mi nepomôže, lebo to tento skript odmieta. Skúšal som rôzne formy, ale neide to. Neviem, či by som sem mal z toho skriptu niečo vypísať, lebo vlastne všetko sa nachádza tam, kde ukazuje odkaz. Ide o to, aby mi (alebo tomu, kto si tam napíše svoju adresu) server mohol poslať automatickú odpoveď.

Mohol by mi s tým niekto pomôcť?
Davex
Profil
Zkus tuto radu: Nefunguje Return-Pah v mail().
Dano_V
Profil *
Pozrel som tú radu, ale som zistil, že ten skript je podobný, ale nie totožný. Preto aj reaguje inak. Čo v jednom funguje, nefunguje v druhom. Skúšal som tam dať aj Reply-To, to ide, aj sa objaví v hlavičke odoslanej správy. Ale mi to nepomôže, lebo v Return-Path-e je stále adresa APACHE. Aj keď som tam dal Riadok na Return-Path.
<?php

function autoUTF($s)
{
    if (preg_match('#[\x80-\x{1FF}\x{2000}-\x{3FFF}]#u', $s)) // detect UTF-8
    {
        return $s;
    }
    elseif (preg_match('#[\x7F-\x9F\xBC]#', $s)) // detect WINDOWS-1250
    {
        return iconv('WINDOWS-1250', 'UTF-8', $s);
    }
    else // assume ISO-8859-2
    {
        return iconv('ISO-8859-2', 'UTF-8', $s);
    }
}
 
function cs_mail($to, $predmet, $zprava, $head = "")
{
    $predmet = "=?utf-8?B?".base64_encode(autoUTF($predmet))."?=";
    $head .= "Return-Path: <niečo@inmail.sk>".PHP_EOL;
    $head .= "Reply-To: niečo@inmail.sk".PHP_EOL;
    $head .= "From: =?UTF-8?B?".base64_encode(autoUTF("Šišľavá"))."?=<niečo@inmail.sk>".PHP_EOL;
    $head .= "MIME-Version: 1.0".PHP_EOL;
    $head .= "Content-Type: text/plain; charset=\"utf-8\"".PHP_EOL;
    $head .= "Content-Transfer-Encoding: base64".PHP_EOL;
    $zprava = wordwrap(base64_encode(autoUTF($zprava)), 78, PHP_EOL, true);
    return mail($to, $predmet, $zprava, $head);
}
$meno = "Šišľavá";
$email = "niečo@inmail.sk";
$mail = 'niečo@gmail.com';
$predmet = 'ěščřžýáíé46';
$zprava = "Test, \r\n ěščřžýáíé123456789";
 
if (cs_mail($mail, $predmet, $zprava, $head,"-f".$email))
{
    echo 'E-mail byl úspěšně odeslán.<br>';
}
else
{
    echo 'E-mail se bohužel nepodařilo odeslat.<br>';
}

?>
Davex
Profil
Dano_V:
Přidal jsi pátý parametr funkci cs_mail(), který se v ní zahodí.

Mělo by to začít fungovat, jakmile se přidá pátý parametr do definice funkce cs_mail a ten se pak předá i funkci mail.

function cs_mail($to, $predmet, $zprava, $head = "", $opt = "")
{
// ...
     return mail($to, $predmet, $zprava, $head, $opt);
}
Dano_V
Profil *
Skúsil som aj to, ale to nefunguje. Výsledok je stále stejný. Dochádzam k záveru, že kódovanie, a automatická odpoveď sú na vojnovej nohe. Buď funguje jedno, alebo druhé, ale to spolu neide. Môžem to tvrdiť preto, lebo som to skúsil dosiahnúť aj s PHP Mailerom, a tiež to nefunguje. Dobré kódovanie, ale žiadna odpoveď. A to nerobili amatéri! Keď to nefunguje ani profesionálom, čo potom môžem chcieť ja?

Som z toho nešťastný, ale už vidím, že sa budem musieť rozhodnúť, čo je dôležitejšie. Či správne kódovanie, alebo informácia pre tých, čo sa ozvú na formulár!
Davex
Profil
Jak vypadá kód skriptu, kde automatická odpověď funguje?

K čemu je vlastně odpověď potřeba? Nemůže jí také poslat odesílací skript?
Dano_V
Profil *
To je pravda, odpoveď by aj mohol poslať odosielací skript, ale to by nebola informácia o tom, že tá správa aj dorazila do schránky, ale iba o tom, že bola odoslaná. A tú informáciu skript podáva ihneď, ako to tu vidno zo skriptu. A keď sa dopis zatúla, nikto by sa o tom nedozvedel, mohli by z toho vzniknúť straty, alebo hnev, prečo neodpovedám! Plus je to informácia aj o tom, keby niekto napísal do formulára chybnú spätnú adresu (čo sa bežne stáva), a skript by automatickú odpoveď nemohol doručiť, dostanem hneď informáciu o tomto fakte.

Kód je nasledovný:

<?php
$predmet = $_POST['predmet'];
$komu = "niečo@mojadoména.sk";
$meno = $_POST['meno'];
$ulica = $_POST['ulica'];
$cislo = $_POST['cislo'];
$mesto = $_POST['mesto'];
$email = $_POST['email'];
$telefon = $_POST['fon'];
$text = $_POST['text'];


if ($meno && $mesto && $ulica && $cislo){


$sprava = "<b>Meno</b> = $meno<br><b>Ulica</b> = $ulica<br><b>Smerové číslo</b> = $cislo<br><b>Mesto </b> = $mesto<br><b>Telefón </b>=     $telefon<br> $text";

$hlava = 'Return-Path: <'.$email.">\n";
$hlava .= 'mime-version: 1.0'."\n";
$hlava .=  'Content-type: text/html; charset = windows-1250' ."\n";
$hlava .= 'From:'.$meno. '<' .$email. ">\n";

$posli = mail($komu, $predmet, $sprava, $hlava,"-f $email");

echo "Váš <b>list bol</b> úspešne <b>odoslaný</b>!  Po dorazení Váho listu do našej schránky dostanete automatickú odpoveď. Keby ste ju nedostali ani do nasledujúceho dňa, to znamená, že váš list sme nedostali. V tom prípade Vás prosíme, aby ste nám to poslali opakovane! Teraz sa môžete  vrátiť k <a href='javascript:history.go(-1)'> formuláru</a>.";

}
elseif (($meno && $mesto && $ulica && $cislo) == false){

echo "Váš <b>list nebol</b> odoslaný. Nezadali ste všetky<b> povinné </b>údaje.    Môžete sa vrátiť k <a href='javascript:history.go(-1)'> formuláru</a>.";
}
?>
Davex
Profil
Už to asi vidím. Na 24. řádku nového skriptu (v [#3] upraveného podle [#4]) přidej mezeru mezi zakódované jméno a adresu.

$head .= "From: =?UTF-8?B?".base64_encode(autoUTF("Šišľavá"))."?= <niečo@inmail.sk>".PHP_EOL;

Případně by se dalo zkusit přidání mezery do pátého parametru při volání funkce

if (cs_mail($mail, $predmet, $zprava, $head, "-f $email"))

Kód měň postupně, a pak napiš, zda a která úprava pomohla.

Jinak ten kód beru jako zkušební a doufám, že ti je jasné, že čtení adresy odesílatele z formuláře a zápis do hlaviček Return-Path, Reply-To a From musí být mimo funkci cs_mail() před jejím zavoláním.
Dano_V
Profil *
Je mi to jasné. že je to skúšobný skript, ale pokiaľ neide hlavná funkcia, nemá význam sa s tým ďalej zabávať. Inak tie navrhované úpravy som už preskúmal aj pred tým, ale som to urobil ešte raz. Pri medzere pred <niečo@inmail.sk> sa nedialo nič, správa dorazila správne kódovaná, bez odpovede. Pri medzere na druhom mieste, teda piatého parametra som dostal odpoveď, že " Web nemůže zobrazit tuto stránku." A samozrejme ani neodoslal žiadnu správu. Potom som medzeru nechal, a napísal som pred $email bodku v piatom parametri. Odosielanie znuvu fungovalo, ale stále bez odpovedi. V hlavičke odosielaného dopisu stále je adresa APACHE.

Potom som skúsil postupne posúvať rovnítka v riadku
function cs_mail($to, $predmet, $zprava, $head="", $opt=""), aj úvodzovky. Žiadna zmena, skript funguje bez odpovede.
Dano_V
Profil *
Davex:
Kód měň postupně, a pak napiš, zda a která úprava pomohla.

Prešlo pár hodín a môžem povedať "hurá, funguje mi to." Nabádal si ma, aby som posúval niektoré časti kódu. Keď mi to nepomáhalo začal som väčšiu rekonštrukciu. Ne idem opisovať, čo všetko som vymenil, čo som nechal, keď to nefungovalo, dôležité je, že zo skriptu som vyhodil riadky o Retutn-Path a Reply-To, a začal som uvažovať, z akého dôvodu je kódovane mime-version. Vyhodil som odtiaľ kódovanie a napísal som toto:
 $head .= 'mime-version: 1.0'. "\n"; 
A tu zrazu sa objavila odpoveď. S jediným nedostatkom: Predmet v odpovedi je nečítateľný! Správa ano, ale predmet nie. Neviem, či to nerobí možno rozdielné kódovanie medzi mojim listom a kódovaním servera, ale môžem s istotou tvrdiť, že ten kód na tejto stránke , odkiaľ som získal tento skript, je chybný.

Skúšal som napísať aj toto: $head .= 'mime-version: 1.0'."\r\n";
aj toto: $head .= 'mime-version: 1.0'. "\r\n";
aj toto: $head .= 'mime-version: 1.0'. '\r\n';
aj toto: $head .= 'mime-version: 1.0'.'\r\n';
aj toto: $head .= 'mime-version: 1.0'. '\n';

ale s ani jedným nefunguje dobre. Odpoveď posiela aj v nasledujúcom prípade, ale odpoveď chodí neskoro. Možno sa niekde túla.
 $head .= "mime-version: 1.0". "\n"; 

Neviem prečo, ale z toho vidno, že tento skript je veľmi háklivý, záleží na každej medzierke, čiaročke.

Ostáva mi už len zistiť, prečo neide správne kódovanie v predmete odpovede.
Davex
Profil
Kód v PHP FAQ by měl být funkční. U tebe bude asi vzácná kombinace operačního systému, PHP a mailserveru.

Pošli mi prosím funkční a nefukční vzorek e-mailu na adresy
• djpw@postino.netstrojezmate.example.com
• djpw@wo.czstrojezmate.example.com

Tyto řádky jsou nesmyslné, protože escape sekvence v jednoduchých uvozovkách se nenahrazují příslušnými znaky.

$head .= 'mime-version: 1.0'. '\r\n';
$head .= 'mime-version: 1.0'.'\r\n';
$head .= 'mime-version: 1.0'. '\n'; 
Davex
Profil
Vyřešeno. Při pokusu ukázat mi nefunkčnost začala automatická odpověď chodit. Možná webhosting něco vyladil na automatickém odpovídači.
Dano_V
Profil *
Chcel by som dodať, že po siedmych mesiacoch používania skript funguje dobre, iba by som chcel sem dopísať moje pozorovania. Odpovede fungujú dobre, iba v kódovaní som zistil nejaký nedostatok. Kódovanie písmena " ľ " je kódované dobre iba na začiatku slova, teda ako " Ľ ". Keď sa napíše slovo Oľga, alebo Veľké, tak príde to napísané ako Ožga a Vežké. Keď sa v tom istom riadku pred tými slovami nachádza nejaké slovo kde je písmeno s mäkčeňom, napríklad " š ", vtedy to napíše dobre, ale inak nie.

To je všetko. Neviem, čo to zapríčinuje, a či sa s tým môže niečo urobiť.
Davex
Profil
Problém je v tom, že podle samotného znaku znaku ľ nelze rozpoznat (ve funkci autoUTF()) v jakém je text kódování, protože znak ľ je v kódování windows-1250 na stejné pozici jako znak ž v kódování iso-8859-2.

Dá se to vyřešit třeba tak, že se nebude automaticky rozlišovat kódování (a bude tam napevno převod z windows-1250 do utf-8) nebo bude stránka s formulářem v kódování utf-8.
Dano_V
Profil *
To znamená, že keď vymažem z kódu na #3 vo funkcii autoUTF() časť od else a ten riadok pod tým, a pred tým z elseif vymažem to if, tak vylúčim možnosť kódovania v iso-8859-2, potom by to už malo fungovať dobre? Tak to skúsim.
Dano_V
Profil *
Skúsil som to, ale to tak nefunguje. Ale to nie je až taká veľká chyba, preto to nechám tak.
Dano_V
Profil *
Nedalo mi to pokoja, preto, aby som urobil podľa rady z [#14] Davex som zmenil kód z [#3] od

function autoUTF($s)
{
    if (preg_match('#[\x80-\x{1FF}\x{2000}-\x{3FFF}]#u', $s)) // detect UTF-8
    {
        return $s;
    }
    elseif (preg_match('#[\x7F-\x9F\xBC]#', $s)) // detect WINDOWS-1250
    {
        return iconv('WINDOWS-1250', 'UTF-8', $s);
    }
    else // assume ISO-8859-2
    {
        return iconv('ISO-8859-2', 'UTF-8', $s);
    }
}

nasledovne:


// WINDOWS-1250 do UTF-8 
function autoUTF($s)
{ 
    static $tbl = array("\x80"=>"\xe2\x82\xac","\x81"=>"","\x82"=>"\xe2\x80\x9a","\x83"=>"","\x84"=>"\xe2\x80\x9e","\x85"=>"\xe2\x80\xa6","\x86"=>"\xe2\x80\xa0","\x87"=>"\xe2\x80\xa1","\x88"=>"","\x89"=>"\xe2\x80\xb0","\x8a"=>"\xc5\xa0","\x8b"=>"\xe2\x80\xb9","\x8c"=>"\xc5\x9a","\x8d"=>"\xc5\xa4","\x8e"=>"\xc5\xbd","\x8f"=>"\xc5\xb9","\x90"=>"","\x91"=>"\xe2\x80\x98","\x92"=>"\xe2\x80\x99","\x93"=>"\xe2\x80\x9c","\x94"=>"\xe2\x80\x9d","\x95"=>"\xe2\x80\xa2","\x96"=>"\xe2\x80\x93","\x97"=>"\xe2\x80\x94","\x98"=>"","\x99"=>"\xe2\x84\xa2","\x9a"=>"\xc5\xa1","\x9b"=>"\xe2\x80\xba","\x9c"=>"\xc5\x9b","\x9d"=>"\xc5\xa5","\x9e"=>"\xc5\xbe","\x9f"=>"\xc5\xba","\xa0"=>"\xc2\xa0","\xa1"=>"\xcb\x87","\xa2"=>"\xcb\x98","\xa3"=>"\xc5\x81","\xa4"=>"\xc2\xa4","\xa5"=>"\xc4\x84","\xa6"=>"\xc2\xa6","\xa7"=>"\xc2\xa7","\xa8"=>"\xc2\xa8","\xa9"=>"\xc2\xa9","\xaa"=>"\xc5\x9e","\xab"=>"\xc2\xab","\xac"=>"\xc2\xac","\xad"=>"\xc2\xad","\xae"=>"\xc2\xae","\xaf"=>"\xc5\xbb","\xb0"=>"\xc2\xb0","\xb1"=>"\xc2\xb1","\xb2"=>"\xcb\x9b","\xb3"=>"\xc5\x82","\xb4"=>"\xc2\xb4","\xb5"=>"\xc2\xb5","\xb6"=>"\xc2\xb6","\xb7"=>"\xc2\xb7","\xb8"=>"\xc2\xb8","\xb9"=>"\xc4\x85","\xba"=>"\xc5\x9f","\xbb"=>"\xc2\xbb","\xbc"=>"\xc4\xbd","\xbd"=>"\xcb\x9d","\xbe"=>"\xc4\xbe","\xbf"=>"\xc5\xbc","\xc0"=>"\xc5\x94","\xc1"=>"\xc3\x81","\xc2"=>"\xc3\x82","\xc3"=>"\xc4\x82","\xc4"=>"\xc3\x84","\xc5"=>"\xc4\xb9","\xc6"=>"\xc4\x86","\xc7"=>"\xc3\x87","\xc8"=>"\xc4\x8c","\xc9"=>"\xc3\x89","\xca"=>"\xc4\x98","\xcb"=>"\xc3\x8b","\xcc"=>"\xc4\x9a","\xcd"=>"\xc3\x8d","\xce"=>"\xc3\x8e","\xcf"=>"\xc4\x8e","\xd0"=>"\xc4\x90","\xd1"=>"\xc5\x83","\xd2"=>"\xc5\x87","\xd3"=>"\xc3\x93","\xd4"=>"\xc3\x94","\xd5"=>"\xc5\x90","\xd6"=>"\xc3\x96","\xd7"=>"\xc3\x97","\xd8"=>"\xc5\x98","\xd9"=>"\xc5\xae","\xda"=>"\xc3\x9a","\xdb"=>"\xc5\xb0","\xdc"=>"\xc3\x9c","\xdd"=>"\xc3\x9d","\xde"=>"\xc5\xa2","\xdf"=>"\xc3\x9f","\xe0"=>"\xc5\x95","\xe1"=>"\xc3\xa1","\xe2"=>"\xc3\xa2","\xe3"=>"\xc4\x83","\xe4"=>"\xc3\xa4","\xe5"=>"\xc4\xba","\xe6"=>"\xc4\x87","\xe7"=>"\xc3\xa7","\xe8"=>"\xc4\x8d","\xe9"=>"\xc3\xa9","\xea"=>"\xc4\x99","\xeb"=>"\xc3\xab","\xec"=>"\xc4\x9b","\xed"=>"\xc3\xad","\xee"=>"\xc3\xae","\xef"=>"\xc4\x8f","\xf0"=>"\xc4\x91","\xf1"=>"\xc5\x84","\xf2"=>"\xc5\x88","\xf3"=>"\xc3\xb3","\xf4"=>"\xc3\xb4","\xf5"=>"\xc5\x91","\xf6"=>"\xc3\xb6","\xf7"=>"\xc3\xb7","\xf8"=>"\xc5\x99","\xf9"=>"\xc5\xaf","\xfa"=>"\xc3\xba","\xfb"=>"\xc5\xb1","\xfc"=>"\xc3\xbc","\xfd"=>"\xc3\xbd","\xfe"=>"\xc5\xa3","\xff"=>"\xcb\x99"); 
    return strtr($s, $tbl); 
} 

Je pravda, že je to dlhý kód, aj funkcia by sa mohla menovať inak, ale som to nechal, lebo s touto funkciou a s kódom konečne mi to funguje plne podľa mojich predstáv. Teraz to ide skutočne bezchybne.

Ďakujem za pomoc!

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: