如何在Symfony邮件中嵌入图片?

3

我设计了一个重置密码系统的电子邮件模板。

在邮件模板中,有图片(标志)。

我将这些图像放在一个名为Email_Images的文件夹中,该文件夹放置在Public文件夹内!

首先,我尝试使用Asset()twig函数链接这些图像,像这样:

<img alt="logo 1" src="{{asset('Email_Images/1.png')}}" />
<img alt="logo 2" src="{{asset('Email_Images/2.jpg')}}" />

但它们都不起作用。因此,我尝试在控制器中获取图像并将其发送到模板,如下所示:

 $email = (new TemplatedEmail())
        ->from(new Address('myEmail@gmail.com', 'My Subject'))
        ->to($user->getEmail())
        ->subject('Your password reset request');

        $img= $email ->embed(fopen('Email_Images/1.jpg', 'r'), 'img');

        $email->htmlTemplate('reset_password/email.html.twig')
        ->context([
            'resetToken' => $resetToken,

            'img' => $img,

            'tokenLifetime' => $this->resetPasswordHelper->getTokenLifetime(),
        ]);

在我的模板中我实现了

<img alt="logo 1" src="{{ img }}" />

我遇到了以下错误:

在模板渲染过程中抛出了异常(“可捕获的致命错误:无法将类 Symfony\Bridge\Twig\Mime\TemplatedEmail 的对象转换为字符串”)。

如何正确地在邮件中添加/嵌入图像?

3个回答

4

不要在控制器中获取图像并将它们发送到Twig页面,可以采用以下方式:

首先,定义Twig命名空间(例如称为img),指向存储图像的文件夹。 在本例中,该文件夹名为Email_Images

将以下行添加到config/packages/twig.yaml文件中:

twig:
    # ...

    paths:
        # point this wherever your images live
        '%kernel.project_dir%/public/Email_Images': img

现在您可以使用email.image()Twig函数将图像嵌入电子邮件中。
<img src="{{ email.image('@img/1.png') }}" alt="Logo">

但是这不会生成一个像 C:\dev\myawesomeproject\public\Email_Images\1.png 这样的 URL 吗?那么它将是一个本地路径?如果您将这些电子邮件发送给没有在完全相同路径中拥有该图像的用户,则此解决方案将无法正常工作。或者我理解错了吗? - Fabian Schmick
1
不,它不会生成那个URL,但是它使用语法cid:引用图像Symfony文档 - Dhia Djobbi

2
{{ asset('Email_Images/1.png') }}将生成一个相对URL,如/Email_Images/1.png。但是对于电子邮件,您需要一个绝对URL,可以像这样生成:<img src="{{ absolute_url(asset('Email_Images/1.png')) }}"/>。因为电子邮件不知道您的域名。
此外,我建议您配置以下参数(如果您也要通过控制台命令发送电子邮件)。
router.request_context.host:     example.com    # your domain
router.request_context.scheme:   http           # your scheme http or https
asset.request_context.base_path: '%router.request_context.base_url%'
asset.request_context.secure:    true

即使使用了absolute_url()函数并在services.yaml中设置了这些参数,它仍然无法正常工作。 - user12555687
图片是否只是没有出现,还是除了404错误之外还有其他错误?如果在浏览器中调用生成的URL会发生什么?如果在浏览器中调用正确的URL会发生什么?它们有何区别?您使用哪个程序来阅读电子邮件? - Fabian Schmick
我正在我的Gmail帐户上收到/阅读这些电子邮件。 我做了<h1> {{ absolute_url(asset('Email_Images/1.png')) }} </h1>来查看它返回了什么... 结果是http://127.0.0.1:8000/Email_Images/1.png - user12555687
我明白了,看一下这个解释https://dev59.com/EGEi5IYBdhLWcg3w6f2e#20837071,为什么这不起作用。我建议您在本地开发中使用[mailhog](https://github.com/mailhog/MailHog)来测试电子邮件。 - Fabian Schmick

0
个人而言,我会从网站和 cron 任务发送电子邮件。对于从网站发送的电子邮件,使用 absolute_url(asset(...)) 是可以的,但是 cron 任务不知道您的域名。
因此,为了简化事情,我的技巧是将域名定义为 .env 变量,然后:
.env 文件中:
DOMAIN_NAME=https://mywebsite.com

config/package/twig.yaml

twig:
    ...
    globals:
        DOMAIN_NAME: '%env(DOMAIN_NAME)%'

templates/emails/reset-password.email.twig (或 base.email.twig)

<img src="{{ DOMAIN_NAME ~ asset('images/logo.jpg') }}" alt="logo">

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接