Ošetření případné chyby SMTP serveru při odesílání e-mailu z aplikace
- buffus
- Člen | 101
vývoj na: localhost Win7, Apache 2.4.9, test SMTP server Papercut, PHP 5.5.12, Nette Framework 2.2.2
Ahoj, prosím o radu ohledně zachycení výjimky při neodeslání emailu z aplikace.
Ukázkový kód, který odešle email od Franty a local SMTP Papercut ho „doručí“:
public function renderDefault()
{
$mail = new Nette\Mail\Message();
$mail->setFrom('Franta <franta@example.com>')
->addTo('petr@example.com')
->setSubject('Potvrzení objednávky')
->setBody("Dobrý den,\nvaše objednávka byla přijata.");
$mailer = new Nette\Mail\SendmailMailer();
$mailer->send($mail);
}
Funguje. Chtěl bych u aplikace chování, aby se v případě neodeslání emailu (poruchy SMTP serveru) vypsala uživateli flashMessage(‚Sorry… Please try again later.‘) a aplikace neskončila chybou (na produkci 500).
Obaluji tedy renderDefault do try {kód výše} catch (Nette\Mail\SmtpException $e ) {ta flashMessage}:
public function renderDefault2()
{
try {
$mail = new Nette\Mail\Message();
$mail->setFrom('Franta <franta@example.com>')
->addTo('petr@example.com')
->setSubject('Potvrzení objednávky')
->setBody("Dobrý den,\nvaše objednávka byla přijata.");
$mailer = new Nette\Mail\SendmailMailer();
$mailer->send($mail);
} catch (Nette\Mail\SmtpException $e ) {
$this->flashMessage('Sorry... Please try again later.');
}
}
Tady mám problém. Při vypnutí SMTP serveru Papercut (simulace chyby SMTP
serveru) zachytí Tracy:
Nette\InvalidStateException
Unable to send email: mail(): Failed to connect to mailserver …
na řádku:
$mailer->send($mail);
a při nastavení $configurator->setDebugMode(FALSE);
pochopitelně 500 Internal Server Error.
(na catch to vůbec nedorazí)
Tomu chování rozumím, ale nevím, jak napsat, aby aplikace v případě chyby serveru při odesílání emailu běžela dál a jen zaslala uživateli flashMessage, že email nebyl odeslán.
Předem díky za radu.
Editoval buffus (2. 8. 2014 1:33)
- David Matějka
- Moderator | 6445
Nepouzivas totiz SmtpMailer, ktery vyhazuje SmtpException (viz potrebne nastaveni: https://doc.nette.org/cs/configuring#…), ale SendmailMailer, ktery vyhazuje prave Nette\InvalidStateException
- japlavaren
- Člen | 404
zachitavaj pri mailer::send obecnu exception. ak vymenis mailer vyhnes sa
problemom
este by som si exception logoval, tj. pred flash message nieco ako
Debugger::log($e);
Editoval japlavaren (2. 8. 2014 8:16)