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->line('Bla bla <strong>something strong</strong> 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->line('Bla bla **something strong** bla');
Bla bla 某种强大的东西 bla
【讨论】:
以上是关于Laravel 5.3 将 html 添加到 MailMessage->line的主要内容,如果未能解决你的问题,请参考以下文章