我正在从事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所以我这里是转储的屏幕截图,其中图片标记是
我在这里缺少什么?我需要做些什么才能显示图像。
答案 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]
我希望这个解释可以帮到你。