diff --git a/src/Symfony/Bridge/Twig/CHANGELOG.md b/src/Symfony/Bridge/Twig/CHANGELOG.md index 8029cb4e4a464..d6d929cb50ed6 100644 --- a/src/Symfony/Bridge/Twig/CHANGELOG.md +++ b/src/Symfony/Bridge/Twig/CHANGELOG.md @@ -8,6 +8,7 @@ CHANGELOG * Add `field_id()` Twig form helper function * Add a `Twig` constraint that validates Twig templates * Make `lint:twig` collect all deprecations instead of stopping at the first one + * Add `name` argument to `email.image` to override the attachment file name being set as the file path 7.2 --- diff --git a/src/Symfony/Bridge/Twig/Mime/WrappedTemplatedEmail.php b/src/Symfony/Bridge/Twig/Mime/WrappedTemplatedEmail.php index a327e94b3321e..1feedc20370bb 100644 --- a/src/Symfony/Bridge/Twig/Mime/WrappedTemplatedEmail.php +++ b/src/Symfony/Bridge/Twig/Mime/WrappedTemplatedEmail.php @@ -39,14 +39,16 @@ public function toName(): string * some Twig namespace for email images (e.g. '@email/images/logo.png'). * @param string|null $contentType The media type (i.e. MIME type) of the image file (e.g. 'image/png'). * Some email clients require this to display embedded images. + * @param string|null $name A custom file name that overrides the original name (filepath) of the image */ - public function image(string $image, ?string $contentType = null): string + public function image(string $image, ?string $contentType = null, ?string $name = null): string { $file = $this->twig->getLoader()->getSourceContext($image); $body = $file->getPath() ? new File($file->getPath()) : $file->getCode(); - $this->message->addPart((new DataPart($body, $image, $contentType))->asInline()); + $name = $name ?: $image; + $this->message->addPart((new DataPart($body, $name, $contentType))->asInline()); - return 'cid:'.$image; + return 'cid:'.$name; } /** diff --git a/src/Symfony/Bridge/Twig/Tests/Fixtures/assets/images/logo1.png b/src/Symfony/Bridge/Twig/Tests/Fixtures/assets/images/logo1.png new file mode 100644 index 0000000000000..519ab7c691ba9 Binary files /dev/null and b/src/Symfony/Bridge/Twig/Tests/Fixtures/assets/images/logo1.png differ diff --git a/src/Symfony/Bridge/Twig/Tests/Fixtures/assets/images/logo2.png b/src/Symfony/Bridge/Twig/Tests/Fixtures/assets/images/logo2.png new file mode 120000 index 0000000000000..e9f523cbd5b31 --- /dev/null +++ b/src/Symfony/Bridge/Twig/Tests/Fixtures/assets/images/logo2.png @@ -0,0 +1 @@ +logo1.png \ No newline at end of file diff --git a/src/Symfony/Bridge/Twig/Tests/Fixtures/templates/email/attach.html.twig b/src/Symfony/Bridge/Twig/Tests/Fixtures/templates/email/attach.html.twig new file mode 100644 index 0000000000000..e70e32fbcb757 --- /dev/null +++ b/src/Symfony/Bridge/Twig/Tests/Fixtures/templates/email/attach.html.twig @@ -0,0 +1,3 @@ +

Attachments

+{{ email.attach('@assets/images/logo1.png') }} +{{ email.attach('@assets/images/logo2.png', name='image.png') }} diff --git a/src/Symfony/Bridge/Twig/Tests/Fixtures/templates/email/image.html.twig b/src/Symfony/Bridge/Twig/Tests/Fixtures/templates/email/image.html.twig new file mode 100644 index 0000000000000..074edf4c91b2f --- /dev/null +++ b/src/Symfony/Bridge/Twig/Tests/Fixtures/templates/email/image.html.twig @@ -0,0 +1,2 @@ + + diff --git a/src/Symfony/Bridge/Twig/Tests/Mime/WrappedTemplatedEmailTest.php b/src/Symfony/Bridge/Twig/Tests/Mime/WrappedTemplatedEmailTest.php new file mode 100644 index 0000000000000..db8d6bef71ea3 --- /dev/null +++ b/src/Symfony/Bridge/Twig/Tests/Mime/WrappedTemplatedEmailTest.php @@ -0,0 +1,103 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Bridge\Twig\Tests\Mime; + +use PHPUnit\Framework\TestCase; +use Symfony\Bridge\Twig\Mime\BodyRenderer; +use Symfony\Bridge\Twig\Mime\TemplatedEmail; +use Twig\Environment; +use Twig\Error\LoaderError; +use Twig\Loader\FilesystemLoader; + +/** + * @author Alexander Hofbauer buildEmail('email/image.html.twig'); + $body = $email->toString(); + $contentId1 = $email->getAttachments()[0]->getContentId(); + $contentId2 = $email->getAttachments()[1]->getContentId(); + + $part1 = str_replace("\n", "\r\n", + << + Content-Type: image/png; name="$contentId1" + Content-Transfer-Encoding: base64 + Content-Disposition: inline; + name="$contentId1"; + filename="@assets/images/logo1.png" + + PART + ); + + $part2 = str_replace("\n", "\r\n", + << + Content-Type: image/png; name="$contentId2" + Content-Transfer-Encoding: base64 + Content-Disposition: inline; + name="$contentId2"; filename=image.png + + PART + ); + + self::assertStringContainsString('![](cid:@assets/images/logo1.png)![](cid:image.png)', $body); + self::assertStringContainsString($part1, $body); + self::assertStringContainsString($part2, $body); + } + + public function testEmailAttach() + { + $email = $this->buildEmail('email/attach.html.twig'); + $body = $email->toString(); + + $part1 = str_replace("\n", "\r\n", + <<from('a.hofbauer@fify.at') + ->htmlTemplate($template); + + $loader = new FilesystemLoader(\dirname(__DIR__).'/Fixtures/templates/'); + $loader->addPath(\dirname(__DIR__).'/Fixtures/assets', 'assets'); + + $environment = new Environment($loader); + $renderer = new BodyRenderer($environment); + $renderer->render($email); + + return $email; + } +}