From 941ea7c8e4e7688edf2e58f95762601fa21a25ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20K=C5=99ehula?= Date: Thu, 9 Oct 2025 14:37:52 +0200 Subject: [PATCH] Support absolute paths in setHTMLBody for automatic CID embedding --- src/Mail/Message.php | 4 +- .../Mail.textualAndHtmlBody.embedded.expect3 | 43 +++++++++++++++++++ .../Mail.textualAndHtmlBody.embedded.phpt | 22 +++++++++- 3 files changed, 65 insertions(+), 4 deletions(-) create mode 100644 tests/Mail/Mail.textualAndHtmlBody.embedded.expect3 diff --git a/src/Mail/Message.php b/src/Mail/Message.php index 60dc5e5..3479053 100644 --- a/src/Mail/Message.php +++ b/src/Mail/Message.php @@ -207,13 +207,13 @@ public function setHtmlBody(string $html, ?string $basePath = null): static |]*\s background\s*=\s* |<[^<>]+\s style\s*=\s* ["\'][^"\'>]+[:\s] url\( |]*>[^<]+ [:\s] url\() - (["\']?)(?![a-z]+:|[/\#])([^"\'>)\s]+) + (["\']?)(?![a-z]+:|[\#])([^"\'>)\s]+) |\[\[ ([\w()+./@~-]+) \]\] #ix', captureOffset: true, ); foreach (array_reverse($matches) as $m) { - $file = rtrim($basePath, '/\\') . '/' . (isset($m[4]) ? $m[4][0] : urldecode($m[3][0])); + $file = rtrim($basePath, '/\\') . '/' . ltrim(isset($m[4]) ? $m[4][0] : urldecode($m[3][0]), '/\\'); if (!isset($cids[$file])) { $cids[$file] = substr($this->addEmbeddedFile($file)->getHeader('Content-ID'), 1, -1); } diff --git a/tests/Mail/Mail.textualAndHtmlBody.embedded.expect3 b/tests/Mail/Mail.textualAndHtmlBody.embedded.expect3 new file mode 100644 index 0000000..c9a5f30 --- /dev/null +++ b/tests/Mail/Mail.textualAndHtmlBody.embedded.expect3 @@ -0,0 +1,43 @@ +MIME-Version: 1.0 +X-Mailer: Nette Framework +Date: %a% +From: John Doe +To: Lady Jane +Subject: Hello Jane! +Message-ID: <%S%@%S%> +Content-Type: multipart/alternative; + boundary="--------%S%" + +----------%S% +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 7bit + +Sample text +----------%S% +Content-Type: multipart/related; + boundary="--------%S%" + +----------%S% +Content-Type: text/html; charset=UTF-8 +Content-Transfer-Encoding: 7bit + + + +
+ + cid:%S% + +----------%S% +Content-Type: image/png +Content-Transfer-Encoding: base64 +Content-Disposition: inline; filename="background.png" +Content-ID: <%S%> + +iVBORw0KGgoAAAANSUhEUgAABAAAAAAGCAMAAABq1Ry/AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ +bWFnZVJlYWR5ccllPAAAADlQTFRFIYzeKYzeMZTeOZTeQpTeQpzeSpzeUpzeY6Xee73nhL3nlMbn +nMbnrc7nvdbvxt7v1ufv5+fv7+/vqVk59gAAAKFJREFUeNrsmMEKgzAQRHcTq63WJPr/H9ska4vQ +2rOG5+CEgT0JPiYrqiKiJue723Afp+ccQlqWFSHUtqQCQCoFVF0BwCMDYI4p8XUQal3269ubAeB7 +A0CI1gBWDMMattIA1BBQAdC9G0DcrgAfVuwPDMOaMHGqtgEo5o8bwDcKiETi1aP4QoDtyQWgtyXg +bgdwzIDfxeBfYphhhk81/BJgAHfwneqeqMofAAAAAElFTkSuQmCC +----------%S%-- +----------%S%-- diff --git a/tests/Mail/Mail.textualAndHtmlBody.embedded.phpt b/tests/Mail/Mail.textualAndHtmlBody.embedded.phpt index 1aee377..a6179dc 100644 --- a/tests/Mail/Mail.textualAndHtmlBody.embedded.phpt +++ b/tests/Mail/Mail.textualAndHtmlBody.embedded.phpt @@ -38,8 +38,6 @@ $mailer->send($mail); Assert::matchFile(__DIR__ . '/Mail.textualAndHtmlBody.embedded.expect', TestMailer::$output); - - $mail = new Message; $mail->setHTMLBody(" some link @@ -53,3 +51,23 @@ $mailer = new TestMailer; $mailer->send($mail); Assert::matchFile(__DIR__ . '/Mail.textualAndHtmlBody.embedded2.expect', TestMailer::$output); + +$mail = new Message; + +$mail->setFrom('John Doe '); +$mail->addTo('Lady Jane '); +$mail->setSubject('Hello Jane!'); + +$mail->setBody('Sample text'); +$mail->setHTMLBody(' + + +
+ + [[background.png]] +', __DIR__ . '/fixtures'); +// append automatically $mail->addEmbeddedFile('files/background.png'); + +$mailer = new TestMailer; +$mailer->send($mail); +Assert::matchFile(__DIR__ . '/Mail.textualAndHtmlBody.embedded.expect3', $mailer::$output);