From fa030f284662ea698ea149b1b5de50cc9ea10e68 Mon Sep 17 00:00:00 2001 From: Graham Wharton Date: Tue, 2 Jul 2019 11:27:10 +0100 Subject: [PATCH 1/3] Update Framework/Mail::Message to send all emails as MIME, not just HTML emails. --- .../Magento/Framework/Mail/Message.php | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/lib/internal/Magento/Framework/Mail/Message.php b/lib/internal/Magento/Framework/Mail/Message.php index 71da6e673bf29..f246889b070d6 100644 --- a/lib/internal/Magento/Framework/Mail/Message.php +++ b/lib/internal/Magento/Framework/Mail/Message.php @@ -23,7 +23,7 @@ class Message implements MailMessageInterface * * @var string */ - private $messageType = self::TYPE_TEXT; + private $messageType = Mime::TYPE_TEXT; /** * Initialize dependencies. @@ -58,8 +58,8 @@ public function setMessageType($type) */ public function setBody($body) { - if (is_string($body) && $this->messageType === MailMessageInterface::TYPE_HTML) { - $body = self::createHtmlMimeFromString($body); + if (is_string($body)) { + $body = self::createMimeFromString($body, $this->messageType); } $this->zendMessage->setBody($body); return $this; @@ -161,6 +161,10 @@ public function getRawMessage() * * @param string $htmlBody * @return \Zend\Mime\Message + * + * @deprecated All emails that Magento sends should be mime encoded. Therefore + * use generic function createMimeFromString + * @see createMimeFromString() */ private function createHtmlMimeFromString($htmlBody) { @@ -172,12 +176,29 @@ private function createHtmlMimeFromString($htmlBody) return $mimeMessage; } + /** + * Create mime message from the string. + * + * @param string $body + * @param string $messageType + * @return \Zend\Mime\Message + */ + private function createMimeFromString($body, $messageType) + { + $part = new Part($body); + $part->setCharset($this->zendMessage->getEncoding()); + $part->setType($messageType); + $mimeMessage = new \Zend\Mime\Message(); + $mimeMessage->addPart($part); + return $mimeMessage; + } + /** * @inheritdoc */ public function setBodyHtml($html) { - $this->setMessageType(self::TYPE_HTML); + $this->setMessageType(Mime::TYPE_HTML); return $this->setBody($html); } @@ -186,7 +207,7 @@ public function setBodyHtml($html) */ public function setBodyText($text) { - $this->setMessageType(self::TYPE_TEXT); + $this->setMessageType(Mime::TYPE_TEXT); return $this->setBody($text); } } From 7e3bc7154913af3c53b955a14c1f8f7dc78e7cfd Mon Sep 17 00:00:00 2001 From: Graham Wharton Date: Tue, 2 Jul 2019 12:27:17 +0100 Subject: [PATCH 2/3] Updated unit test --- .../Framework/Mail/Test/Unit/MessageTest.php | 37 ++++++++----------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/lib/internal/Magento/Framework/Mail/Test/Unit/MessageTest.php b/lib/internal/Magento/Framework/Mail/Test/Unit/MessageTest.php index 0c33e25e0d9d0..478998230a276 100644 --- a/lib/internal/Magento/Framework/Mail/Test/Unit/MessageTest.php +++ b/lib/internal/Magento/Framework/Mail/Test/Unit/MessageTest.php @@ -8,41 +8,34 @@ class MessageTest extends \PHPUnit\Framework\TestCase { /** - * @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Mail\Message + * @var \Magento\Framework\Mail\Message */ - protected $_messageMock; + protected $message; protected function setUp() { - $this->_messageMock = $this->createPartialMock( - \Magento\Framework\Mail\Message::class, - ['setBody', 'setMessageType'] - ); + $this->message = new \Magento\Framework\Mail\Message(); } public function testSetBodyHtml() { - $this->_messageMock->expects($this->once()) - ->method('setMessageType') - ->with('text/html'); + $this->message->setBodyHtml('body'); - $this->_messageMock->expects($this->once()) - ->method('setBody') - ->with('body'); - - $this->_messageMock->setBodyHtml('body'); + $part = $this->message->getBody()->getParts()[0]; + $this->assertEquals('text/html', $part->getType()); + $this->assertEquals('8bit', $part->getEncoding()); + $this->assertEquals('utf-8', $part->getCharset()); + $this->assertEquals('body', $part->getContent()); } public function testSetBodyText() { - $this->_messageMock->expects($this->once()) - ->method('setMessageType') - ->with('text/plain'); - - $this->_messageMock->expects($this->once()) - ->method('setBody') - ->with('body'); + $this->message->setBodyText('body'); - $this->_messageMock->setBodyText('body'); + $part = $this->message->getBody()->getParts()[0]; + $this->assertEquals('text/plain', $part->getType()); + $this->assertEquals('8bit', $part->getEncoding()); + $this->assertEquals('utf-8', $part->getCharset()); + $this->assertEquals('body', $part->getContent()); } } From b3e1aedd6dc63141411e5cbc67fe6b8169aa98cb Mon Sep 17 00:00:00 2001 From: Graham Wharton Date: Tue, 2 Jul 2019 13:14:57 +0100 Subject: [PATCH 3/3] Fixed coding standards violations --- .../Magento/Framework/Mail/Message.php | 20 ------------------- .../Framework/Mail/Test/Unit/MessageTest.php | 3 +++ 2 files changed, 3 insertions(+), 20 deletions(-) diff --git a/lib/internal/Magento/Framework/Mail/Message.php b/lib/internal/Magento/Framework/Mail/Message.php index f246889b070d6..a9996c0a4f12a 100644 --- a/lib/internal/Magento/Framework/Mail/Message.php +++ b/lib/internal/Magento/Framework/Mail/Message.php @@ -156,26 +156,6 @@ public function getRawMessage() return $this->zendMessage->toString(); } - /** - * Create HTML mime message from the string. - * - * @param string $htmlBody - * @return \Zend\Mime\Message - * - * @deprecated All emails that Magento sends should be mime encoded. Therefore - * use generic function createMimeFromString - * @see createMimeFromString() - */ - private function createHtmlMimeFromString($htmlBody) - { - $htmlPart = new Part($htmlBody); - $htmlPart->setCharset($this->zendMessage->getEncoding()); - $htmlPart->setType(Mime::TYPE_HTML); - $mimeMessage = new \Zend\Mime\Message(); - $mimeMessage->addPart($htmlPart); - return $mimeMessage; - } - /** * Create mime message from the string. * diff --git a/lib/internal/Magento/Framework/Mail/Test/Unit/MessageTest.php b/lib/internal/Magento/Framework/Mail/Test/Unit/MessageTest.php index 478998230a276..bea2a9ea91d38 100644 --- a/lib/internal/Magento/Framework/Mail/Test/Unit/MessageTest.php +++ b/lib/internal/Magento/Framework/Mail/Test/Unit/MessageTest.php @@ -5,6 +5,9 @@ */ namespace Magento\Framework\Mail\Test\Unit; +/** + * test Magento\Framework\Mail\Message + */ class MessageTest extends \PHPUnit\Framework\TestCase { /**