Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Giehl <stefan@matomo.org>2020-05-14 10:52:48 +0300
committerGitHub <noreply@github.com>2020-05-14 10:52:48 +0300
commit0187b71729484a9f173d978239ff0a3cb37a5d7b (patch)
tree770d517a1268808f85abe291371b84b03a0b3d14 /plugins/ScheduledReports
parentfb1be4d50ad1f5c3c2c2915fc42caf1f4fd31a2d (diff)
Replace Zend Mail with PHPMailer (#15891)
* require composer package phpmailer/phpmailer * change mail class to use phpmailer instead of Zend_Mail * removes Zend_Mail and Zend_Mime * submodule * fix tests * enable smtp debug for test mail command * fix embedded images * set language for phpmailer * apply some review feedback * removes Zend_Validate (#15907) * don't inline file without cid * submodule update * fix test * decouples Mail class from PHPMailer and moves sending mails to new transport layer * submodule * cleanup * unset xmailer header * simplify mail attachment handling * adds methods to add bcc recipients * change implementation of setReplyTo
Diffstat (limited to 'plugins/ScheduledReports')
-rw-r--r--plugins/ScheduledReports/ReportEmailGenerator.php17
-rw-r--r--plugins/ScheduledReports/ReportEmailGenerator/AttachedFileReportEmailGenerator.php5
-rw-r--r--plugins/ScheduledReports/ReportEmailGenerator/HtmlReportEmailGenerator.php2
-rw-r--r--plugins/ScheduledReports/ScheduledReports.php5
-rw-r--r--plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/AttachedFileReportEmailGeneratorTest.php72
-rw-r--r--plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/HtmlReportEmailGeneratorTest.php35
-rw-r--r--plugins/ScheduledReports/tests/Integration/ReportEmailGeneratorTest.php75
7 files changed, 119 insertions, 92 deletions
diff --git a/plugins/ScheduledReports/ReportEmailGenerator.php b/plugins/ScheduledReports/ReportEmailGenerator.php
index 117d624654..d51f9df098 100644
--- a/plugins/ScheduledReports/ReportEmailGenerator.php
+++ b/plugins/ScheduledReports/ReportEmailGenerator.php
@@ -10,8 +10,6 @@
namespace Piwik\Plugins\ScheduledReports;
use Piwik\Mail;
-use Piwik\Piwik;
-use Zend_Mime;
abstract class ReportEmailGenerator
{
@@ -22,23 +20,18 @@ abstract class ReportEmailGenerator
$mail->setSubject($report->getReportDescription());
if (!empty($customReplyTo)) {
- $mail->setReplyTo($customReplyTo['email'], $customReplyTo['login']);
+ $mail->addReplyTo($customReplyTo['email'], $customReplyTo['login']);
}
$this->configureEmail($mail, $report);
foreach ($report->getAdditionalFiles() as $additionalFile) {
- $fileContent = $additionalFile['content'];
- $at = $mail->createAttachment(
- $fileContent,
+ $mail->addAttachment(
+ $additionalFile['content'],
$additionalFile['mimeType'],
- Zend_Mime::DISPOSITION_INLINE,
- $additionalFile['encoding'],
- $additionalFile['filename']
+ $additionalFile['filename'],
+ $additionalFile['cid'] ?? null
);
- $at->id = $additionalFile['cid'];
-
- unset($fileContent);
}
return $mail;
diff --git a/plugins/ScheduledReports/ReportEmailGenerator/AttachedFileReportEmailGenerator.php b/plugins/ScheduledReports/ReportEmailGenerator/AttachedFileReportEmailGenerator.php
index db8d8e61c2..c4494e5a03 100644
--- a/plugins/ScheduledReports/ReportEmailGenerator/AttachedFileReportEmailGenerator.php
+++ b/plugins/ScheduledReports/ReportEmailGenerator/AttachedFileReportEmailGenerator.php
@@ -16,7 +16,6 @@ use Piwik\Plugins\ScheduledReports\ReportEmailGenerator;
use Piwik\ReportRenderer\Html;
use Piwik\SettingsPiwik;
use Piwik\View;
-use Zend_Mime;
class AttachedFileReportEmailGenerator extends ReportEmailGenerator
{
@@ -47,11 +46,9 @@ class AttachedFileReportEmailGenerator extends ReportEmailGenerator
$message = $this->getMessageBody($report);
$mail->setBodyHtml($message);
- $mail->createAttachment(
+ $mail->addAttachment(
$report->getContents(),
$this->attachedFileMimeType,
- Zend_Mime::DISPOSITION_INLINE,
- Zend_Mime::ENCODING_BASE64,
$report->getReportDescription() . $this->attachedFileExtension
);
}
diff --git a/plugins/ScheduledReports/ReportEmailGenerator/HtmlReportEmailGenerator.php b/plugins/ScheduledReports/ReportEmailGenerator/HtmlReportEmailGenerator.php
index 1038d47288..bf77e79222 100644
--- a/plugins/ScheduledReports/ReportEmailGenerator/HtmlReportEmailGenerator.php
+++ b/plugins/ScheduledReports/ReportEmailGenerator/HtmlReportEmailGenerator.php
@@ -12,14 +12,12 @@ namespace Piwik\Plugins\ScheduledReports\ReportEmailGenerator;
use Piwik\Mail;
use Piwik\Plugins\ScheduledReports\GeneratedReport;
use Piwik\Plugins\ScheduledReports\ReportEmailGenerator;
-use Zend_Mime;
class HtmlReportEmailGenerator extends ReportEmailGenerator
{
protected function configureEmail(Mail $mail, GeneratedReport $report)
{
// Needed when using images as attachment with cid
- $mail->setType(Zend_Mime::MULTIPART_RELATED);
$mail->setBodyHtml($report->getContents());
}
} \ No newline at end of file
diff --git a/plugins/ScheduledReports/ScheduledReports.php b/plugins/ScheduledReports/ScheduledReports.php
index a3a5e228ae..a2c62b2700 100644
--- a/plugins/ScheduledReports/ScheduledReports.php
+++ b/plugins/ScheduledReports/ScheduledReports.php
@@ -356,9 +356,6 @@ class ScheduledReports extends \Piwik\Plugin
$textContent = $mail->getBodyText();
$htmlContent = $mail->getBodyHtml();
- if ($htmlContent instanceof \Zend_Mime_Part) {
- $htmlContent = $htmlContent->getRawContent();
- }
foreach ($emails as $email) {
if (empty($email)) {
@@ -391,7 +388,7 @@ class ScheduledReports extends \Piwik\Plugin
". Error was '" . $e->getMessage() . "'");
}
}
- $mail->clearRecipients();
+ $mail->clearAllRecipients();
}
}
diff --git a/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/AttachedFileReportEmailGeneratorTest.php b/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/AttachedFileReportEmailGeneratorTest.php
index b46866fe9f..623fa75eb8 100644
--- a/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/AttachedFileReportEmailGeneratorTest.php
+++ b/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/AttachedFileReportEmailGeneratorTest.php
@@ -10,6 +10,7 @@
namespace Piwik\Plugins\ScheduledReports\tests\Integration\ReportEmailGenerator;
+use PHPMailer\PHPMailer\PHPMailer;
use Piwik\Mail;
use Piwik\Plugins\ScheduledReports\GeneratedReport;
use Piwik\Plugins\ScheduledReports\ReportEmailGenerator\AttachedFileReportEmailGenerator;
@@ -17,6 +18,11 @@ use Piwik\Tests\Framework\Fixture;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
use Piwik\Plugins\SegmentEditor\API as APISegmentEditor;
+/**
+ * @group AttachedFileReportEmailGeneratorTest
+ * @group ScheduledReports
+ * @group Plugins
+ */
class AttachedFileReportEmailGeneratorTest extends IntegrationTestCase
{
/**
@@ -24,6 +30,11 @@ class AttachedFileReportEmailGeneratorTest extends IntegrationTestCase
*/
private $testInstance;
+ /**
+ * @var PHPMailer
+ */
+ private $mail;
+
public function setUp(): void
{
parent::setUp();
@@ -52,30 +63,27 @@ class AttachedFileReportEmailGeneratorTest extends IntegrationTestCase
$mail = $this->testInstance->makeEmail($generatedReport);
$mailContent = $this->getMailContent($mail);
- $this->assertStringStartsWith('<html', $mail->getBodyHtml()->getContent());
+ $this->assertStringStartsWith('<html', $mail->getBodyHtml());
$this->assertEquals('General_Report report - pretty date', $mail->getSubject());
self::assertStringContainsString('ScheduledReports_PleaseFindAttachedFile', $mailContent);
self::assertStringContainsString('ScheduledReports_SentFromX', $mailContent);
- $this->assertEquals('Content-Type: text/html; charset=utf-8
+ $this->assertStringContainsString("Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable
-Content-Disposition: inline
-', $mail->getBodyHtml()->getHeaders());
-
- $parts = array_map(function (\Zend_Mime_Part $part) {
- return [
- 'content' => $part->getContent(),
- 'headers' => $part->getHeaders(),
- ];
- }, $mail->getParts());
+", $this->mail->createBody());
+
+ $attachments = $this->mail->getAttachments();
$this->assertEquals([
[
- 'content' => 'cmVwb3J0IGNvbnRlbnRz',
- 'headers' => 'Content-Type: generic/thing
-Content-Transfer-Encoding: base64
-Content-Disposition: inline; filename="General_Report report - pretty date.thing"
-',
+ 'report contents',
+ 'General_Report report - pretty date.thing',
+ 'General_Report report - pretty date.thing',
+ 'base64',
+ 'generic/thing',
+ true,
+ 'attachment',
+ 0
],
- ], $parts);
+ ], $attachments);
}
public function test_makeEmail_OmitsSentFrom_IfPiwikUrlDoesNotExist()
@@ -101,10 +109,9 @@ Content-Disposition: inline; filename="General_Report report - pretty date.thing
$this->assertStringStartsWith('<html', $mailContent);
self::assertStringContainsString('ScheduledReports_PleaseFindAttachedFile', $mailContent);
- $this->assertEquals('Content-Type: text/html; charset=utf-8
+ $this->assertStringContainsString("Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable
-Content-Disposition: inline
-', $mail->getBodyHtml()->getHeaders());
+", $this->mail->createBody());
}
public function test_makeEmail_AddsSegmentInformation_IfReportIsForSavedSegment()
@@ -131,16 +138,31 @@ Content-Disposition: inline
$this->assertStringStartsWith('<html', $mailContent);
self::assertStringContainsString("ScheduledReports_PleaseFindAttachedFile", $mailContent);
- self::assertStringContainsString('ScheduledReports_SentFromX=', $mailContent);
+ self::assertStringContainsString('ScheduledReports_SentFromX', $mailContent);
self::assertStringContainsString('ScheduledReports_CustomVisitorSegment', $mailContent);
- $this->assertEquals('Content-Type: text/html; charset=utf-8
+ $this->assertStringContainsString("Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable
-Content-Disposition: inline
-', $mail->getBodyHtml()->getHeaders());
+", $this->mail->createBody());
}
private function getMailContent(Mail $mail)
{
- return str_replace("=\n", '', $mail->getBodyHtml()->getContent());
+ $mail->addTo('noreply@localhost');
+ $mail->send();
+ return $mail->getBodyHtml();
}
+
+
+ public function provideContainerConfig()
+ {
+ return [
+ 'observers.global' => \DI\add([
+ ['Test.Mail.send', function (PHPMailer $mail) {
+ $this->mail = $mail;
+ $this->mail->preSend();
+ }],
+ ]),
+ ];
+ }
+
} \ No newline at end of file
diff --git a/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/HtmlReportEmailGeneratorTest.php b/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/HtmlReportEmailGeneratorTest.php
index c5e3817002..55c44383a3 100644
--- a/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/HtmlReportEmailGeneratorTest.php
+++ b/plugins/ScheduledReports/tests/Integration/ReportEmailGenerator/HtmlReportEmailGeneratorTest.php
@@ -9,11 +9,14 @@
namespace Piwik\Plugins\ScheduledReports\tests\Integration\ReportEmailGenerator;
+use PHPMailer\PHPMailer\PHPMailer;
use Piwik\Plugins\ScheduledReports\GeneratedReport;
use Piwik\Plugins\ScheduledReports\ReportEmailGenerator\HtmlReportEmailGenerator;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
-use Zend_Mime;
+/**
+ * @group HtmlReportEmailGeneratorTest
+ */
class HtmlReportEmailGeneratorTest extends IntegrationTestCase
{
/**
@@ -21,6 +24,11 @@ class HtmlReportEmailGeneratorTest extends IntegrationTestCase
*/
private $testInstance;
+ /**
+ * @var PHPMailer
+ */
+ private $mail;
+
public function setUp(): void
{
parent::setUp();
@@ -42,13 +50,24 @@ class HtmlReportEmailGeneratorTest extends IntegrationTestCase
);
$mail = $this->testInstance->makeEmail($generatedReport);
+ $mail->addTo('noreply@localhost');
+ $mail->send();
- $this->assertEquals('General_Report report - pretty date', $mail->getSubject());
- $this->assertEquals(Zend_Mime::MULTIPART_RELATED, $mail->getType());
- $this->assertEquals('report contents', $mail->getBodyHtml()->getContent());
- $this->assertEquals('Content-Type: text/html; charset=utf-8
-Content-Transfer-Encoding: quoted-printable
-Content-Disposition: inline
-', $mail->getBodyHtml()->getHeaders());
+ $this->assertEquals('General_Report report - pretty date', $this->mail->Subject);
+ $this->assertEquals(PHPMailer::CONTENT_TYPE_MULTIPART_ALTERNATIVE, $this->mail->ContentType);
+ $this->assertEquals('report contents', $this->mail->Body);
+ }
+
+
+ public function provideContainerConfig()
+ {
+ return [
+ 'observers.global' => \DI\add([
+ ['Test.Mail.send', function (PHPMailer $mail) {
+ $this->mail = $mail;
+ $this->mail->preSend();
+ }],
+ ]),
+ ];
}
}
diff --git a/plugins/ScheduledReports/tests/Integration/ReportEmailGeneratorTest.php b/plugins/ScheduledReports/tests/Integration/ReportEmailGeneratorTest.php
index 72d557c265..dad7af3b85 100644
--- a/plugins/ScheduledReports/tests/Integration/ReportEmailGeneratorTest.php
+++ b/plugins/ScheduledReports/tests/Integration/ReportEmailGeneratorTest.php
@@ -15,6 +15,7 @@
namespace Piwik\Plugins\ScheduledReports\tests\Integration;
+use PHPMailer\PHPMailer\PHPMailer;
use Piwik\Mail;
use Piwik\Plugins\ScheduledReports\GeneratedReport;
use Piwik\Plugins\ScheduledReports\ReportEmailGenerator;
@@ -28,7 +29,11 @@ class TestReportEmailGenerator extends ReportEmailGenerator
}
}
-
+/**
+ * @group ReportEmailGeneratorTest
+ * @group ScheduledReports
+ * @group Plugins
+ */
class ReportEmailGeneratorTest extends IntegrationTestCase
{
/**
@@ -36,6 +41,11 @@ class ReportEmailGeneratorTest extends IntegrationTestCase
*/
private $testInstance;
+ /**
+ * @var PHPMailer
+ */
+ private $mail;
+
public function setUp(): void
{
parent::setUp();
@@ -55,17 +65,14 @@ class ReportEmailGeneratorTest extends IntegrationTestCase
[
[
'mimeType' => 'mimetype1',
- 'encoding' => 'utf-8',
'content' => 'content 1',
'filename' => 'file1.txt',
- 'cid' => 'cid1',
],
[
+ 'cid' => 'file1',
'mimeType' => 'mimetype2',
- 'encoding' => 'utf-8',
'content' => 'content 2',
'filename' => 'file2.txt',
- 'cid' => 'cid2',
],
]
);
@@ -74,30 +81,21 @@ class ReportEmailGeneratorTest extends IntegrationTestCase
$this->assertEquals('General_Report report - pretty date', $mail->getSubject());
- $parts = array_map(function (\Zend_Mime_Part $part) {
- return [
- 'content' => $part->getContent(),
- 'headers' => $part->getHeaders(),
- ];
- }, $mail->getParts());
+ $attachments = $mail->getAttachments();
$this->assertEquals([
[
'content' => 'content 1',
- 'headers' => 'Content-Type: mimetype1
-Content-Transfer-Encoding: utf-8
-Content-ID: <cid1>
-Content-Disposition: inline; filename="file1.txt"
-',
+ 'filename' => 'file1.txt',
+ 'mimetype' => 'mimetype1',
+ 'cid' => null
],
[
'content' => 'content 2',
- 'headers' => 'Content-Type: mimetype2
-Content-Transfer-Encoding: utf-8
-Content-ID: <cid2>
-Content-Disposition: inline; filename="file2.txt"
-',
+ 'filename' => 'file2.txt',
+ 'mimetype' => 'mimetype2',
+ 'cid' => 'file1'
],
- ], $parts);
+ ], $attachments);
}
public function test_makeEmail_UsesCustomReplyTo_IfSupplied()
@@ -116,22 +114,25 @@ Content-Disposition: inline; filename="file2.txt"
'email' => 'test@testytesterson.com',
'login' => 'test person',
]);
+ $mail->send();
$this->assertEquals('General_Report report - pretty date', $mail->getSubject());
- $this->assertEquals('test@testytesterson.com', $mail->getReplyTo());
- $this->assertEquals([
- 'From' => [
- 0 => 'TagManager_MatomoTagName <noreply@localhost>',
- 'append' => true,
- ],
- 'Subject' => [
- 0 => 'General_Report report - pretty date',
- ],
- 'Reply-To' => [
- 0 => 'test person <test@testytesterson.com>',
- 'append' => true,
- ],
- ], $mail->getHeaders());
- $this->assertEquals([], $mail->getParts());
+ $this->assertEquals(['test@testytesterson.com'], array_keys($mail->getReplyTos()));
+ $header = $this->mail->createHeader();
+ $this->assertStringContainsString('From: TagManager_MatomoTagName <noreply@', $header);
+ $this->assertStringContainsString('Reply-To: test person <test@testytesterson.com>', $header);
+ $this->assertEquals([], $mail->getAttachments());
+ }
+
+
+ public function provideContainerConfig()
+ {
+ return [
+ 'observers.global' => \DI\add([
+ ['Test.Mail.send', function (PHPMailer $mail) {
+ $this->mail = $mail;
+ }],
+ ]),
+ ];
}
}