如何在Laravel 5.3的新通知服务生成的电子邮件中添加图片?

23

Laravel 5.3 引入了一个叫做 notifications 的新服务,它允许通过简单的流畅语法构建电子邮件(及其他通知):

    return (new MailMessage)
            ->greeting('Hello!')
            ->line('One of your invoices has been paid!')
            ->action('View Invoice', $url)
            ->line('Thank you for using our application!');

如何在电子邮件通知中添加图片的简洁方法?我已经发布了供应商文件以修改基本模板。

我的想法是:

  • Illuminate\Notifications\Messages\SimpleMessage扩展为一个新的本地类,类似于SimpleMediaMessage,并添加一些额外的方法(例如:->image(src, url, alt)
  • 修改基本模板(或创建特定于SimpleMediaMessage的模板),循环遍历通过->image构建的媒体数组
  • 最后,注册一个自定义渠道,允许使用图片发送通知。

对于像在电子邮件中添加图片这样简单的事情,这似乎太复杂了。我漏掉了什么吗?是否有更好的方法?

编辑说明:

当我提到图片时,我指的是消息本身可见的横幅和跟踪图片(而不是作为单独附件)。

附加的图片显示了a)目前可以实现的内容,以及b)我正在寻找的内容。

enter image description here

第二次编辑:

重新阅读目前已发布的答案,特别是@Erics的回答,我发现只需要简单修改模板,您实际上可以做到以下几点:

->line("<img src='foo.example/bar.jpg' />")

需要修改模板以允许不安全的标记:

// Note this is in two spots - intro + outro
{{ $line }} --> becomes --> {!! $line !!} 

该方法的缺点:

  1. 可能会存在安全问题,这也是使用{{}}而不是{!!!!}的原因
  2. 图片无法利用内联样式,除非你在邮件模板之外进行操作,例如:

    ->line(" < img style='max-width:570px;/* 为了使图像在电子邮件中显示良好的所有其他垃圾 */' src='foo.example.bar.jpg' /> ")

3个回答

12

你想要以什么方式附加?在电子邮件中,您可以引用完整路径并将其以典型的HTML格式添加到视图中:

<img src="http://yoursite.com/path/to/image.png">

如果您想将其作为真正的文件附件,请在MailMessage上使用->attach()attachData方法。这些通常用于PDF或文档附件之类的东西。

如果您想在源中附加并引用该附件,则需要像您提到的那样扩展该类,或回退到Laravel的Mail::send方法。

由于通知系统旨在简单且具有倾向性,我想他们想要涵盖常见情况,而使用完整路径来引用图像比引用cid:style要简单得多。


很好的提醒 - 我已经在原始问题中添加了一个示例图像。完整路径是我们的意图 - 我的理解是这样可以为各种邮件客户端提供最佳覆盖范围。同意有主见的观点,这很好,但我收到(并打算发送)的大多数交易电子邮件都依赖于图像来传达部分信息 - 主要是因为电子邮件客户端功能非常有限。 - Chris
1
谢谢@Eric。只想指出,虽然这个方法可行,但你需要稍微修改模板为{!! !!}而不是{{ }}。这是否有风险取决于你和你的项目。 - Chris
@Eric,看起来你精通Laravel。我需要你的帮助。请看这里:http://stackoverflow.com/questions/41887504/how-to-solve-missing-argument-1-for-app-repositories-favoriterepositorydelete/41887543 - moses toh

0

正如您在Mail/resources/html/layout.blade.php中所看到的,Laravel使用Markdown标记:

{{ Illuminate\Mail\Markdown::parse($slot) }}

因此,您可以使用以下代码格式插入图像:line()方法:

->line('![your_text](https://image_address);


0

如果您不想修改模板,但想包含一张图片(或其他任意的HTML),您可以使用HtmlString 助手

use Illuminate\Support\HtmlString;

[...]

return (new MailMessage)
   ->line(new HtmlString('<img src="https://example.com/image.webp">'));

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