1
0
mirror of https://github.com/Seldaek/monolog.git synced 2025-08-07 13:46:38 +02:00

Auto-detecting of mime type for emails and switched to HtmlFormatter for emails by default, fixes #577

This commit is contained in:
Jordi Boggiano
2016-05-26 22:41:26 +01:00
parent af7c0a7bda
commit 8a45ed75cc
7 changed files with 47 additions and 7 deletions

View File

@@ -11,6 +11,9 @@
namespace Monolog\Handler; namespace Monolog\Handler;
use Monolog\Formatter\FormatterInterface;
use Monolog\Formatter\HtmlFormatter;
/** /**
* Base class for all mail handlers * Base class for all mail handlers
* *
@@ -64,4 +67,19 @@ abstract class MailHandler extends AbstractProcessingHandler
return $highestRecord; return $highestRecord;
} }
protected function isHtmlBody($body)
{
return substr($body, 0, 1) === '<';
}
/**
* Gets the default formatter.
*
* @return FormatterInterface
*/
protected function getDefaultFormatter(): FormatterInterface
{
return new HtmlFormatter();
}
} }

View File

@@ -48,8 +48,13 @@ class MandrillHandler extends MailHandler
*/ */
protected function send($content, array $records) protected function send($content, array $records)
{ {
$mime = null;
if ($this->isHtmlBody($content)) {
$mime = 'text/html';
}
$message = clone $this->message; $message = clone $this->message;
$message->setBody($content); $message->setBody($content, $mime);
$message->setDate(time()); $message->setDate(time());
$ch = curl_init(); $ch = curl_init();

View File

@@ -56,7 +56,7 @@ class NativeMailerHandler extends MailHandler
* The Content-type for the message * The Content-type for the message
* @var string * @var string
*/ */
protected $contentType = 'text/plain'; protected $contentType;
/** /**
* The encoding for the message * The encoding for the message
@@ -117,10 +117,15 @@ class NativeMailerHandler extends MailHandler
*/ */
protected function send($content, array $records) protected function send($content, array $records)
{ {
$content = wordwrap($content, $this->maxColumnWidth); $contentType = $this->getContentType() ?: ($this->isHtmlBody($content) ? 'text/html' : 'text/plain');
if ($contentType !== 'text/html') {
$content = wordwrap($content, $this->maxColumnWidth);
}
$headers = ltrim(implode("\r\n", $this->headers) . "\r\n", "\r\n"); $headers = ltrim(implode("\r\n", $this->headers) . "\r\n", "\r\n");
$headers .= 'Content-type: ' . $this->getContentType() . '; charset=' . $this->getEncoding() . "\r\n"; $headers .= 'Content-type: ' . $contentType . '; charset=' . $this->getEncoding() . "\r\n";
if ($this->getContentType() == 'text/html' && false === strpos($headers, 'MIME-Version:')) { if ($contentType === 'text/html' && false === strpos($headers, 'MIME-Version:')) {
$headers .= 'MIME-Version: 1.0' . "\r\n"; $headers .= 'MIME-Version: 1.0' . "\r\n";
} }

View File

@@ -82,9 +82,14 @@ class SendGridHandler extends MailHandler
$message['to[]'] = $recipient; $message['to[]'] = $recipient;
} }
$message['subject'] = $this->subject; $message['subject'] = $this->subject;
$message['text'] = $content;
$message['date'] = date('r'); $message['date'] = date('r');
if ($this->isHtmlBody($content)) {
$message['html'] = $content;
} else {
$message['text'] = $content;
}
$ch = curl_init(); $ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.sendgrid.com/api/mail.send.json'); curl_setopt($ch, CURLOPT_URL, 'https://api.sendgrid.com/api/mail.send.json');
curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POST, 1);

View File

@@ -72,7 +72,12 @@ class SwiftMailerHandler extends MailHandler
$message->setSubject($subjectFormatter->format($this->getHighestRecord($records))); $message->setSubject($subjectFormatter->format($this->getHighestRecord($records)));
} }
$message->setBody($content); $mime = null;
if ($this->isHtmlBody($content)) {
$mime = 'text/html';
}
$message->setBody($content, $mime);
$message->setDate(time()); $message->setDate(time());
return $message; return $message;

View File

@@ -61,6 +61,7 @@ class MailHandlerTest extends TestCase
public function testHandle() public function testHandle()
{ {
$handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler'); $handler = $this->getMockForAbstractClass('Monolog\\Handler\\MailHandler');
$handler->setFormatter(new \Monolog\Formatter\LineFormatter);
$record = $this->getRecord(); $record = $this->getRecord();
$records = [$record]; $records = [$record];

View File

@@ -78,6 +78,7 @@ class NativeMailerHandlerTest extends TestCase
$from = 'receiver@example.org'; $from = 'receiver@example.org';
$mailer = new NativeMailerHandler($to, $subject, $from); $mailer = new NativeMailerHandler($to, $subject, $from);
$mailer->setFormatter(new \Monolog\Formatter\LineFormatter);
$mailer->handleBatch([]); $mailer->handleBatch([]);
// batch is empty, nothing sent // batch is empty, nothing sent