Symfony - 无法在电子邮件中添加图片

时间:2016-05-24 12:15:07

标签: php symfony swiftmailer

我正在从事cron工作并尝试使用SwiftMailer发送电子邮件

在cron Action内部我使用foreach循环遍历循环并向用户发送电子邮件。

foreach($hostDinners as $key => $hostDinner) {
    //generate email
$message = \Swift_Message::newInstance()
    ->setSubject("This is a demo subject")
    ->setFrom($this->container->getParameter('mailer_user'))
    ->setTo($key)

    ->setBody(
        $this->renderView(
            'AppBundle:emails:cron-job-request-and-invitations.html.twig',
            array(
            'dinners' => $hostDinner
            )
        )
    )
    ->setContentType('text/html');
$this->get('mailer')->send($message);


}

然后我将数组传递到电子邮件模板,在电子邮件中我再次使用循环显示电子邮件内容。除了我无法显示图像外,一切正常。

{% for dinner in dinners %}
<img style="display: block;" src="{{ absolute_url(asset('uploads/' ~ dinner.guest_profile_image)) }}" alt="image1" class="section-img" height="auto" width="128">
{% endfor %}

更新

当我转储图像变量dinner.guest_profile_image时,这就是我得到的http://127.0.0.1:8000/uploads/42c5681b253c4dc6a1d145f744e6c3cd.jpeg,如果我直接在浏览器上访问它,我可以看到我需要显示电子邮件的图像。

$message转储非常庞大,因为其中有很多css和html所以我这里是转储的屏幕截图,其中图片标记是

enter image description here

我在这里缺少什么?我需要做些什么才能显示图像。

1 个答案:

答案 0 :(得分:1)

尝试使用asset_url

<img style="display: block;" src="{{ asset_url('uploads/' ~ dinner.guest_profile_image) }}" alt="...">

或者您可以尝试在base64中嵌入图片,如下所示:

<img style="display: block;" src="data:image/png;base64,iVBORw0KG....(this represent the base64 of your image)..." alt="..."/>

更新1

foreach($hostDinners as $key => $hostDinner) {

    //Encode img in base64
    foreach ($hostDinner as &$item) {
        $path = $item['guest_profile_image']; //use symfony2 functions to get the abs upload path
        $type = pathinfo($path, PATHINFO_EXTENSION);
        $data = file_get_contents($path);
        $item["guest_profile_image"] = 'data:image/' . $type . ';base64,' . base64_encode($data);
    }
    unset($item); // break the reference with the last element

    //generate email
    $message = \Swift_Message::newInstance()
        ->setSubject("This is a demo subject")
        ->setFrom($this->container->getParameter('mailer_user'))
        ->setTo($key)

        ->setBody(
            $this->renderView(
                'AppBundle:emails:cron-job-request-and-invitations.html.twig',
                array(
                'dinners' => $hostDinner
                )
            )
        )
        ->setContentType('text/html');
    $this->get('mailer')->send($message);
}

并在视图中:

{% for dinner in dinners %}
      <img style="display: block;" src="{{ dinner.guest_profile_image }}" alt="image..." class="section-img" height="auto" width="128"/>
{% endfor %}

更新2

在这一行$item["guest_profile_image"] = 'data:image/' . $type . ';base64,' . base64_encode($data);中,您需要将所有内容放入src标记的属性img中(您可以在视图中看到我只打印打印数组的内容src="{{ dinner.guest_profile_image }}")。 alt属性用于html的良好做法,但不一定是alt attribute

&amp; 的官方PHP文档:为了能够使用$value&之前直接修改循环中的数组元素。在这种情况下,该值将通过引用分配。

所以,在循环中,我正在将数组中的图像路径替换为每个base64编码。通过这种方式,您不必修改代码中的任何内容,您的数组具有与之前相同的大小,但不是在数组中使用图像路径...您可以在base64中对数组中的图像进行解码。 有关&amp;的更多信息在Oficial php documentation

看看(img标签上的base64)[https://en.wikipedia.org/wiki/Data_URI_scheme]

我希望这个解释可以帮到你。