Symfony - невозможно добавить изображение в электронное письмо

Я работаю над заданием cron и пытаюсь отправить электронное письмо с помощью SwiftMailer

Внутри хрон 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, так что я здесь - скриншот дампа, где тег изображения

Что мне здесь не хватает? Что мне нужно сделать, чтобы получить изображения для отображения.

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.

Официальная PHP-документация &: для того, чтобы иметь возможность напрямую изменять элементы массива внутри цикла $value с &, В этом случае значение будет присвоено по ссылке.

Итак, в цикле я заменяю пути изображения из вашего массива на каждый base64 кодификация. Таким образом, вам не нужно ничего менять в вашем коде, ваш массив имеет тот же размер, что и раньше, но вместо того, чтобы иметь пути к изображениям в массиве... у вас есть изображения, декодированные в base64 в этих позициях массива, Более подробная информация о & в официальной документации PHP

Взгляните (base64 по тегу img) [ https://en.wikipedia.org/wiki/Data_URI_scheme]

Я хотел бы, чтобы это объяснение могло помочь вам.

Другие вопросы по тегам