【问题标题】:How to embed images in a symfony mail?如何在 symfony 邮件中嵌入图像?
【发布时间】:2020-11-14 02:11:23
【问题描述】:

所以我为我的重置密码系统设计了一个电子邮件模板。 在电子邮件模板中,有图片(徽标)。

我将这些图像放在名为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 无法转换为 字符串")。

在电子邮件中添加/嵌入图像的正确方法是什么?

【问题讨论】:

    标签: php symfony symfony4 symfony-mailer


    【解决方案1】:

    而不是在控制器中获取图像并将它们发送到树枝页面。 你可以这样做:

    首先,定义一个指向存储图像的文件夹的 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。那么这将是一条本地路径吗?如果您将这些电子邮件发送给在完全相同的路径中没有图像的用户,则此解决方案将不起作用。还是我错了?
    • 不,它不会生成该 URL,但它使用语法 cid: Symfony documentation 引用图像
    【解决方案2】:

    {{ asset('Email_Images/1.png') }} 将生成一个相对 URL,例如 /Email_Images/1.png。但是对于电子邮件,您需要一个绝对 URL,您可以像 &lt;img src="{{ absolute_url(asset('Email_Images/1.png')) }}"/&gt; 这样生成它。因为电子邮件不知道您的域名。

    此外,我建议您配置以下parameters(如果您也打算通过控制台命令发送电子邮件):

    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 中设置了这些参数之后。还是不行。
    • 图像根本没有出现,或者除了 404 之外还有其他错误吗?如果你在浏览器中调用生成的 url 会发生什么?如果您在浏览器中调用正确的 URL,会发生什么?他们如何区分?您使用哪个程序来阅读您的电子邮件?
    • 我正在通过我的 Gmail 帐户接收/阅读这些电子邮件。我也做了&lt;h1&gt; {{ absolute_url(asset('Email_Images/1.png')) }} &lt;/h1&gt; 看看它返回什么.. 结果是127.0.0.1:8000/Email_Images/1.png
    • 我明白了,看看stackoverflow.com/a/20837071/5947371为什么这不起作用的解释。我建议您使用mailhog 进行本地开发来测试电子邮件。
    【解决方案3】:

    就个人而言,我从网站发送电子邮件和从 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">
    

    【讨论】:

      猜你喜欢
      • 2018-12-24
      • 2012-01-17
      • 2010-12-23
      • 2017-07-19
      • 2017-02-09
      • 2010-09-11
      • 2013-11-27
      • 2012-02-10
      相关资源
      最近更新 更多