Odeslání emailu se zalogovanou chybou

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

Dobrý den,

vím, že se to tu řešilo několikrát, nicméně s množstvím změn a stářím témat se mi nic z nich nepodařilo rozchodit. Tak bych se vás chtěl zeptat, jak lze nastavit zasílání zalogované chyby emailem přes SMTP, nikoli klasickou metodou mail. Vytvoří se mi soubor mail sent nicméně mail nedojde. Používám verzi version 2.0-dev c1c9de0 released on 2011–01–07. PHP 5.3.

Za odpověď děkuji.

Aurielle
Člen | 1281
+
0
-

Poděď si Nette\Diagnostics\Logger, nastav ho Laděnce (Debuggeru) a tam si tuto funkčnost přidej. Třeba:

class ErrorLogger extends Nette\Diagnostics\Logger
{
	/** @var callback handler for sending emails */
	public $mailer = array(__CLASS__, 'mailer');


	/**
	 * Mailer using currently set Mailer in DI container
	 * @param string $body
	 * @param string $email
	 * @return void
	 */
	protected static function mailer($body, $email)
	{
		$message = new Nette\Mail\Message();
		try {
			$mailer = Nette\Environment::getService('mailer');
			$message->setMailer($mailer);
		}
		catch(Nette\DI\MissingServiceException $e) {
			$mailer = NULL;
		}

		$host = $mailHost = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] :
				(isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '');
		$domain = trim(strrchr($host, '.'), '.');
		if($len = strlen($domain) < 2) {	// Typically adresses like avalon.l
			$domain = 'loc';
			$mailHost = substr($host, 0, strlen($host) - ($len + 1));
			$mailHost .= ".$domain";
		}

		$message->addTo($email);
		$message->setFrom("noreply@$mailHost");
		$message->setSubject("PHP: An error occurred on the server $host");
		$message->setBody(str_replace(array("\r\n", "\n"), array("\n", PHP_EOL), "[" . @date('Y-m-d H:i:s') . "] $body")); // @ - timezone may not be set

		$message->send();
	}
}
darthcz
Člen | 113
+
0
-

Tak bohužel se vyskytne chyba

Fatal error: Class ‚Nette\Diagnostics\Logger‘ not found in /var/www/databaze/app/presenters/ErrorLogger.php on line 3

Používám Nette\Debug, jelikož Debugger mi taky nějak nejede… Již jsem se v těch změnách ve verzích ztratil…

hAssassin
Člen | 293
+
0
-

@darthcz > jen nastrel, ale nebude chyba v namespace? pokud nemas use, tak musis dedit takhle:

class ErrorLogger extends \Nette\Diagnostics\Logger
{...}

Totez pro ten debugger

darthcz
Člen | 113
+
0
-

Bohužel, tím to není :) Pořád stejná chyba… a u jiných namespace to bez use v pohodě funguje bez toho prvního lomítka… Spíš tam tyhle namespace vůbec nemám, asi mám ještě starší verzi… A vzhledem k tomu, že je na tom stavěn interní systém bych nerad překopával celou strukturu :) Takže bych to potřeboval rozchodit na starém Nette\Debug :)

Aurielle
Člen | 1281
+
0
-

Starší verze ještě tuším nemá rozdělený Logger od samotné Laděnky. V tom případě si stačí přepsat Nette\Debug::$defaultMailer svým callbackem, ve kterém e-mail pošleš (třeba jako ta funkce tady nahoře, kterou jsem sem dával).

darthcz
Člen | 113
+
0
-

Paráda, funguje. Díky moc :) Kdyby někdo řešil, tak níže postuju, jak to mám :) Nevím, zda všechno, co tam mám, je k funkci nezbytné …

<?php
//zapneme logovani se zasilanim chyb na mail
Debug::enable(Debug::DETECT, __DIR__ . '/log', 'xxx');

Debug::$mailer = array('ErrorLogger', 'mailer');

Debug::$email = 'xxx';
Debug::$strictMode = TRUE;
?>
<?php

class ErrorLogger {

        /**
         * Mailer using currently set Mailer in DI container
         * @param string $body
         * @return void
         */
        public static function mailer($body)
        {
                $message = new Nette\Mail\Mail();

                //vybereme smtp server s prihlasovacimi udajemi na nem
	        $mailer = new Nette\Mail\SmtpMailer(array(
	        		'host' => 'xxx',
	        		'username' => 'xxx',
	        		'password' => 'xxx',
	        		'secure' => 'ssl',
			));

                $message->setMailer($mailer);

                $message->addTo('xxx');
                $message->setFrom("xxx");
                $message->setSubject("Hlášení o nastálé chybě systému");
                $message->setBody($body);

                $message->send();
        }
}
?>