Autor Zpráva
hladis
Profil
Dobrý den... Mám skript na odeslání mailu:
<?php
@session_start();

$to = $_POST['to'];
$title= $_POST['title'];
$from = $_POST['from'];
$text = $_POST['text'];
$capchta = $_POST['captcha'];

if ($_SESSION['captcha'] != $_REQUEST['captcha']) echo("Špatně opsán kód!");
elseif ($title == "") echo("Nenapsal jsi žádný předmět!");
elseif ($from == "") echo("Zadejte vaši přezdívku/emailovou adresu!");
elseif ($text == "") echo("Nenapsal jsi žádný text!");
elseif (!ereg("^.+@.+\\..+$", $to)) echo("Adresa příjemce není platnou emailovou adresou!");
elseif (!mail($to, $title, $text, 'From: ' . $from)) echo("Email se nepodařilo odeslat.");
else echo("Email byl úspěšně odeslán.");
?>

a chtěl bych tam šikovně vložit podmínku, která upravuje proměnnou "from" - když bude prázdná, tak bude mít hodnotu "neodpovídat", a když bude odpovídat podmínce "(!ereg("^.+@.+\\..+$", $to))", tak se odešle jako emailová adresa.

Dále bych chtěl k odeslanému textu nějaký text přidat. Jak se to dělá, to si najdu sám, ale nevím, jak je to se znaky - vím, že kdybych do toho napsal prostě <a href="http://adresa">adresa</a>, tak mi to neodešle.

PHP moc neovládám, a proto se obracím na vás - věřím, že mi pomůžete... Děkuji :)
ATi
Profil
elseif(empty($from)) { $from = "neodpovidat"; }
Nemůžeš tedy dávat podmínku:
elseif ($from == "") echo("Zadejte vaši přezdívku/emailovou adresu!");
protože to co jsi napsal nahrazuje funkce empty a jestliže chceš docílit toho aby se při nevyplnění inputu s názvem form nastavilo proměnné $form = "neodpovídat"; nemůžeš zastavovat skript na podmínce.
Udělal bych to takhle,protože porovnávat dvě proměnné v jedné podmínce není dobré.

Tedy:
$to = $_POST['to'];
$title= $_POST['title'];
$from = $_POST['from'];
$text = $_POST['text'];
$capchta = $_POST['captcha'];
 
if ($_SESSION['captcha'] != $_REQUEST['captcha']) echo("Špatně opsán kód!");
elseif ($title == "") echo("Nenapsal jsi žádný předmět!");
elseif ($text == "") echo("Nenapsal jsi žádný text!");
elseif (empty($from)) { $from = "neodpovidat"; }
elseif (!ereg("^.+@.+\\..+$", $from)) echo("Adresa příjemce není platnou emailovou adresou!");
elseif (!ereg("^.+@.+\\..+$", $to)) echo("Adresa příjemce není platnou emailovou adresou!");
elseif (!mail($to, $title, $text, 'From: ' . $from)) echo("Email se nepodařilo odeslat.");
else echo("Email byl úspěšně odeslán.");
?>
Amunak
Profil
ATi
Jestli se nepletu, zapsal jsi skoro to samé, jen trochu jinak. Skript se na tom zastaví tak jako tak, protože se řetězec podmínek if/elseif/else zastaví.

hladis:
Ještě by taky bylo dobré ověřovat, jestli jsou pole vůbec odeslaná. Jinak bude to přiřazení na začátku házet notice. Nepoužívej ereg, ale preg_match. Funkce ereg je zastaralá. Připsal jsem tam taky definici kódování, pokud používáš utf-8, je pak větší šance, že se v mailu diakritika nerozbije.

V kódu jsem zvýraznil ty dvě věci které jsi tam chtěl přidat. Netestoval jsem to a psal jsem to tady na diskuzi, takže je možné, že jsem se někde přepsal.
define('PRIDANY_TEXT', '<a href="http://adresa">adresa</a>');
define('EMAIL_MATCH', '~^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$~i');

$odeslat = true;

foreach(array('to', 'title', 'text', 'captcha') as $k)
{
  if(!isset($_POST[$k]) || empty($_POST[$k]))
  {
    echo 'Položka "' . $k . '" musí být vyplněná.';
    $odeslat = false;
    ${$k} = $_POST[$k];
  }
}

if(!isset($_POST['from']) || empty($_POST['from']))
  $from = 'neodpovídat';
elseif(preg_match(EMAIL_MATCH, $_POST['from']))
{
  $from = $_POST['from'];
}
else
  $odeslat = false;

if ($_SESSION['captcha'] != $_REQUEST['captcha'])
{
  echo("Špatně opsán kód!");
  $odeslat = false;
}

if(!preg_match(EMAIL_MATCH, $to))
{
  echo "Adresa příjemce není platnou emailovou adresou.");
  $odeslat = false;
}

$head = "MIME-Version: 1.0\r\n"
      . "From: $from\r\n"
      . "Content-type: text/plain; charset=UTF-8"; 
if($odeslat)
{
  if (!mail($to, '=?UTF-8?B?' . base64_encode($title) . '?=', $text . PRIDANY_TEXT, $head))
    echo("Email se nepodařilo odeslat.");
  else
    echo("Email byl úspěšně odeslán.");
}
koudelacek
Profil *
Proč je ten titulek zakodovany ?
Amunak
Profil
koudelacek:
Právě kvůli češtině.
koudelacek
Profil *
Amunak:
Pokud si tam nastavil kódování utf8, tak není problém ne ?
( já nevím jak to je, ptám se, ať kdyžtak vím, protože taky něco zrovna dělám a stačilo mi přidat utf8 a diakritika mi běží ok )


A ještě pokud tam chce cpát odkazy, tak Content-type: text/html
Amunak
Profil
koudelacek:
Ten content-type je pravda, přemýšlel jsem nad tím, ale pak by taky bylo vhodné vstup od uživatele ošetřit pomocí htmlspecialchars.

Nejsem si jistý jestli je bezpečné předmět nezakódovat. Podle normy je to takhle správně, a je to přinejhorším stejně spolehlivé jako to nechat nezakódované.
koudelacek
Profil *
A pokud si předmět píšu vlastní ?
Amunak
Profil
koudelacek:
Pokud je bez diakritiky, normálně ho tam zadáš. Jestli s diakritikou, tak ho prostě vepíšeš tam kde je $title. A příště si založ vlastní téma.
koudelacek
Profil *
Omouvám se a díky.

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: