diff --git a/src/Monolog/Handler/MailHandler.php b/src/Monolog/Handler/MailHandler.php new file mode 100644 index 00000000..c56bac40 --- /dev/null +++ b/src/Monolog/Handler/MailHandler.php @@ -0,0 +1,151 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +/** + * Base class for all mail handlers + * + * @author Gyula Sallai + */ +abstract class MailHandler extends AbstractHandler +{ + + protected $messageFormat; + + /** + * {@inheritdoc} + */ + public function handle(array $record) + { + if ($record['level'] < $this->level) { + return false; + } + + $record = $this->prepareRecord($record); + + $this->write($record); + + return false === $this->bubble; + } + + /** + * {@inheritdoc} + */ + public function handleBatch(array $records) + { + $messages = array(); + + foreach ($records as $record) { + if ($record['level'] < $this->level) { + continue; + } + + $record = $this->prepareRecord($record); + $messages[] = $record['message']; + } + + if (!empty($messages)) { + $this->send($this->createMessage($messages)); + } + } + + /** + * Set the message format + * + * @param string $format + */ + public function setMessageFormat($format) + { + $this->messageFormat = $format; + } + + /** + * Get the message format + * + * @return string + */ + public function getMessageFormat() + { + return $this->messageFormat; + } + + /** + * Send a mail with the given content + * + * @param string $content + */ + abstract protected function send($content); + + /** + * {@inheritdoc} + */ + protected function write(array $record) + { + $content = $record['message']; + + $this->send($content); + } + + /** + * Create a message to send from the given log entry messages + * + * @param array $messages + * + * @return string + */ + protected function createMessage(array $messages) + { + if (null === $this->messageFormat) { + $this->messageFormat = $this->getDefaultMessageFormat(); + } + + $message = str_replace('%records%', implode('', $messages), $this->messageFormat); + + return $message; + } + + /** + * Prepare a record for writing + * + * This method is just a shortcut for the common handling process (except writing) + * + * @param array $record + * + * @return array + */ + protected function prepareRecord(array $record) + { + if ($this->processors) { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + } + + if (!$this->formatter) { + $this->formatter = $this->getDefaultFormatter(); + } + $record = $this->formatter->format($record); + + return $record; + } + + /** + * Get the default mail message format + * + * @return string + */ + protected function getDefaultMessageFormat() + { + return 'Application logs:\n %records%'; + } + +} \ No newline at end of file diff --git a/src/Monolog/Handler/SwiftMailerHandler.php b/src/Monolog/Handler/SwiftMailerHandler.php new file mode 100644 index 00000000..6f862180 --- /dev/null +++ b/src/Monolog/Handler/SwiftMailerHandler.php @@ -0,0 +1,53 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +/** + * SwiftMailerHandler uses Swift_Mailer to send the emails + * + * @author Gyula Sallai + */ +class SwiftMailerHandler extends MailHandler +{ + + protected $mailer; + protected $message; + + /** + * @param \Swift_Mailer $mailer The mailer to use + * @param \Swift_Message $message An example message for real messages, + * only the body will be replaced + * @param integer $level The minimum logging level at which this handler will be triggered + * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not + */ + public function __construct(\Swift_Mailer $mailer, \Swift_Message $message, $level = Logger::ERROR, $bubble = false) + { + $this->mailer = $mailer; + $this->message = $message; + $this->level = $level; + $this->bubble = $bubble; + } + + /** + * {@inheritdoc} + */ + protected function send($content) + { + $message = clone $this->message; + $message->setBody($content); + + $this->mailer->send($message); + } + +} \ No newline at end of file diff --git a/tests/Monolog/Handler/MailHandlerTest.php b/tests/Monolog/Handler/MailHandlerTest.php new file mode 100644 index 00000000..2d9a6a84 --- /dev/null +++ b/tests/Monolog/Handler/MailHandlerTest.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; + +use Monolog\TestCase; + +class MailHandlerTest extends TestCase +{ + + public function testHandleBatch() + { + $records = $this->getMultipleRecords(); + + $formatter = $this->getMock('Monolog\Formatter\LineFormatter'); + $formatter->expects($this->exactly(count($records))) + ->method('format'); // Each record is formatted + + $handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler'); + $handler->expects($this->once()) + ->method('send'); + $handler->expects($this->never()) + ->method('write'); // write is for individual records + + $handler->setFormatter($formatter); + + $handler->handleBatch($records); + } + + public function testHandleBatchNotSendsMailIfMessagesAreBelowLevel() + { + $records = array( + $this->getRecord(Logger::DEBUG, 'debug message 1'), + $this->getRecord(Logger::DEBUG, 'debug message 2'), + $this->getRecord(Logger::INFO, 'information'), + ); + + $handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler'); + $handler->expects($this->never()) + ->method('send'); + $handler->setLevel(Logger::ERROR); + + $handler->handleBatch($records); + } + + public function testHandle() + { + $record = $this->getRecord(); + + $handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler'); + $handler->expects($this->once()) + ->method('send'); + + $handler->handle($record); + } + +} \ No newline at end of file diff --git a/tests/Monolog/TestCase.php b/tests/Monolog/TestCase.php index 337877c9..e97d12cb 100644 --- a/tests/Monolog/TestCase.php +++ b/tests/Monolog/TestCase.php @@ -28,6 +28,20 @@ class TestCase extends \PHPUnit_Framework_TestCase ); } + /** + * @return array + */ + protected function getMultipleRecords() + { + return array( + $this->getRecord(Logger::DEBUG, 'debug message 1'), + $this->getRecord(Logger::DEBUG, 'debug message 2'), + $this->getRecord(Logger::INFO, 'information'), + $this->getRecord(Logger::WARNING, 'warning'), + $this->getRecord(Logger::ERROR, 'error') + ); + } + /** * @return Monolog\Formatter\FormatterInterface */