Laravel 5.3 - 邮件通知中的行之间没有断开?

3

我通过 toMail 频道发送电子邮件,该频道是从文本区域保存的,在其中按两次回车键换行,因此在输入时看起来像这样:

Line 1

Line 2 with space above and below

Line 3

当我在邮件中使用如下文本:
return (new MailMessage)->subject('test spacing')
                        ->line($this->text);

在电子邮件中看起来像这样:

Line 1 Line 2 with space above and below Line 3

我在email.blade.php中更改了相关部分,修改前:

@foreach ($introLines as $line)
  {{ $line }}
@endforeach

To:

@foreach ($introLines as $line)
  {!! nl2br(htmlspecialchars($line)) !!}
@endforeach

但是那仍然没有起作用。在数据库中的notifications表中,它被保存为:
Line 1\n\nLine 2 with space above and below\n\nLine 3

任何想法如何使发送的电子邮件显示间距,以便它不只是一个大块?
更新:
因此,laravel在notifications表中插入通知时会使用\n\n,但实际上会像这样保存在model表中:

enter image description here

这就是传递给email的内容,但仍然不确定如何在email中获取这些空格。

也许邮件是以HTML格式发送的?如果是这样,请尝试在您想要添加空格的位置添加“<br>”? - ImAtWar
是的,正如预期发送为 HTML。这就是为什么我尝试使用 {!! nl2br($line)) !!}{!! nl2br(htmlspecialchars($line)) !!} 两者,但仍然无法得到空格的原因... - Wonka
nl2br仅插入换行符。HTML不解释换行符。我认为最好的方法是在之前和/或之后使用<br>标记。 - ImAtWar
添加了更新。 - Wonka
4个回答

5
您输入的文本包含换行符,Laravel将自动删除这些字符(请参见Illuminate\Notifications\Messages\SimpleMessage类的formatLine()方法,MailMessage也基于该方法)。您可以继承MailMessage并覆盖其格式设置:
class CustomMailMessage extends MailMessage {

    protected function formatLine($line) {
        if (is_array($line)) {
            return implode(' ', array_map('trim', $line));
        }
        // Just return without removing new lines.
        return trim($line);
    }

}

你也可以在将文本发送到MailMessage之前将其拆分。由于“line”方法接受字符串或数组,因此你可以拆分行并一次性传递所有行:

return (new MailMessage)->subject('test spacing')
    ->line(array_map('trim', preg_split('/\\r\\n|\\r|\\n/', $this->text)));

这应该是被接受的答案,因为它不仅解释了你可以使用MailMessage子类,而且还解释了你可以简单地将字符串数组传递给“line”方法。对我来说,这是最简单的方法。 - leo

1
你可以创建一个继承自MailMessage的类。
例如:
class MyClassMailMessage extends MailMessage {

    public function splitInLines($steps){
        $arrSteps = explode("\n", $steps);
        if(!empty($arrSteps)){
            foreach ($arrSteps as $line) {
               $this->with($line);
            }
          }
         return $this; 
    }
}

然后在您的通知中执行以下操作:
return (new MyClassMailMessage)
    ->splitInLines($this->text);

0

将您的电子邮件类型指定为text/html。我认为Laravel会自动处理,但最好使用视图。以下是适用于我的工作方式。 另一种简单的方法是为您的邮件文本创建视图,并像这样使用它 使用视图创建可邮寄对象如下。

class CompanyCreated extends Mailable
{
    use Queueable, SerializesModels;

    public $company;

    public function __construct(Company $company)
    {
        $this->company = $company;
    }

    public function build()
    {
        return $this->subject("Alert: New Company added")
                ->from("fax@netinkvoice.com", "From1 Name123")
                ->view('super_admin.company-mail')->with(['data' => $this->company]);
    }
}

我已经创建了这个可邮寄的内容,并且它可以正常工作,数据以表格格式显示。它是基于 Laravel 5.3 的。


我认为它发送的是 text/html,因为它显示了 Laravel 的 button/css 和其他电子邮件样式/颜色头部/页脚等。 - Wonka
谢谢,但我想保持与“toMail”传递通道文件中的其他电子邮件通知一致。 - Wonka
你能否发布一下如何创建$text并将其用作$this->text的内容。 - BetaDev
你是否使用通知?这是我的设置方式,在控制器中,我将记录保存到数据库并触发一个带有记录数据的事件。事件上的通知监听器会将数据传递给构造函数,这就是我访问 $text 的方式,它可以工作,但是存在间距问题。 - Wonka
是的,我认为@hassan也是这个意思,但是问题在于$line本身就有换行符。我必须将问题保持开放状态更长时间,也许有人遇到了通知邮件渠道的相同问题。 - Wonka
显示剩余3条评论

-1

只需添加一些HTML标签,即可将文本换行包裹起来

@foreach ($introLines as $line)
  <p>{{ $line }}</p>
  // or use <br />
@endforeach

然而,在markdown中添加新的换行符,您可以执行以下操作:
1 -

如果要在没有段落的情况下换行,您需要使用两个尾随空格和一个enter

source

2 -
使用普通的<br />

来源:laravel文档


这种方法不可行,原因有两个。首先,Laravel现在使用markdown作为电子邮件模板,但更重要的是,在组合电子邮件模板(标准laravel)时可能会使用许多不同的$line,因此我不希望硬编码格式应用于其他行,只应用于具有$text变量中间隔的这一行$line - Wonka
Laravel已经添加了Markdown支持,但您仍然可以使用HTML来为电子邮件制作模板。 - hassan
你的意思是在 $text 后面添加 <br />。我希望知道如何将其转换为原样保存到数据库中,但在发送到电子邮件时作为 $line 时,它会添加空行。 - Wonka
请勿在您的email.blade.php文件中添加<br />标签,正如Laravel文档所述,您可以在Markdown模板中使用{{ $line }} <br /> - hassan
所以我在Markdown模板中做了这件事,但没有变化。重要的是要意识到{{ $line }}必须具有正确的格式/显示方式,它后面的任何内容都不能改变其中的内容,比如它后面的<br />,因为它在变量内部,其中包含间距。 - Wonka
然后尝试使用我在答案中提到的HTML标记,我正在使用HTML标记,并且对我来说运行良好。 - hassan

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