Ošetření případné chyby SMTP serveru při odesílání e-mailu z aplikace

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

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

Nepouzivas totiz SmtpMailer, ktery vyhazuje SmtpException (viz potrebne nastaveni: https://doc.nette.org/cs/configuring#…), ale SendmailMailer, ktery vyhazuje prave Nette\InvalidStateException

buffus
Člen | 101
+
0
-

Díky!

japlavaren
Člen | 404
+
0
-

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)