From a754edc64cc12a6c305c13e772ac7c2731efe892 Mon Sep 17 00:00:00 2001 From: Jordi Boggiano Date: Tue, 12 Apr 2016 18:05:41 +0100 Subject: [PATCH] Add ability to use formatter in email subject lines --- src/Monolog/Handler/MailHandler.php | 12 ++++++++++ src/Monolog/Handler/NativeMailerHandler.php | 10 +++++++- src/Monolog/Handler/SwiftMailerHandler.php | 6 +++++ .../Handler/NativeMailerHandlerTest.php | 12 ++++++++++ .../Handler/SwiftMailerHandlerTest.php | 24 +++++++++++++++++++ 5 files changed, 63 insertions(+), 1 deletion(-) diff --git a/src/Monolog/Handler/MailHandler.php b/src/Monolog/Handler/MailHandler.php index 50ed6380..9e232838 100644 --- a/src/Monolog/Handler/MailHandler.php +++ b/src/Monolog/Handler/MailHandler.php @@ -52,4 +52,16 @@ abstract class MailHandler extends AbstractProcessingHandler { $this->send((string) $record['formatted'], array($record)); } + + protected function getHighestRecord(array $records) + { + $highestRecord = null; + foreach ($records as $record) { + if ($highestRecord === null || $highestRecord['level'] < $record['level']) { + $highestRecord = $record; + } + } + + return $highestRecord; + } } diff --git a/src/Monolog/Handler/NativeMailerHandler.php b/src/Monolog/Handler/NativeMailerHandler.php index 6ff92a96..d7807fd1 100644 --- a/src/Monolog/Handler/NativeMailerHandler.php +++ b/src/Monolog/Handler/NativeMailerHandler.php @@ -12,6 +12,7 @@ namespace Monolog\Handler; use Monolog\Logger; +use Monolog\Formatter\LineFormatter; /** * NativeMailerHandler uses the mail() function to send the emails @@ -122,9 +123,16 @@ class NativeMailerHandler extends MailHandler if ($this->getContentType() == 'text/html' && false === strpos($headers, 'MIME-Version:')) { $headers .= 'MIME-Version: 1.0' . "\r\n"; } + + $subject = $this->subject; + if ($records) { + $subjectFormatter = new LineFormatter($this->subject); + $subject = $subjectFormatter->format($this->getHighestRecord($records)); + } + $parameters = implode(' ', $this->parameters); foreach ($this->to as $to) { - mail($to, $this->subject, $content, $headers, $parameters); + mail($to, $subject, $content, $headers, $parameters); } } diff --git a/src/Monolog/Handler/SwiftMailerHandler.php b/src/Monolog/Handler/SwiftMailerHandler.php index d1c6295f..aba13967 100644 --- a/src/Monolog/Handler/SwiftMailerHandler.php +++ b/src/Monolog/Handler/SwiftMailerHandler.php @@ -12,6 +12,7 @@ namespace Monolog\Handler; use Monolog\Logger; +use Monolog\Formatter\LineFormatter; /** * SwiftMailerHandler uses Swift_Mailer to send the emails @@ -66,6 +67,11 @@ class SwiftMailerHandler extends MailHandler throw new \InvalidArgumentException('Could not resolve message as instance of Swift_Message or a callable returning it'); } + if ($records) { + $subjectFormatter = new LineFormatter($message->getSubject()); + $message->setSubject($subjectFormatter->format($this->getHighestRecord($records))); + } + $message->setBody($content); $message->setDate(time()); diff --git a/tests/Monolog/Handler/NativeMailerHandlerTest.php b/tests/Monolog/Handler/NativeMailerHandlerTest.php index b597f698..ddf545db 100644 --- a/tests/Monolog/Handler/NativeMailerHandlerTest.php +++ b/tests/Monolog/Handler/NativeMailerHandlerTest.php @@ -96,4 +96,16 @@ class NativeMailerHandlerTest extends TestCase $this->assertSame("From: $from\r\nContent-type: text/plain; charset=utf-8\r\n", $params[3]); $this->assertSame('', $params[4]); } + + public function testMessageSubjectFormatting() + { + $mailer = new NativeMailerHandler('to@example.org', 'Alert: %level_name% %message%', 'from@example.org'); + $mailer->handle($this->getRecord(Logger::ERROR, "Foo\nBar\r\n\r\nBaz")); + $this->assertNotEmpty($GLOBALS['mail']); + $this->assertInternalType('array', $GLOBALS['mail']); + $this->assertArrayHasKey('0', $GLOBALS['mail']); + $params = $GLOBALS['mail'][0]; + $this->assertCount(5, $params); + $this->assertSame('Alert: ERROR Foo Bar Baz', $params[1]); + } } diff --git a/tests/Monolog/Handler/SwiftMailerHandlerTest.php b/tests/Monolog/Handler/SwiftMailerHandlerTest.php index b98b498d..85886910 100644 --- a/tests/Monolog/Handler/SwiftMailerHandlerTest.php +++ b/tests/Monolog/Handler/SwiftMailerHandlerTest.php @@ -72,6 +72,30 @@ class SwiftMailerHandlerTest extends TestCase $handler->handleBatch($records); } + public function testMessageSubjectFormatting() + { + // Wire Mailer to expect a specific Swift_Message with a customized Subject + $messageTemplate = new \Swift_Message(); + $messageTemplate->setSubject('Alert: %level_name% %message%'); + $receivedMessage = null; + + $this->mailer->expects($this->once()) + ->method('send') + ->with($this->callback(function ($value) use (&$receivedMessage) { + $receivedMessage = $value; + return true; + })); + + $handler = new SwiftMailerHandler($this->mailer, $messageTemplate); + + $records = array( + $this->getRecord(Logger::EMERGENCY), + ); + $handler->handleBatch($records); + + $this->assertEquals('Alert: EMERGENCY test', $receivedMessage->getSubject()); + } + public function testMessageHaveUniqueId() { $messageTemplate = \Swift_Message::newInstance();