Octobercms 中的 Mail::send 从 richeditor 中删除 HTML 标签的原因可能是什么?

What can be the reason why Mail::send in Octobercms cuts the HTML tags from richeditor?

我正在使用 Mail::send 服务从联系表发送电子邮件。电子邮件的正文是 HTML,由 richeditor 提供。我有一个模板 'my.plugin::mail.default':

subject = "Overwritten"
==
<p>Hi {{ name }},</p>

{{message_body | raw}}

<p>This email was sent using formatting (HTML)</p>

发送代码如下:

$data=post();
$vars = [
 'subject' => $data['subject'],
 'message_body' =>$data['message'],
 'name'=>'STB '
];
Mail::send('my.plugin::mail.default', $vars, function ($message) use ($vars) {
 $message->to("reciever@email.com");
 $message->subject($vars['subject']);
});

通过这种方式发送的电子邮件具有 HTML 条带化的消息,并且仅发送 第一个标签 (例如:<p>abc<p/>)。

经过多次测试,我发现当 HTML 有换行符 \n (如下面的 var $html )时, Mail::send 发送消息正确。但是,当 HTML 没有换行符(如下面的 var $html_richeditor )时,它就会被截断。

$html = '<p>Aenean finibus erat eget maximus luctus. Phasellus vitae lectus dolor. Morbi convallis ex et turpis porttitor mattis morbi convallis ex et turpis porttitor mattis</p>
                <p>Proin porta, nibh eget elementum aliquet, metus elit viverra nisi, vitae ullamcorper elit eros ut urna.</p>
                <br/><br><p>Morbi convallis ex et turpis porttitor mattis.</p>';

$html_richeditor = "<p>Aenean finibus erat eget maximus luctus. Phasellus vitae lectus dolor. Morbi convallis ex et turpis porttitor mattis morbi convallis ex et turpis porttitor mattis</p><p>Proin porta, nibh eget elementum aliquet, metus elit viverra nisi, vitae ullamcorper elit eros ut urna.</p><p><br></p><p><br></p><p>Morbi convallis ex et turpis porttitor mattis.</p>";
        

知道如何从 richeditor 发送整个 HTML 吗?我应该在 richeditor 还是在 Mail 中配置一些东西?

我调试了很多,发现 HTML 是由 Markdown 解析的,它没有链接单行内容,只保留第一个 tag.

UPDATE - as per OctoberCMS 2.0 Docs

需要注意的是,Markdown 解析器每行只接受一个 HTML 节点。

参考:https://docs.octobercms.com/2.x/services/parser.html#using-html-in-markdown

所以我们需要让我们的 HTML 像每行一个节点。我们可以将 \n 附加到所有标记的结尾 > 括号中,这样它将在 Markdown 解析期间持续存在。

$data=post();
$vars = [
 'subject' => $data['subject'],
 'message_body' => strtr($data['message'], ['>' => ">\n"]),
  // replacing `>` with `>\n` please use double quote with `\n`
 'name'=>'STB '
];
Mail::send('my.plugin::mail.default', $vars, function ($message) use ($vars) {
 $message->to("reciever@email.com");
 $message->subject($vars['subject']);
});

OR as per @SamuelGeorges you can wrap your message within <div> tag.

Now it should work as expected.

如有疑问请评论。

这是 Markdown 解析器的一个怪癖,当它在同一行看到两个或更多 HTML 个节点时,它只会捕获第一个节点(每行一个节点)。

// Outputs: <p>hello</p>
<p>hello</p><p>yo</p>

为了克服这个问题,应该告诉 Markdown 它应该期望 HTML 通过将所有内容都包装在一个节点中。

// Outputs: <div><p>hello</p><p>yo</p></div> 
<div><p>hello</p><p>yo</p></div>

解决方案是将原始 HTML 语句包装在标记中。

<div>
    {{message_body|raw}}
</div>