diff options
author | Christoph Wurst <ChristophWurst@users.noreply.github.com> | 2022-11-11 11:23:29 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-11-11 11:23:29 +0300 |
commit | 64802a768ea8e04db6573ba96e24ad332b48e882 (patch) | |
tree | e58aa07d2e5cdb4b3e224946c1efd6a21929812f | |
parent | db04014d66ae347e21bcf3d486c800ba92597468 (diff) | |
parent | 3ff4e52949e63fdf43ea2ef51c2a1948553a6c9d (diff) |
Merge pull request #7576 from nextcloud/backport/7575/stable2.1stable2.1
[stable2.1] Fix broken encoding for outgoing messages
-rw-r--r-- | lib/Service/MimeMessage.php | 4 | ||||
-rw-r--r-- | tests/Unit/Service/MailTransmissionTest.php | 2 | ||||
-rw-r--r-- | tests/Unit/Service/MimeMessageTest.php | 43 | ||||
-rw-r--r-- | tests/data/mime-html-greek.txt | 11 |
4 files changed, 57 insertions, 3 deletions
diff --git a/lib/Service/MimeMessage.php b/lib/Service/MimeMessage.php index a2ea1e211..cd7a1eac1 100644 --- a/lib/Service/MimeMessage.php +++ b/lib/Service/MimeMessage.php @@ -46,7 +46,7 @@ class MimeMessage { public function build(bool $isHtml, string $content, array $attachments): Horde_Mime_Part { if ($isHtml) { $doc = new DOMDocument(); - $doc->loadHTML($content, LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED); + $doc->loadHTML(mb_convert_encoding($content, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED); $images = $doc->getElementsByTagName('img'); $imageParts = []; @@ -84,7 +84,7 @@ class MimeMessage { $image->setAttribute('src', 'cid:' . $cid); } - $htmlContent = $doc->saveHTML(); + $htmlContent = $doc->saveHTML($doc->documentElement); $textContent = Horde_Text_Filter::filter($htmlContent, 'Html2text', ['callback' => [$this, 'htmlToTextCallback']]); $alternativePart = new Horde_Mime_Part(); diff --git a/tests/Unit/Service/MailTransmissionTest.php b/tests/Unit/Service/MailTransmissionTest.php index 5490a1d07..cd7295e50 100644 --- a/tests/Unit/Service/MailTransmissionTest.php +++ b/tests/Unit/Service/MailTransmissionTest.php @@ -514,7 +514,7 @@ class MailTransmissionTest extends TestCase { * the expected result is to have an img element with src="cid:123" and * another part for the attachment with Content-Type: image/png */ - $this->assertStringContainsString('img src="cid:', $rawMessage); + $this->assertStringContainsString('img src=3D"cid:', $rawMessage); $this->assertStringContainsString('Content-Type: image/png', $rawMessage); $this->assertStringContainsString('Content-Disposition: inline', $rawMessage); } diff --git a/tests/Unit/Service/MimeMessageTest.php b/tests/Unit/Service/MimeMessageTest.php index 10214a1eb..d7d2d6204 100644 --- a/tests/Unit/Service/MimeMessageTest.php +++ b/tests/Unit/Service/MimeMessageTest.php @@ -210,6 +210,49 @@ class MimeMessageTest extends TestCase { $this->assertEquals('attachment', $attachmentPart2->getDisposition()); } + public function testMultipartAlternativeGreek() { + $messageData = new NewMessageData( + $this->account, + new AddressList(), + new AddressList(), + new AddressList(), + 'Text and HTML message', + file_get_contents(__DIR__ . '/../../../tests/data/mime-html-greek.txt'), + [], + true, + false + ); + + $part = $this->mimeMessage->build( + $messageData->isHtml(), + $messageData->getBody(), + [], + ); + + $this->assertEquals('multipart/alternative', $part->getType()); + + /** @var Horde_Mime_Part[] $subParts */ + $subParts = $part->getParts(); + $this->assertCount(2, $subParts); + + $this->assertEquals('text/plain', $subParts[0]->getType()); + $this->assertEquals('text/html', $subParts[1]->getType()); + + $this->assertStringContainsString( + "Όλοι οι άνθρωποι γεννιούνται ελεύθεροι +και ίσοι στην αξιοπρέπεια και τα +δικαιώματα. Είναι προικισμένοι με λογική +και συνείδηση, και οφείλουν να +συμπεριφέρονται μεταξύ τους με πνεύμα +αδελφοσύνης.", + $subParts[0]->getContents(), + ); + $this->assertStringContainsString( + 'Όλοι οι άνθρωποι γεννιούνται ελεύθεροι και ίσοι στην αξιοπρέπεια και τα δικαιώματα. Είναι προικισμένοι με λογική και συνείδηση, και οφείλουν να συμπεριφέρονται μεταξύ τους με πνεύμα αδελφοσύνης.', + $subParts[1]->getContents() + ); + } + /** * OCA\Mail\Model\Message::createAttachmentDetails * diff --git a/tests/data/mime-html-greek.txt b/tests/data/mime-html-greek.txt new file mode 100644 index 000000000..a4287b7bc --- /dev/null +++ b/tests/data/mime-html-greek.txt @@ -0,0 +1,11 @@ +<html> +<head> + <meta http-equiv="content-type" content="text/html; charset=UTF-8"> +</head> +<body> + <p>Hello,</p> + <p>Όλοι οι άνθρωποι γεννιούνται ελεύθεροι και ίσοι στην αξιοπρέπεια και τα δικαιώματα. Είναι προικισμένοι με λογική και συνείδηση, και οφείλουν να συμπεριφέρονται μεταξύ τους με πνεύμα αδελφοσύνης.</p> + <p>Greetings!</p> + <p>Bob</p> +</body> +</html> |