Skip to content

Commit a754edc

Browse files
committed
Add ability to use formatter in email subject lines
1 parent 1fa91ef commit a754edc

File tree

5 files changed

+63
-1
lines changed

5 files changed

+63
-1
lines changed

src/Monolog/Handler/MailHandler.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,16 @@ protected function write(array $record)
5252
{
5353
$this->send((string) $record['formatted'], array($record));
5454
}
55+
56+
protected function getHighestRecord(array $records)
57+
{
58+
$highestRecord = null;
59+
foreach ($records as $record) {
60+
if ($highestRecord === null || $highestRecord['level'] < $record['level']) {
61+
$highestRecord = $record;
62+
}
63+
}
64+
65+
return $highestRecord;
66+
}
5567
}

src/Monolog/Handler/NativeMailerHandler.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Monolog\Handler;
1313

1414
use Monolog\Logger;
15+
use Monolog\Formatter\LineFormatter;
1516

1617
/**
1718
* NativeMailerHandler uses the mail() function to send the emails
@@ -122,9 +123,16 @@ protected function send($content, array $records)
122123
if ($this->getContentType() == 'text/html' && false === strpos($headers, 'MIME-Version:')) {
123124
$headers .= 'MIME-Version: 1.0' . "\r\n";
124125
}
126+
127+
$subject = $this->subject;
128+
if ($records) {
129+
$subjectFormatter = new LineFormatter($this->subject);
130+
$subject = $subjectFormatter->format($this->getHighestRecord($records));
131+
}
132+
125133
$parameters = implode(' ', $this->parameters);
126134
foreach ($this->to as $to) {
127-
mail($to, $this->subject, $content, $headers, $parameters);
135+
mail($to, $subject, $content, $headers, $parameters);
128136
}
129137
}
130138

src/Monolog/Handler/SwiftMailerHandler.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Monolog\Handler;
1313

1414
use Monolog\Logger;
15+
use Monolog\Formatter\LineFormatter;
1516

1617
/**
1718
* SwiftMailerHandler uses Swift_Mailer to send the emails
@@ -66,6 +67,11 @@ protected function buildMessage($content, array $records)
6667
throw new \InvalidArgumentException('Could not resolve message as instance of Swift_Message or a callable returning it');
6768
}
6869

70+
if ($records) {
71+
$subjectFormatter = new LineFormatter($message->getSubject());
72+
$message->setSubject($subjectFormatter->format($this->getHighestRecord($records)));
73+
}
74+
6975
$message->setBody($content);
7076
$message->setDate(time());
7177

tests/Monolog/Handler/NativeMailerHandlerTest.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,4 +96,16 @@ public function testSend()
9696
$this->assertSame("From: $from\r\nContent-type: text/plain; charset=utf-8\r\n", $params[3]);
9797
$this->assertSame('', $params[4]);
9898
}
99+
100+
public function testMessageSubjectFormatting()
101+
{
102+
$mailer = new NativeMailerHandler('[email protected]', 'Alert: %level_name% %message%', '[email protected]');
103+
$mailer->handle($this->getRecord(Logger::ERROR, "Foo\nBar\r\n\r\nBaz"));
104+
$this->assertNotEmpty($GLOBALS['mail']);
105+
$this->assertInternalType('array', $GLOBALS['mail']);
106+
$this->assertArrayHasKey('0', $GLOBALS['mail']);
107+
$params = $GLOBALS['mail'][0];
108+
$this->assertCount(5, $params);
109+
$this->assertSame('Alert: ERROR Foo Bar Baz', $params[1]);
110+
}
99111
}

tests/Monolog/Handler/SwiftMailerHandlerTest.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,30 @@ public function testMessageCanBeCustomizedGivenLoggedData()
7272
$handler->handleBatch($records);
7373
}
7474

75+
public function testMessageSubjectFormatting()
76+
{
77+
// Wire Mailer to expect a specific Swift_Message with a customized Subject
78+
$messageTemplate = new \Swift_Message();
79+
$messageTemplate->setSubject('Alert: %level_name% %message%');
80+
$receivedMessage = null;
81+
82+
$this->mailer->expects($this->once())
83+
->method('send')
84+
->with($this->callback(function ($value) use (&$receivedMessage) {
85+
$receivedMessage = $value;
86+
return true;
87+
}));
88+
89+
$handler = new SwiftMailerHandler($this->mailer, $messageTemplate);
90+
91+
$records = array(
92+
$this->getRecord(Logger::EMERGENCY),
93+
);
94+
$handler->handleBatch($records);
95+
96+
$this->assertEquals('Alert: EMERGENCY test', $receivedMessage->getSubject());
97+
}
98+
7599
public function testMessageHaveUniqueId()
76100
{
77101
$messageTemplate = \Swift_Message::newInstance();

0 commit comments

Comments
 (0)