diff options
author | Daniel Kesselberg <mail@danielkesselberg.de> | 2022-08-23 23:57:12 +0300 |
---|---|---|
committer | Daniel Kesselberg <mail@danielkesselberg.de> | 2022-09-02 16:02:46 +0300 |
commit | 50ad334480d4b260ceeefc20b523de89f9878220 (patch) | |
tree | e0e8d0444ae1c53ee1aa2ab6348118e41f1c0273 /lib/Service/MailTransmission.php | |
parent | 2df77810de01a42ad21fdb57a28a83eeeeed0068 (diff) |
Create a multipart/related message for html, text and inline images
Signed-off-by: Daniel Kesselberg <mail@danielkesselberg.de>
Diffstat (limited to 'lib/Service/MailTransmission.php')
-rw-r--r-- | lib/Service/MailTransmission.php | 81 |
1 files changed, 8 insertions, 73 deletions
diff --git a/lib/Service/MailTransmission.php b/lib/Service/MailTransmission.php index 79c65bcd8..73b50c8c1 100644 --- a/lib/Service/MailTransmission.php +++ b/lib/Service/MailTransmission.php @@ -38,8 +38,6 @@ use Horde_Mime_Headers_MessageId; use Horde_Mime_Headers_Subject; use Horde_Mime_Mail; use Horde_Mime_Mdn; -use Horde_Mime_Part; -use Horde_Text_Filter; use OCA\Mail\Account; use OCA\Mail\Address; use OCA\Mail\AddressList; @@ -59,7 +57,6 @@ use OCA\Mail\Events\MessageSentEvent; use OCA\Mail\Events\SaveDraftEvent; use OCA\Mail\Exception\AttachmentNotFoundException; use OCA\Mail\Exception\ClientException; -use OCA\Mail\Exception\InvalidDataUriException; use OCA\Mail\Exception\SentMailboxNotSetException; use OCA\Mail\Exception\ServiceException; use OCA\Mail\IMAP\IMAPClientFactory; @@ -191,59 +188,16 @@ class MailTransmission implements IMailTransmission { $mail = new Horde_Mime_Mail(); $mail->addHeaders($headers); - if ($messageData->isHtml()) { - $doc = new \DOMDocument(); - $doc->loadHTML($message->getContent(), LIBXML_HTML_NODEFDTD | LIBXML_HTML_NOIMPLIED); - - $uriParser = new DataUriParser(); - - $images = $doc->getElementsByTagName('img'); - for ($i = 0; $i < $images->count(); $i++) { - $image = $images->item($i); - if ($image === null) { - continue; - } - - $src = $image->getAttribute('src'); - if ($src === '') { - continue; - } - - try { - $dataUri = $uriParser->parse($src); - } catch (InvalidDataUriException $e) { - continue; - } - - $part = new Horde_Mime_Part(); - $part->setCharset($dataUri->getParameters()['charset']); - $part->setDisposition('inline'); - $part->setName('embedded_image_' . $i); - $part->setContents($dataUri->getData()); - $part->setType($dataUri->getMediaType()); - if ($dataUri->isBase64()) { - $part->setTransferEncoding('base64'); - } - - $cid = $part->setContentId(); - $mail->addMimePart($part); - - $image->setAttribute('src', 'cid:' . $cid); - } - - $htmlContent = $doc->saveHTML(); - $mail->setHtmlBody($htmlContent, null, false); - $mail->setBody(Horde_Text_Filter::filter($htmlContent, 'Html2text', - ['callback' => [$this, 'htmlToTextCallback']])); - } else { - $mail->setBody($message->getContent()); - } + $mimeMessage = new MimeMessage( + new DataUriParser() + ); - // Append local attachments - foreach ($message->getAttachments() as $attachment) { - $mail->addMimePart($attachment); - } + $mail->setBasePart($mimeMessage->build( + $messageData->isHtml(), + $message->getContent(), + $message->getAttachments() + )); $this->eventDispatcher->dispatchTyped( new BeforeMessageSentEvent($account, $messageData, $repliedToMessageId, $draft, $message, $mail) @@ -326,25 +280,6 @@ class MailTransmission implements IMailTransmission { } /** - * A callback for Horde_Text_Filter. - * - * The purpose of this callback is to overwrite the default behaviour - * of html2text filter to convert <p>Hello</p> => Hello\n\n with - * <p>Hello</p> => Hello\n. - * - * @param \DOMDocument $doc - * @param \DOMNode $node - * @return string|null non-null, add this text to the output and skip further processing of the node. - */ - public function htmlToTextCallback(\DOMDocument $doc, \DOMNode $node) { - if ($node instanceof \DOMElement && strtolower($node->tagName) === 'p') { - return $node->textContent . "\n"; - } - - return null; - } - - /** * @param NewMessageData $message * @param Message|null $previousDraft * |