使用 Symfony Mailer 在 Twig 的模板化电子邮件中嵌入 Webpack 资产
Embedding a Webpack asset inside Twig's templated e-mail using Symfony Mailer
Symfony's mailer documentation 表示可以轻松嵌入图像:
<img
src="{{ email.image('@images/logo.png') }}"
alt="Logo">
但是我的所有资产都是由 Webpack 和 Encore 构建的。我也使用资产清单文件,因为每个资产的名称中都有一个 chunkhash。
在这种情况下如何使用 Twig 嵌入图像?我试过了:
<img
src="{{ email.image(asset('build/images/logo.png')) }}"
alt="Logo">
但这行不通。我最终得到一个例外 "a template is missing"。如果我使用来自静态位置的图像,这当然很有效。
有两种方法可以在您的邮件中获取图片。第一个是嵌入图像,第二个只是网络上某处图像的 link。如果您想嵌入图片,您必须将图片附加到您的邮件中:
$attachment = Swift_Image::newInstance($data, $filename, $mimeType)
->setDisposition('inline');
$cid = $message->embed($attachment); // Generates "cid:something"
重要的是要像这样展示你的形象:
<img src="cid:something" ... />
所以你必须像这样渲染你的模板:
$twig->render('email/email.html.twig', [
'cid' => $cid,
...
]);
在你的树枝模板中:
<img src="{{ cid }}" ... />
如文档所述:定义一个 Twig 命名空间,指向存储图像的任何目录,例如:
# config/packages/twig.yaml
twig:
paths:
# point this wherever your images live
public/build/: build
接下来,在您的电子邮件模板中:
{# '@build/' refers to the Twig namespace defined earlier #}
<img src="{{ email.image('@build/logo.png') }}" alt="Logo">
<img src="{{ email.image('@build/subdir/logo.png') }}" alt="Logo">
如果构建的图像有一些随机后缀,这将不起作用,例如当 .enableVersioning()
在 webpack.config.js
配置文件中定义时。
如果您启用了版本控制策略,您可以执行以下操作:
# config/packages/twig.yaml
twig:
paths:
public/: public
并使用字符串连接运算符构建模板名称 ~
:
{# '@public' refers to the Twig namespace defined earlier #}
<img src="{{ email.image('@public' ~ asset('build/logo.png')) }}" alt="Logo">
Symfony's mailer documentation 表示可以轻松嵌入图像:
<img
src="{{ email.image('@images/logo.png') }}"
alt="Logo">
但是我的所有资产都是由 Webpack 和 Encore 构建的。我也使用资产清单文件,因为每个资产的名称中都有一个 chunkhash。
在这种情况下如何使用 Twig 嵌入图像?我试过了:
<img
src="{{ email.image(asset('build/images/logo.png')) }}"
alt="Logo">
但这行不通。我最终得到一个例外 "a template is missing"。如果我使用来自静态位置的图像,这当然很有效。
有两种方法可以在您的邮件中获取图片。第一个是嵌入图像,第二个只是网络上某处图像的 link。如果您想嵌入图片,您必须将图片附加到您的邮件中:
$attachment = Swift_Image::newInstance($data, $filename, $mimeType)
->setDisposition('inline');
$cid = $message->embed($attachment); // Generates "cid:something"
重要的是要像这样展示你的形象:
<img src="cid:something" ... />
所以你必须像这样渲染你的模板:
$twig->render('email/email.html.twig', [
'cid' => $cid,
...
]);
在你的树枝模板中:
<img src="{{ cid }}" ... />
如文档所述:定义一个 Twig 命名空间,指向存储图像的任何目录,例如:
# config/packages/twig.yaml
twig:
paths:
# point this wherever your images live
public/build/: build
接下来,在您的电子邮件模板中:
{# '@build/' refers to the Twig namespace defined earlier #}
<img src="{{ email.image('@build/logo.png') }}" alt="Logo">
<img src="{{ email.image('@build/subdir/logo.png') }}" alt="Logo">
如果构建的图像有一些随机后缀,这将不起作用,例如当 .enableVersioning()
在 webpack.config.js
配置文件中定义时。
如果您启用了版本控制策略,您可以执行以下操作:
# config/packages/twig.yaml
twig:
paths:
public/: public
并使用字符串连接运算符构建模板名称 ~
:
{# '@public' refers to the Twig namespace defined earlier #}
<img src="{{ email.image('@public' ~ asset('build/logo.png')) }}" alt="Logo">