Validácia odoslania e-mailu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
pseudonym
Člen | 57
+
0
-

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.

Aurielle
Člen | 1281
+
0
-

Pokud to vyhodí výjimku, pak se mail neodeslal úspěšně.

pseudonym
Člen | 57
+
0
-

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
+
0
-

proč by to nemělo projít, je to validní e-mail adresa

  • Pokud přesuneš $this->redirect("this") do try 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
+
0
-

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
+
0
-

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
+
0
-

@duke: predpokladám, že ten blok s ifom 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)

22
Člen | 1478
+
0
-

pseudonym napsal(a):

tak to vyhodí ten exception.

Název te exception tam máš určitě napsaný :-)

duke
Člen | 650
+
0
-

pseudonym napsal:

@duke: predpokladám, že ten blok s ifom mám dať za try, 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 vyhazuje Nette\InvalidStateException.
  • SmtpMailer vyhazuje Nette\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štrukciu try, 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)

pseudonym
Člen | 57
+
0
-

Ok, ešte raz ďakujem za pomoc.