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

github.com/nextcloud/mail.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph Wurst <ChristophWurst@users.noreply.github.com>2022-11-11 11:23:29 +0300
committerGitHub <noreply@github.com>2022-11-11 11:23:29 +0300
commit64802a768ea8e04db6573ba96e24ad332b48e882 (patch)
treee58aa07d2e5cdb4b3e224946c1efd6a21929812f
parentdb04014d66ae347e21bcf3d486c800ba92597468 (diff)
parent3ff4e52949e63fdf43ea2ef51c2a1948553a6c9d (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.php4
-rw-r--r--tests/Unit/Service/MailTransmissionTest.php2
-rw-r--r--tests/Unit/Service/MimeMessageTest.php43
-rw-r--r--tests/data/mime-html-greek.txt11
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>