使用Symfony Mailer将Webpack资产嵌入Twig的模板化电子邮件中

时间:2019-09-21 06:17:35

标签: php symfony twig webpack-encore

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">

但这不起作用。我最后遇到一个例外,即“缺少模板”。如果我从静态位置使用图像,这当然很好。

2 个答案:

答案 0 :(得分:2)

如文档所述:定义一个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

并使用字符串concat运算符~构建模板名称:

{# '@public' refers to the Twig namespace defined earlier #}
<img src="{{ email.image('@public' ~ asset('build/logo.png')) }}" alt="Logo">

答案 1 :(得分:-2)

有两种方法可以在邮件中获取图像。首先是嵌入式图像,其次仅是指向网络某处图像的链接。如果要嵌入图像,则必须将图像附加到邮件中:

$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 }}" ... />