Laravel 5.3 将 html 添加到 MailMessage->line

Posted

技术标签:

【中文标题】Laravel 5.3 将 html 添加到 MailMessage->line【英文标题】:Laravel 5.3 add html to MailMessage->line 【发布时间】:2017-05-08 02:42:29 【问题描述】:

我喜欢使用 MailMessage 在我的邮件正文中添加一些 html 标记,如下所示:

$mailMessage = new MailMessage();
$mailMessage->line(trans('mail.someLine') );

在mail.php中:

'someLine' => 'Bla bla <a href="html://someurl">html://someurl</a>'

但在实际邮件中,整行显示为纯文本。

我尝试使用html_entity_decode,但没有成功:

 $mailMessage->line(html_entity_decode(trans('mail.someLine')));

似乎 line 方法有它自己的编码。有解决办法吗?

ps 邮件的其余部分都有正确的 html,所以这不是重点!

更新: $mailMessage->action 在这种情况下不会执行。假设它也应该适用于这样的事情: $mailMessage-&gt;line('Bla bla &lt;strong&gt;something strong&lt;/strong&gt; bla');

【问题讨论】:

【参考方案1】:

最好使用HtmlString 类。

use Illuminate\Support\HtmlString;

return (new MailMessage)
  ->line(new HtmlString($someHtmlBody));

行将显示为已处理的 HTML 代码。

【讨论】:

完美运行 - 请注意此 HTML 未转义,因此请勿在此处包含用户输入,除非您知道它是安全的。【参考方案2】:

检查 MailMessage/SimpleMessage 代码,我发现不是这些类进行了编码,而是 email.blade.php 模板本身。

将 email.blade.php 中的 $line 部分更改为 !! $line !! 最终成功了。

ps 请确保先运行php artisan vendor:publish,这样您就不需要更改供应商文件夹中的原始email.blade.php!

【讨论】:

【参考方案3】:

那是因为 line 函数不应该包含 html。如果你想传递一个 URL,你应该使用 action 函数。您可能还想自定义您的邮件模板。 查看有关邮件通知的官方文档: https://laravel.com/docs/5.3/notifications#mail-notifications

【讨论】:

【参考方案4】:

尝试添加带有 MailMessage 对象的操作标签。

 $mailMessage
        ->line('Simple mail')
        ->action('Link Title', url('password/reset', $this->token));

【讨论】:

问题是动作会显示一个按钮(我在同一个模板中也需要它,所以我不能为此更改模板)。例如,如果我想要一个强标签中的单词呢? 您可以覆盖 $mailMessage->view() 来定义您的自定义通知视图。 我发现针对特定问题的最佳解决方案是更改 email.blade,但也可以选择覆盖!【参考方案5】:

正如您在 Mail/resources/html/layout.blade.php 中看到的,Laravel 使用 Markdown 表示法:

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

因此您可以使用如下代码格式化字符串(甚至插入图像):

$mailMessage-&gt;line('Bla bla **something strong** bla');

Bla bla 某种强大的东西 bla

【讨论】:

以上是关于Laravel 5.3 将 html 添加到 MailMessage->line的主要内容,如果未能解决你的问题,请参考以下文章

将 Laravel 从 5.3 升级到 5.4

如何使用获取参数将 laravel (5.3) 路由重定向到其他路由

从 URL Laravel 5.3 中删除公共

在 laravel 5.3 中添加 css 和 js 文件

无法将数据从刀片传递到 vue(Laravel 5.3)

升级到 Laravel 5.3 - Mail::send 现在从 Mandrill 返回 null