Odeslání emailu se zalogovanou chybou
- darthcz
- Člen | 113
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
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
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 :)
- darthcz
- Člen | 113
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();
}
}
?>