From 3309db20fc3845da4a92ca35f63ccfc9b6015905 Mon Sep 17 00:00:00 2001 From: Fabian Schmengler Date: Sun, 19 Feb 2017 19:50:31 +0000 Subject: [PATCH 1/9] Install ZF 2 mail component --- composer.json | 1 + composer.lock | 110 +++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 109 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 6f5db49046fd6..ce11abb0210c9 100644 --- a/composer.json +++ b/composer.json @@ -17,6 +17,7 @@ "zendframework/zend-validator": "~2.4.6", "zendframework/zend-crypt": "~2.4.6", "zendframework/zend-console": "~2.4.6", + "zendframework/zend-mail": "~2.4.6", "zendframework/zend-modulemanager": "~2.4.6", "zendframework/zend-mvc": "~2.4.6", "zendframework/zend-text": "~2.4.6", diff --git a/composer.lock b/composer.lock index e70cea5bcf431..1e9be321ca43f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,8 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "97ab1727a2fea10a0cd95f7adacac54f", - "content-hash": "0e5259f8a96420e846c5413dd07fd4bc", + "hash": "c7dc804fa3caa5766426e1f61ec354dd", + "content-hash": "cc8d47c917e48dfc1d70fe4c8a695631", "packages": [ { "name": "braintree/braintree_php", @@ -2725,6 +2725,62 @@ ], "time": "2015-05-07 14:55:31" }, + { + "name": "zendframework/zend-mail", + "version": "2.4.11", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-mail.git", + "reference": "c1c73d7f44b3e815e955cd59b822954ca7a92a77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-mail/zipball/c1c73d7f44b3e815e955cd59b822954ca7a92a77", + "reference": "c1c73d7f44b3e815e955cd59b822954ca7a92a77", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-crypt": "~2.4.0", + "zendframework/zend-loader": "~2.4.0", + "zendframework/zend-mime": "~2.4.0", + "zendframework/zend-stdlib": "~2.4.0", + "zendframework/zend-validator": "~2.4.0" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-config": "~2.4.0", + "zendframework/zend-servicemanager": "~2.4.0" + }, + "suggest": { + "zendframework/zend-servicemanager": "Zend\\ServiceManager component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev", + "dev-develop": "2.5-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Mail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides generalized functionality to compose and send both text and MIME-compliant multipart e-mail messages", + "homepage": "https://github.com/zendframework/zend-mail", + "keywords": [ + "mail", + "zf2" + ], + "time": "2016-12-19 22:35:29" + }, { "name": "zendframework/zend-math", "version": "2.4.11", @@ -2776,6 +2832,56 @@ ], "time": "2015-05-07 14:55:31" }, + { + "name": "zendframework/zend-mime", + "version": "2.4.11", + "source": { + "type": "git", + "url": "https://github.com/zendframework/zend-mime.git", + "reference": "df81ca9f94f0d1cd31175b8d2df6002b61dd5973" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zendframework/zend-mime/zipball/df81ca9f94f0d1cd31175b8d2df6002b61dd5973", + "reference": "df81ca9f94f0d1cd31175b8d2df6002b61dd5973", + "shasum": "" + }, + "require": { + "php": ">=5.3.23", + "zendframework/zend-stdlib": "self.version" + }, + "require-dev": { + "fabpot/php-cs-fixer": "1.7.*", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "dev-master", + "zendframework/zend-mail": "self.version" + }, + "suggest": { + "zendframework/zend-mail": "Zend\\Mail component" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev", + "dev-develop": "2.5-dev" + } + }, + "autoload": { + "psr-4": { + "Zend\\Mime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://github.com/zendframework/zend-mime", + "keywords": [ + "mime", + "zf2" + ], + "time": "2015-05-07 16:53:42" + }, { "name": "zendframework/zend-modulemanager", "version": "2.4.11", From 584a17afff88e93056c789a96928540de73742c4 Mon Sep 17 00:00:00 2001 From: Fabian Schmengler Date: Sun, 19 Feb 2017 21:43:16 +0000 Subject: [PATCH 2/9] Replace ZF1 Zend_Mail with ZF2 Zend\Mail --- .../Magento/Framework/Mail/Message.php | 45 ++++++++++--------- .../Mail/Test/Unit/TransportTest.php | 2 +- .../Magento/Framework/Mail/Transport.php | 7 +-- 3 files changed, 30 insertions(+), 24 deletions(-) diff --git a/lib/internal/Magento/Framework/Mail/Message.php b/lib/internal/Magento/Framework/Mail/Message.php index 36a0e6a5cbc61..c212ad58e7366 100644 --- a/lib/internal/Magento/Framework/Mail/Message.php +++ b/lib/internal/Magento/Framework/Mail/Message.php @@ -7,14 +7,17 @@ */ namespace Magento\Framework\Mail; -class Message extends \Zend_Mail implements MessageInterface +use Zend\Mime\Mime; +use Zend\Mime\Part; + +class Message extends \Zend\Mail\Message implements MessageInterface { /** * @param string $charset */ public function __construct($charset = 'utf-8') { - parent::__construct($charset); + parent::setEncoding($charset); } /** @@ -24,25 +27,14 @@ public function __construct($charset = 'utf-8') */ protected $messageType = self::TYPE_TEXT; - /** - * Set message body - * - * @param string $body - * @return $this - */ - public function setBody($body) + private function htmlMimeFromString($htmlBody) { - return $this->messageType == self::TYPE_TEXT ? $this->setBodyText($body) : $this->setBodyHtml($body); - } - - /** - * Set message body - * - * @return string - */ - public function getBody() - { - return $this->messageType == self::TYPE_TEXT ? $this->getBodyText() : $this->getBodyHtml(); + $htmlPart = new Part($htmlBody); + $htmlPart->setCharset($this->getEncoding()); + $htmlPart->setType(Mime::TYPE_HTML); + $mimeMessage = new \Zend\Mime\Message(); + $mimeMessage->addPart($htmlPart); + return $mimeMessage; } /** @@ -56,4 +48,17 @@ public function setMessageType($type) $this->messageType = $type; return $this; } + + /** + * @param null|object|string|\Zend\Mime\Message $body + * @return \Zend\Mail\Message + */ + public function setBody($body) + { + if (is_string($body) && $this->messageType === MessageInterface::TYPE_HTML) { + $body = self::htmlMimeFromString($body); + } + return parent::setBody($body); + } + } diff --git a/lib/internal/Magento/Framework/Mail/Test/Unit/TransportTest.php b/lib/internal/Magento/Framework/Mail/Test/Unit/TransportTest.php index 685920217d0b9..2562b29c8831e 100644 --- a/lib/internal/Magento/Framework/Mail/Test/Unit/TransportTest.php +++ b/lib/internal/Magento/Framework/Mail/Test/Unit/TransportTest.php @@ -25,7 +25,7 @@ protected function setUp() /** * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The message should be an instance of \Zend_Mail + * @expectedExceptionMessage The message should be an instance of \Zend\Mail\Message */ public function testTransportWithIncorrectMessageObject() { diff --git a/lib/internal/Magento/Framework/Mail/Transport.php b/lib/internal/Magento/Framework/Mail/Transport.php index b331032cabb73..e8890ed2f94d4 100644 --- a/lib/internal/Magento/Framework/Mail/Transport.php +++ b/lib/internal/Magento/Framework/Mail/Transport.php @@ -6,7 +6,8 @@ */ namespace Magento\Framework\Mail; -class Transport extends \Zend_Mail_Transport_Sendmail implements \Magento\Framework\Mail\TransportInterface + +class Transport extends \Zend\Mail\Transport\Sendmail implements \Magento\Framework\Mail\TransportInterface { /** * @var \Magento\Framework\Mail\MessageInterface @@ -20,8 +21,8 @@ class Transport extends \Zend_Mail_Transport_Sendmail implements \Magento\Framew */ public function __construct(\Magento\Framework\Mail\MessageInterface $message, $parameters = null) { - if (!$message instanceof \Zend_Mail) { - throw new \InvalidArgumentException('The message should be an instance of \Zend_Mail'); + if (!$message instanceof \Zend\Mail\Message) { + throw new \InvalidArgumentException('The message should be an instance of \Zend\Mail\Message'); } parent::__construct($parameters); $this->_message = $message; From ca1a3b2379ee911cb25137c60167f0e1f62e201b Mon Sep 17 00:00:00 2001 From: Fabian Schmengler Date: Sun, 19 Feb 2017 21:44:02 +0000 Subject: [PATCH 3/9] Remove unused variable --- app/code/Magento/Newsletter/Model/Template.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/app/code/Magento/Newsletter/Model/Template.php b/app/code/Magento/Newsletter/Model/Template.php index f13d8c3e4fe14..b2b3ce85a9894 100644 --- a/app/code/Magento/Newsletter/Model/Template.php +++ b/app/code/Magento/Newsletter/Model/Template.php @@ -36,12 +36,6 @@ */ class Template extends \Magento\Email\Model\AbstractTemplate { - /** - * Mail object - * - * @var \Zend_Mail - */ - protected $_mail; /** * Store manager to emulate design From d1be154b13095eb967ba6356d3eff2984e920801 Mon Sep 17 00:00:00 2001 From: Fabian Schmengler Date: Sun, 19 Feb 2017 22:55:07 +0000 Subject: [PATCH 4/9] Update unit tests for ZF 2 mail --- .../Magento/Framework/Mail/Message.php | 33 ++++++++++++------- .../Framework/Mail/Test/Unit/MessageTest.php | 1 + .../Unit/Template/TransportBuilderTest.php | 2 ++ .../Mail/Test/Unit/TransportTest.php | 33 ++++++------------- 4 files changed, 35 insertions(+), 34 deletions(-) diff --git a/lib/internal/Magento/Framework/Mail/Message.php b/lib/internal/Magento/Framework/Mail/Message.php index c212ad58e7366..cb485815c3cfb 100644 --- a/lib/internal/Magento/Framework/Mail/Message.php +++ b/lib/internal/Magento/Framework/Mail/Message.php @@ -10,14 +10,22 @@ use Zend\Mime\Mime; use Zend\Mime\Part; +/** + * @todo composition instead of inheritance for better testability + * - add a ZendMailDecorator interface with getZendMail() method for usage in \Magento\Framework\Mail\Transport + * @todo get rid of temporal coupling (setMessageType() + setBody()) + * - deprecate setMessageType(), implement a HtmlMessage decorator instead + * - change usage in \Magento\Framework\Mail\Template\TransportBuilder::prepareMessage() + */ class Message extends \Zend\Mail\Message implements MessageInterface { + /** * @param string $charset */ public function __construct($charset = 'utf-8') { - parent::setEncoding($charset); + $this->encoding = $charset; } /** @@ -27,16 +35,6 @@ public function __construct($charset = 'utf-8') */ protected $messageType = self::TYPE_TEXT; - private function htmlMimeFromString($htmlBody) - { - $htmlPart = new Part($htmlBody); - $htmlPart->setCharset($this->getEncoding()); - $htmlPart->setType(Mime::TYPE_HTML); - $mimeMessage = new \Zend\Mime\Message(); - $mimeMessage->addPart($htmlPart); - return $mimeMessage; - } - /** * Set message type * @@ -61,4 +59,17 @@ public function setBody($body) return parent::setBody($body); } + /** + * @param string $htmlBody + * @return \Zend\Mime\Message + */ + private function htmlMimeFromString($htmlBody) + { + $htmlPart = new Part($htmlBody); + $htmlPart->setCharset($this->getEncoding()); + $htmlPart->setType(Mime::TYPE_HTML); + $mimeMessage = new \Zend\Mime\Message(); + $mimeMessage->addPart($htmlPart); + return $mimeMessage; + } } diff --git a/lib/internal/Magento/Framework/Mail/Test/Unit/MessageTest.php b/lib/internal/Magento/Framework/Mail/Test/Unit/MessageTest.php index 80e0709165d39..fd3ff4223fa11 100644 --- a/lib/internal/Magento/Framework/Mail/Test/Unit/MessageTest.php +++ b/lib/internal/Magento/Framework/Mail/Test/Unit/MessageTest.php @@ -14,6 +14,7 @@ class MessageTest extends \PHPUnit_Framework_TestCase protected function setUp() { + $this->markTestSkipped('obsolete ZF 1 test'); $this->_messageMock = $this->getMock( \Magento\Framework\Mail\Message::class, ['getBodyText', 'getBodyHtml', 'setBodyText', 'setBodyHtml'] diff --git a/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderTest.php b/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderTest.php index 548359180a538..fafbad24331fe 100644 --- a/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderTest.php +++ b/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderTest.php @@ -7,6 +7,7 @@ use Magento\Framework\App\TemplateTypesInterface; use Magento\Framework\Mail\MessageInterface; +use Zend\Mail\Headers; class TransportBuilderTest extends \PHPUnit_Framework_TestCase { @@ -53,6 +54,7 @@ protected function setUp() $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->templateFactoryMock = $this->getMock(\Magento\Framework\Mail\Template\FactoryInterface::class); $this->messageMock = $this->getMock(\Magento\Framework\Mail\Message::class); + $this->messageMock->method('getHeaders')->willReturn(new Headers()); $this->objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class); $this->senderResolverMock = $this->getMock(\Magento\Framework\Mail\Template\SenderResolverInterface::class); $this->mailTransportFactoryMock = $this->getMockBuilder( diff --git a/lib/internal/Magento/Framework/Mail/Test/Unit/TransportTest.php b/lib/internal/Magento/Framework/Mail/Test/Unit/TransportTest.php index 2562b29c8831e..d7336e4be478e 100644 --- a/lib/internal/Magento/Framework/Mail/Test/Unit/TransportTest.php +++ b/lib/internal/Magento/Framework/Mail/Test/Unit/TransportTest.php @@ -5,45 +5,32 @@ */ namespace Magento\Framework\Mail\Test\Unit; +use Zend\Mail\Headers; + class TransportTest extends \PHPUnit_Framework_TestCase { - /** - * @var \PHPUnit_Framework_MockObject - */ - protected $_messageMock; - - /** - * @var \Magento\Framework\Mail\Transport - */ - protected $_transport; - - protected function setUp() - { - $this->_messageMock = $this->getMock(\Magento\Framework\Mail\Message::class, [], [], '', false); - $this->_transport = new \Magento\Framework\Mail\Transport($this->_messageMock); - } - /** * @expectedException \InvalidArgumentException * @expectedExceptionMessage The message should be an instance of \Zend\Mail\Message */ public function testTransportWithIncorrectMessageObject() { - $this->_messageMock = $this->getMock(\Magento\Framework\Mail\MessageInterface::class); - $this->_transport = new \Magento\Framework\Mail\Transport($this->_messageMock); + new \Magento\Framework\Mail\Transport( + $this->getMock(\Magento\Framework\Mail\MessageInterface::class) + ); } /** * @covers \Magento\Framework\Mail\Transport::sendMessage * @expectedException \Magento\Framework\Exception\MailException - * @expectedExceptionMessage No body specified + * @expectedExceptionMessage Invalid email; contains no "To" header */ public function testSendMessageBrokenMessage() { - $this->_messageMock->expects($this->any()) - ->method('getParts') - ->will($this->returnValue(['a', 'b'])); + $transport = new \Magento\Framework\Mail\Transport( + new \Magento\Framework\Mail\Message() + ); - $this->_transport->sendMessage(); + $transport->sendMessage(); } } From c1d8e0db2f6f136910da9ce0eb6515fde7180eed Mon Sep 17 00:00:00 2001 From: Fabian Schmengler Date: Sat, 18 Mar 2017 23:25:38 +0000 Subject: [PATCH 5/9] Remove zend mail inheritance --- .../Newsletter/Model/SubscriberTest.php | 5 +- .../Magento/ProductAlert/Model/EmailTest.php | 2 +- .../ProductAlert/Model/ObserverTest.php | 2 +- .../Magento/Framework/Mail/Message.php | 80 ++++++++++++++++--- .../Framework/Mail/MessageInterface.php | 7 ++ .../Magento/Framework/Mail/Transport.php | 17 ++-- 6 files changed, 92 insertions(+), 21 deletions(-) diff --git a/dev/tests/integration/testsuite/Magento/Newsletter/Model/SubscriberTest.php b/dev/tests/integration/testsuite/Magento/Newsletter/Model/SubscriberTest.php index 1754c243e8ba0..b1f5b8af915b7 100644 --- a/dev/tests/integration/testsuite/Magento/Newsletter/Model/SubscriberTest.php +++ b/dev/tests/integration/testsuite/Magento/Newsletter/Model/SubscriberTest.php @@ -6,6 +6,8 @@ namespace Magento\Newsletter\Model; +use Magento\TestFramework\Mail\Template\TransportBuilderMock; + class SubscriberTest extends \PHPUnit_Framework_TestCase { /** @@ -27,13 +29,14 @@ protected function setUp() public function testEmailConfirmation() { $this->_model->subscribe('customer_confirm@example.com'); + /** @var TransportBuilderMock $transportBuilder */ $transportBuilder = \Magento\TestFramework\Helper\Bootstrap::getObjectManager() ->get(\Magento\TestFramework\Mail\Template\TransportBuilderMock::class); // confirmationCode 'ysayquyajua23iq29gxwu2eax2qb6gvy' is taken from fixture $this->assertContains( '/newsletter/subscriber/confirm/id/' . $this->_model->getSubscriberId() . '/code/ysayquyajua23iq29gxwu2eax2qb6gvy', - $transportBuilder->getSentMessage()->getBodyHtml()->getRawContent() + $transportBuilder->getSentMessage()->getRawMessage() ); $this->assertEquals(Subscriber::STATUS_NOT_ACTIVE, $this->_model->getSubscriberStatus()); } diff --git a/dev/tests/integration/testsuite/Magento/ProductAlert/Model/EmailTest.php b/dev/tests/integration/testsuite/Magento/ProductAlert/Model/EmailTest.php index 367080334813b..9a817a463beda 100644 --- a/dev/tests/integration/testsuite/Magento/ProductAlert/Model/EmailTest.php +++ b/dev/tests/integration/testsuite/Magento/ProductAlert/Model/EmailTest.php @@ -82,7 +82,7 @@ public function testSend($isCustomerIdUsed) ); $this->assertContains( 'John Smith,', - $transportBuilder->getSentMessage()->getBodyHtml()->getRawContent() + $transportBuilder->getSentMessage()->getRawMessage() ); } diff --git a/dev/tests/integration/testsuite/Magento/ProductAlert/Model/ObserverTest.php b/dev/tests/integration/testsuite/Magento/ProductAlert/Model/ObserverTest.php index c4f18ff806d38..3531f21715ffd 100644 --- a/dev/tests/integration/testsuite/Magento/ProductAlert/Model/ObserverTest.php +++ b/dev/tests/integration/testsuite/Magento/ProductAlert/Model/ObserverTest.php @@ -56,7 +56,7 @@ public function testProcess() ); $this->assertContains( 'John Smith,', - $transportBuilder->getSentMessage()->getBodyHtml()->getRawContent() + $transportBuilder->getSentMessage()->getRawMessage() ); } } diff --git a/lib/internal/Magento/Framework/Mail/Message.php b/lib/internal/Magento/Framework/Mail/Message.php index cb485815c3cfb..e8e66ff988952 100644 --- a/lib/internal/Magento/Framework/Mail/Message.php +++ b/lib/internal/Magento/Framework/Mail/Message.php @@ -11,21 +11,25 @@ use Zend\Mime\Part; /** - * @todo composition instead of inheritance for better testability - * - add a ZendMailDecorator interface with getZendMail() method for usage in \Magento\Framework\Mail\Transport * @todo get rid of temporal coupling (setMessageType() + setBody()) - * - deprecate setMessageType(), implement a HtmlMessage decorator instead + * - deprecate setMessageType(), setBody() and getBody() + * - implement setBodyHtml(), setBodyText(), getBodyHtml() and getBodyText() * - change usage in \Magento\Framework\Mail\Template\TransportBuilder::prepareMessage() */ -class Message extends \Zend\Mail\Message implements MessageInterface +class Message implements MessageInterface { + /** + * @var \Zend\Mail\Message + */ + private $zendMessage; /** - * @param string $charset + * @param string $encoding */ - public function __construct($charset = 'utf-8') + public function __construct($encoding = 'utf-8') { - $this->encoding = $charset; + $this->zendMessage = new \Zend\Mail\Message; + $this->zendMessage->setEncoding($encoding); } /** @@ -49,24 +53,76 @@ public function setMessageType($type) /** * @param null|object|string|\Zend\Mime\Message $body - * @return \Zend\Mail\Message + * @return $this */ public function setBody($body) { if (is_string($body) && $this->messageType === MessageInterface::TYPE_HTML) { - $body = self::htmlMimeFromString($body); + $body = self::createHtmlMimeFromString($body); } - return parent::setBody($body); + $this->zendMessage->setBody($body); + return $this; + } + + public function setSubject($subject) + { + $this->zendMessage->setSubject($subject); + return $this; + } + + public function getSubject() + { + return $this->zendMessage->getSubject(); + } + + public function getBody() + { + return $this->zendMessage->getBody(); + } + + public function setFrom($fromAddress) + { + $this->zendMessage->setFrom($fromAddress); + return $this; + } + + public function addTo($toAddress) + { + $this->zendMessage->addTo($toAddress); + return $this; + } + + public function addCc($ccAddress) + { + $this->zendMessage->addCc($ccAddress); + return $this; + } + + public function addBcc($bccAddress) + { + $this->zendMessage->addBcc($bccAddress); + return $this; + } + + public function setReplyTo($replyToAddress) + { + $this->zendMessage->setReplyTo($replyToAddress); + return $this; + } + + public function getRawMessage() + { + return $this->zendMessage->toString(); } /** * @param string $htmlBody * @return \Zend\Mime\Message */ - private function htmlMimeFromString($htmlBody) + private function createHtmlMimeFromString($htmlBody) { $htmlPart = new Part($htmlBody); - $htmlPart->setCharset($this->getEncoding()); + $htmlPart->setCharset($this->zendMessage->getEncoding()); $htmlPart->setType(Mime::TYPE_HTML); $mimeMessage = new \Zend\Mime\Message(); $mimeMessage->addPart($htmlPart); diff --git a/lib/internal/Magento/Framework/Mail/MessageInterface.php b/lib/internal/Magento/Framework/Mail/MessageInterface.php index 4b068cf0e737a..ca6877e6526b2 100644 --- a/lib/internal/Magento/Framework/Mail/MessageInterface.php +++ b/lib/internal/Magento/Framework/Mail/MessageInterface.php @@ -96,4 +96,11 @@ public function setReplyTo($replyToAddress); * @return $this */ public function setMessageType($type); + + /** + * Get message source code + * + * @return string + */ + public function getRawMessage(); } diff --git a/lib/internal/Magento/Framework/Mail/Transport.php b/lib/internal/Magento/Framework/Mail/Transport.php index e8890ed2f94d4..e68513f337bec 100644 --- a/lib/internal/Magento/Framework/Mail/Transport.php +++ b/lib/internal/Magento/Framework/Mail/Transport.php @@ -6,9 +6,15 @@ */ namespace Magento\Framework\Mail; +use Zend\Mail\Message; +use Zend\Mail\Transport\Sendmail; -class Transport extends \Zend\Mail\Transport\Sendmail implements \Magento\Framework\Mail\TransportInterface +class Transport implements \Magento\Framework\Mail\TransportInterface { + /** + * @var Sendmail + */ + private $zendTransport; /** * @var \Magento\Framework\Mail\MessageInterface */ @@ -21,10 +27,7 @@ class Transport extends \Zend\Mail\Transport\Sendmail implements \Magento\Framew */ public function __construct(\Magento\Framework\Mail\MessageInterface $message, $parameters = null) { - if (!$message instanceof \Zend\Mail\Message) { - throw new \InvalidArgumentException('The message should be an instance of \Zend\Mail\Message'); - } - parent::__construct($parameters); + $this->zendTransport = new Sendmail($parameters); $this->_message = $message; } @@ -37,7 +40,9 @@ public function __construct(\Magento\Framework\Mail\MessageInterface $message, $ public function sendMessage() { try { - parent::send($this->_message); + $this->zendTransport->send( + Message::fromString($this->_message->getRawMessage()) + ); } catch (\Exception $e) { throw new \Magento\Framework\Exception\MailException(new \Magento\Framework\Phrase($e->getMessage()), $e); } From 0be511c2862fc463d6f09aa353096f3e993ce227 Mon Sep 17 00:00:00 2001 From: Fabian Schmengler Date: Sun, 19 Mar 2017 00:26:00 +0000 Subject: [PATCH 6/9] Remove conflicting class imports --- lib/internal/Magento/Framework/Mail/Transport.php | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/internal/Magento/Framework/Mail/Transport.php b/lib/internal/Magento/Framework/Mail/Transport.php index e68513f337bec..be54b8e5ad1f1 100644 --- a/lib/internal/Magento/Framework/Mail/Transport.php +++ b/lib/internal/Magento/Framework/Mail/Transport.php @@ -6,13 +6,10 @@ */ namespace Magento\Framework\Mail; -use Zend\Mail\Message; -use Zend\Mail\Transport\Sendmail; - class Transport implements \Magento\Framework\Mail\TransportInterface { /** - * @var Sendmail + * @var \Zend\Mail\Transport\Sendmail */ private $zendTransport; /** @@ -27,7 +24,7 @@ class Transport implements \Magento\Framework\Mail\TransportInterface */ public function __construct(\Magento\Framework\Mail\MessageInterface $message, $parameters = null) { - $this->zendTransport = new Sendmail($parameters); + $this->zendTransport = new \Zend\Mail\Transport\Sendmail($parameters); $this->_message = $message; } @@ -41,7 +38,7 @@ public function sendMessage() { try { $this->zendTransport->send( - Message::fromString($this->_message->getRawMessage()) + \Zend\Mail\Message::fromString($this->_message->getRawMessage()) ); } catch (\Exception $e) { throw new \Magento\Framework\Exception\MailException(new \Magento\Framework\Phrase($e->getMessage()), $e); From 00bc4177c79c06e277d61a0129d5626bb433e79c Mon Sep 17 00:00:00 2001 From: Fabian Schmengler Date: Sun, 19 Mar 2017 00:33:21 +0000 Subject: [PATCH 7/9] Fix integration test and code style issues --- .../Magento/Wishlist/Controller/IndexTest.php | 2 +- .../Magento/Framework/Mail/Message.php | 33 +++++++++++++++++++ .../Unit/Template/TransportBuilderTest.php | 2 -- .../Magento/Framework/Mail/Transport.php | 7 ++-- 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/dev/tests/integration/testsuite/Magento/Wishlist/Controller/IndexTest.php b/dev/tests/integration/testsuite/Magento/Wishlist/Controller/IndexTest.php index cbc933d509642..2892c4114f84d 100644 --- a/dev/tests/integration/testsuite/Magento/Wishlist/Controller/IndexTest.php +++ b/dev/tests/integration/testsuite/Magento/Wishlist/Controller/IndexTest.php @@ -158,7 +158,7 @@ public function testSendAction() ); $actualResult = \Zend_Mime_Decode::decodeQuotedPrintable( - $transportBuilder->getSentMessage()->getBodyHtml()->getContent() + $transportBuilder->getSentMessage()->getRawMessage() ); $this->assertStringMatchesFormat( diff --git a/lib/internal/Magento/Framework/Mail/Message.php b/lib/internal/Magento/Framework/Mail/Message.php index e8e66ff988952..207945813dad1 100644 --- a/lib/internal/Magento/Framework/Mail/Message.php +++ b/lib/internal/Magento/Framework/Mail/Message.php @@ -64,52 +64,85 @@ public function setBody($body) return $this; } + /** + * @param string $subject + * @return $this + */ public function setSubject($subject) { $this->zendMessage->setSubject($subject); return $this; } + /** + * @return null|string + */ public function getSubject() { return $this->zendMessage->getSubject(); } + /** + * @return object + */ public function getBody() { return $this->zendMessage->getBody(); } + /** + * @param array|string $fromAddress + * @return $this + */ public function setFrom($fromAddress) { $this->zendMessage->setFrom($fromAddress); return $this; } + /** + * @param array|string $toAddress + * @return $this + */ public function addTo($toAddress) { $this->zendMessage->addTo($toAddress); return $this; } + /** + * @param array|string $ccAddress + * @return $this + */ public function addCc($ccAddress) { $this->zendMessage->addCc($ccAddress); return $this; } + /** + * @param array|string $bccAddress + * @return $this + */ public function addBcc($bccAddress) { $this->zendMessage->addBcc($bccAddress); return $this; } + /** + * @param array|string $replyToAddress + * @return $this + */ public function setReplyTo($replyToAddress) { $this->zendMessage->setReplyTo($replyToAddress); return $this; } + /** + * @return string + */ public function getRawMessage() { return $this->zendMessage->toString(); diff --git a/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderTest.php b/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderTest.php index fafbad24331fe..548359180a538 100644 --- a/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderTest.php +++ b/lib/internal/Magento/Framework/Mail/Test/Unit/Template/TransportBuilderTest.php @@ -7,7 +7,6 @@ use Magento\Framework\App\TemplateTypesInterface; use Magento\Framework\Mail\MessageInterface; -use Zend\Mail\Headers; class TransportBuilderTest extends \PHPUnit_Framework_TestCase { @@ -54,7 +53,6 @@ protected function setUp() $objectManagerHelper = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this); $this->templateFactoryMock = $this->getMock(\Magento\Framework\Mail\Template\FactoryInterface::class); $this->messageMock = $this->getMock(\Magento\Framework\Mail\Message::class); - $this->messageMock->method('getHeaders')->willReturn(new Headers()); $this->objectManagerMock = $this->getMock(\Magento\Framework\ObjectManagerInterface::class); $this->senderResolverMock = $this->getMock(\Magento\Framework\Mail\Template\SenderResolverInterface::class); $this->mailTransportFactoryMock = $this->getMockBuilder( diff --git a/lib/internal/Magento/Framework/Mail/Transport.php b/lib/internal/Magento/Framework/Mail/Transport.php index be54b8e5ad1f1..96dd5f9c741a9 100644 --- a/lib/internal/Magento/Framework/Mail/Transport.php +++ b/lib/internal/Magento/Framework/Mail/Transport.php @@ -12,10 +12,11 @@ class Transport implements \Magento\Framework\Mail\TransportInterface * @var \Zend\Mail\Transport\Sendmail */ private $zendTransport; + /** * @var \Magento\Framework\Mail\MessageInterface */ - protected $_message; + private $message; /** * @param MessageInterface $message @@ -25,7 +26,7 @@ class Transport implements \Magento\Framework\Mail\TransportInterface public function __construct(\Magento\Framework\Mail\MessageInterface $message, $parameters = null) { $this->zendTransport = new \Zend\Mail\Transport\Sendmail($parameters); - $this->_message = $message; + $this->message = $message; } /** @@ -38,7 +39,7 @@ public function sendMessage() { try { $this->zendTransport->send( - \Zend\Mail\Message::fromString($this->_message->getRawMessage()) + \Zend\Mail\Message::fromString($this->message->getRawMessage()) ); } catch (\Exception $e) { throw new \Magento\Framework\Exception\MailException(new \Magento\Framework\Phrase($e->getMessage()), $e); From e02e28d10385bb6a34b74295430fa48a2f63fe84 Mon Sep 17 00:00:00 2001 From: Fabian Schmengler Date: Sun, 19 Mar 2017 00:45:44 +0000 Subject: [PATCH 8/9] Remove redundant unit test The transport now can take any implementation of the message interface as argument --- .../Framework/Mail/Test/Unit/TransportTest.php | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/lib/internal/Magento/Framework/Mail/Test/Unit/TransportTest.php b/lib/internal/Magento/Framework/Mail/Test/Unit/TransportTest.php index d7336e4be478e..02a54142c957d 100644 --- a/lib/internal/Magento/Framework/Mail/Test/Unit/TransportTest.php +++ b/lib/internal/Magento/Framework/Mail/Test/Unit/TransportTest.php @@ -5,21 +5,8 @@ */ namespace Magento\Framework\Mail\Test\Unit; -use Zend\Mail\Headers; - class TransportTest extends \PHPUnit_Framework_TestCase { - /** - * @expectedException \InvalidArgumentException - * @expectedExceptionMessage The message should be an instance of \Zend\Mail\Message - */ - public function testTransportWithIncorrectMessageObject() - { - new \Magento\Framework\Mail\Transport( - $this->getMock(\Magento\Framework\Mail\MessageInterface::class) - ); - } - /** * @covers \Magento\Framework\Mail\Transport::sendMessage * @expectedException \Magento\Framework\Exception\MailException From b7186fc7833f56530461c586281d1099558d7aa0 Mon Sep 17 00:00:00 2001 From: Oleksii Korshenko Date: Thu, 6 Jul 2017 16:34:17 -0500 Subject: [PATCH 9/9] MAGETWO-67680: Replace Zend_Mail (ZF1) with Zend\Mail (ZF2) #8608 - updated composer.lock file --- composer.lock | 121 ++++++++++++++++++++++++++------------------------ 1 file changed, 63 insertions(+), 58 deletions(-) diff --git a/composer.lock b/composer.lock index d248f8dec2c62..ca47fe4bbb2c3 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "36aef861e85e9529c55d9b2d2910bd44", + "content-hash": "ef3db62dd163eb8ffe9085e10041e6e5", "packages": [ { "name": "braintree/braintree_php", @@ -1479,16 +1479,16 @@ }, { "name": "symfony/console", - "version": "v2.8.22", + "version": "v2.8.24", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "3ef6ef64abecd566d551d9e7f6393ac6e93b2462" + "reference": "46e65f8d98c9ab629bbfcc16a4ff023f61c37fb2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/3ef6ef64abecd566d551d9e7f6393ac6e93b2462", - "reference": "3ef6ef64abecd566d551d9e7f6393ac6e93b2462", + "url": "https://api.github.com/repos/symfony/console/zipball/46e65f8d98c9ab629bbfcc16a4ff023f61c37fb2", + "reference": "46e65f8d98c9ab629bbfcc16a4ff023f61c37fb2", "shasum": "" }, "require": { @@ -1536,7 +1536,7 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2017-06-02T14:36:56+00:00" + "time": "2017-07-03T08:04:30+00:00" }, { "name": "symfony/debug", @@ -1597,7 +1597,7 @@ }, { "name": "symfony/event-dispatcher", - "version": "v2.8.22", + "version": "v2.8.24", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", @@ -1657,16 +1657,16 @@ }, { "name": "symfony/filesystem", - "version": "v3.3.2", + "version": "v3.3.4", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "c709670bf64721202ddbe4162846f250735842c0" + "reference": "311fa718389efbd8b627c272b9324a62437018cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/c709670bf64721202ddbe4162846f250735842c0", - "reference": "c709670bf64721202ddbe4162846f250735842c0", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/311fa718389efbd8b627c272b9324a62437018cc", + "reference": "311fa718389efbd8b627c272b9324a62437018cc", "shasum": "" }, "require": { @@ -1702,11 +1702,11 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2017-05-28T14:08:56+00:00" + "time": "2017-06-24T09:29:48+00:00" }, { "name": "symfony/finder", - "version": "v3.3.2", + "version": "v3.3.4", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", @@ -1814,16 +1814,16 @@ }, { "name": "symfony/process", - "version": "v2.8.22", + "version": "v2.8.24", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "d54232f5682fda2f8bbebff7c81b864646867ab9" + "reference": "57e52a0a6a80ea0aec4fc1b785a7920a95cb88a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/d54232f5682fda2f8bbebff7c81b864646867ab9", - "reference": "d54232f5682fda2f8bbebff7c81b864646867ab9", + "url": "https://api.github.com/repos/symfony/process/zipball/57e52a0a6a80ea0aec4fc1b785a7920a95cb88a8", + "reference": "57e52a0a6a80ea0aec4fc1b785a7920a95cb88a8", "shasum": "" }, "require": { @@ -1859,7 +1859,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2017-05-08T01:19:21+00:00" + "time": "2017-07-03T08:04:30+00:00" }, { "name": "tedivm/jshrink", @@ -2962,41 +2962,47 @@ }, { "name": "zendframework/zend-mail", - "version": "2.4.11", + "version": "2.8.0", "source": { "type": "git", "url": "https://github.com/zendframework/zend-mail.git", - "reference": "c1c73d7f44b3e815e955cd59b822954ca7a92a77" + "reference": "248230940ab1453b2a532a8fde76c5a6470d7aad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-mail/zipball/c1c73d7f44b3e815e955cd59b822954ca7a92a77", - "reference": "c1c73d7f44b3e815e955cd59b822954ca7a92a77", + "url": "https://api.github.com/repos/zendframework/zend-mail/zipball/248230940ab1453b2a532a8fde76c5a6470d7aad", + "reference": "248230940ab1453b2a532a8fde76c5a6470d7aad", "shasum": "" }, "require": { - "php": ">=5.3.23", - "zendframework/zend-crypt": "~2.4.0", - "zendframework/zend-loader": "~2.4.0", - "zendframework/zend-mime": "~2.4.0", - "zendframework/zend-stdlib": "~2.4.0", - "zendframework/zend-validator": "~2.4.0" + "ext-iconv": "*", + "php": "^7.0 || ^5.6", + "zendframework/zend-loader": "^2.5", + "zendframework/zend-mime": "^2.5", + "zendframework/zend-stdlib": "^2.7 || ^3.0", + "zendframework/zend-validator": "^2.6" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", - "zendframework/zend-config": "~2.4.0", - "zendframework/zend-servicemanager": "~2.4.0" + "phpunit/phpunit": "^6.0.8 || ^5.7.15", + "zendframework/zend-coding-standard": "~1.0.0", + "zendframework/zend-config": "^2.6", + "zendframework/zend-crypt": "^2.6", + "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3" }, "suggest": { - "zendframework/zend-servicemanager": "Zend\\ServiceManager component" + "ext-intl": "Handle IDN in AddressList hostnames", + "zendframework/zend-crypt": "Crammd5 support in SMTP Auth", + "zendframework/zend-servicemanager": "^2.7.5 || ^3.0.3 when using SMTP to deliver messages" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.4-dev", - "dev-develop": "2.5-dev" + "dev-master": "2.8-dev", + "dev-develop": "2.9-dev" + }, + "zf": { + "component": "Zend\\Mail", + "config-provider": "Zend\\Mail\\ConfigProvider" } }, "autoload": { @@ -3014,7 +3020,7 @@ "mail", "zf2" ], - "time": "2016-12-19 22:35:29" + "time": "2017-06-08T20:03:58+00:00" }, { "name": "zendframework/zend-math", @@ -3068,27 +3074,26 @@ }, { "name": "zendframework/zend-mime", - "version": "2.4.11", + "version": "2.6.1", "source": { "type": "git", "url": "https://github.com/zendframework/zend-mime.git", - "reference": "df81ca9f94f0d1cd31175b8d2df6002b61dd5973" + "reference": "9e53a97a3c190d45cc5d584daaaf487d509a9285" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zendframework/zend-mime/zipball/df81ca9f94f0d1cd31175b8d2df6002b61dd5973", - "reference": "df81ca9f94f0d1cd31175b8d2df6002b61dd5973", + "url": "https://api.github.com/repos/zendframework/zend-mime/zipball/9e53a97a3c190d45cc5d584daaaf487d509a9285", + "reference": "9e53a97a3c190d45cc5d584daaaf487d509a9285", "shasum": "" }, "require": { - "php": ">=5.3.23", - "zendframework/zend-stdlib": "self.version" + "php": "^5.5 || ^7.0", + "zendframework/zend-stdlib": "^2.7 || ^3.0" }, "require-dev": { - "fabpot/php-cs-fixer": "1.7.*", - "phpunit/phpunit": "~4.0", - "satooshi/php-coveralls": "dev-master", - "zendframework/zend-mail": "self.version" + "phpunit/phpunit": "^4.7 || ^5.7", + "zendframework/zend-coding-standard": "~1.0.0", + "zendframework/zend-mail": "^2.6" }, "suggest": { "zendframework/zend-mail": "Zend\\Mail component" @@ -3096,8 +3101,8 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.4-dev", - "dev-develop": "2.5-dev" + "dev-master": "2.6-dev", + "dev-develop": "2.7-dev" } }, "autoload": { @@ -3114,7 +3119,7 @@ "mime", "zf2" ], - "time": "2015-05-07 16:53:42" + "time": "2017-01-16T16:43:38+00:00" }, { "name": "zendframework/zend-modulemanager", @@ -5051,7 +5056,7 @@ }, { "name": "symfony/config", - "version": "v3.2.9", + "version": "v3.2.11", "source": { "type": "git", "url": "https://github.com/symfony/config.git", @@ -5443,7 +5448,7 @@ }, { "name": "symfony/stopwatch", - "version": "v3.3.2", + "version": "v3.3.4", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", @@ -5492,7 +5497,7 @@ }, { "name": "symfony/yaml", - "version": "v2.8.22", + "version": "v2.8.24", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", @@ -5541,16 +5546,16 @@ }, { "name": "theseer/fdomdocument", - "version": "1.6.5", + "version": "1.6.6", "source": { "type": "git", "url": "https://github.com/theseer/fDOMDocument.git", - "reference": "8dcfd392135a5bd938c3c83ea71419501ad9855d" + "reference": "6e8203e40a32a9c770bcb62fe37e68b948da6dca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/fDOMDocument/zipball/8dcfd392135a5bd938c3c83ea71419501ad9855d", - "reference": "8dcfd392135a5bd938c3c83ea71419501ad9855d", + "url": "https://api.github.com/repos/theseer/fDOMDocument/zipball/6e8203e40a32a9c770bcb62fe37e68b948da6dca", + "reference": "6e8203e40a32a9c770bcb62fe37e68b948da6dca", "shasum": "" }, "require": { @@ -5577,7 +5582,7 @@ ], "description": "The classes contained within this repository extend the standard DOM to use exceptions at all occasions of errors instead of PHP warnings or notices. They also add various custom methods and shortcuts for convenience and to simplify the usage of DOM.", "homepage": "https://github.com/theseer/fDOMDocument", - "time": "2017-04-21T14:50:31+00:00" + "time": "2017-06-30T11:53:12+00:00" } ], "aliases": [],