Validácia odoslania e-mailu
- pseudonym
- Člen | 57
Ahojte, potreboval by som po odoslaní formulára overiť, či bol e-mail odoslaný v poriadku a vypísať hlášku o úspešnosti/neúspešnosti.
Niečo ako z klasického PHP:
$result = mail($to, $subject, $message, $headers);
if ($result) echo "uspesne odoslane"; else echo "email sa neodoslal";
E-mail v Nette vytváram nasledovne:
$mail = new Message;
$mail->setFrom($values['email'], $values['name'])
->addTo("moj@mail.sk", "Moje meno")
->setSubject("subjekt")
->setBody($values['message'])
->send();
Skúšal som to vložiť do premennej, ale send()
pokiaľ viem
nevracia informáciu o tom, či bol e-mail úspešne odoslaný.
Hľadal som to na fóre aj v dokumentácii, ale nikde som nič nenašiel.
- pseudonym
- Člen | 57
Skúšam toto:
try {
$mail->setFrom($values['email'], $values['name'])
->addTo("moj@email.sk", "pseudonym")
->setSubject("predmet spravy")
->setBody($values['message'])
->send();
$this->flashMessage("uspech", "success");
}
catch (\Exception $e) {
$this->flashMessage("neuspech", "warning");
}
$this->redirect(":Front:Default:contactForm");
Čo robím zle? Vždy mi to prejde, aj keď dám „to“ ako
moj@email.sk
.
Ďalšia otázka je, či môžem presmerovať späť na contactForm len
v prípade úspechu? Resp. keď je neúspech, vypíše sa hláška, ale
formulár ostane vyplnený.
Vopred ďakujem za pomoc
- 22
- Člen | 1478
proč by to nemělo projít, je to validní e-mail adresa
- Pokud přesuneš
$this->redirect("this")
dotry
bloku, tak se ti to provede jen v případě úspěchu, ale nesmíš zachytávat obecnou vyjímku, ale tu, kterou očekáváš.
- duke
- Člen | 650
Pokud vím, tak zjistit, že emailová adresa je falešná, je prakticky nemožné. Takže nečekej, že ti to v takovém případě vyhodí výjimku.
Ohledně té redirekce buď jak říká 22, nebo např. takto:
if (!isset($e)) {
$this->redirect(":Front:Default:contactForm");
}
Důvod proč to nejde řešit intuitivně s obecnou výjimkou je ten, že
metoda redirect
sama vyhazuje výjimku
Application\AbortException
, aby ukončila životní cyklus
presenteru, a spoléhá se, že tato bude zachycena až v
Presenter::run
, čemuž by tvůj obecný catch blok zabránil.
Editoval duke (23. 5. 2012 9:56)
- pseudonym
- Člen | 57
Super, ďakujem :-)
Nevedel som, ako to mám vyskúšať, keď dám iba mojemail.sk
,
tak to vyhodí ten exception.
Inak ešte taká otázočka, ako mám vedieť akú exception očakávam? Keď
pozerám na dokumentáciu,
tak nikde nevidím výnimky pri metóde send()
.
- pseudonym
- Člen | 57
@duke: predpokladám, že ten blok s if
om mám dať za
try, catch
konštrukciu. Pokiaľ som to otestoval dobre, tak to
funguje.
Nejde mi o to, aby som odchytil nesprávny e-mail. Ten
moj@email.sk
je tam nastavený natvrdo. Ide o to, aby som vypísal
používateľovi feedback ak náhodou e-mail zlyhá, teda bude preťažený
server a podobne.
Ďakujem všetkým za pomoc ;-)
Možno ešte jedna podotázočka: Je možné takto nejako ošetriť aj
odoslanie napr. dvoch e-mailov naraz? Resp. možno dať odoslanie dvoch e-mailov
do jedného try, catch
alebo musím pre každé odoslanie vypísať
vlastnú konštrukciu try, catch
?
try {
$mail1->send();
$mail2->send();
echo "preslo";
}
catch (\Exception $e) {
echo "nepreslo";
}
if (!isset($e)) {
redirect(...);
}
Editoval pseudonym (23. 5. 2012 10:03)
- duke
- Člen | 650
pseudonym napsal:
@duke: predpokladám, že ten blok s
if
om mám dať zatry, catch
konštrukciu. Pokiaľ som to otestoval dobre, tak to funguje.
Předpokládáš správně.
pseudonym napsal:
Nevedel som, ako to mám vyskúšať, keď dám iba mojemail.sk, tak to vyhodí ten exception. Inak ešte taká otázočka, ako mám vedieť akú exception očakávam? Keď pozerám na dokumentáciu, tak nikde nevidím výnimky pri metóde send().
Když to není v dokumentaci, nezbývá než nahlédnout do zdrojových kódů Nette (např. přes apigenem vygenerovanou dokumentaci API).
Tam pak dohledáš, že:
SendmailMailer
vyhazujeNette\InvalidStateException
.SmtpMailer
vyhazujeNette\Mail\SmtpException
.
Správně by to mělo být uvedené v anotacích těch metod, ale někde to chybí.
pseudonym napsal:
Možno ešte jedna podotázočka: Je možné takto nejako ošetriť aj odoslanie napr. dvoch e-mailov naraz? Resp. možno dať odoslanie dvoch e-mailov do jedného
try, catch
alebo musím pre každé odoslanie vypísať vlastnú konštrukciutry, catch
?
Možné to samozřejmě je. Jde o to, jaké chování aplikace požaduješ.
Možné je také tam ty try/catch bloky nedat vůbec, ale pak ti případná
výjimka probublá až někam do třídy Application
a ta předá
řizení ErrorPresenteru
, atd.
Nastuduj si jak fungují výjimky, toto není vyloženě dotaz k Nette.
Editoval duke (25. 5. 2012 23:32)