Laravel 5.4 - 如何自定义通知电子邮件布局?

时间:2017-03-10 17:17:01

标签: laravel laravel-5 laravel-5.4

我正在尝试自定义通过电子邮件发送通知时使用的HTML电子邮件布局。

我已发布了邮件和通知视图。

php artisan vendor:publish --tag=laravel-mail

php artisan vendor:publish --tag=laravel-notifications

如果我修改了/resources/views/vendor/notifications/email.blade.php文件,我只能更改发送的电子邮件的BODY内容。我也希望修改页脚,标题和电子邮件布局的其他所有部分。

我还尝试修改/resources/vendor/mail/html/中的视图,但每当发送通知时,它甚至不使用这些视图,而是使用默认的laravel框架。

我知道我可以在我的通知类返回的MailMessage上设置一个视图,但我希望保留标准line()greeting()等功能。

是否有人知道我如何使用/resources/vendor/mail/html中的观点发送电子邮件通知?

enter image description here

以下是我的/resources/views/vendor/notifications/email.blade.php文件,但它无法自定义页眉/页脚/整体布局。

@component('mail::message')
{{-- Greeting --}}
@if (! empty($greeting))
# {{ $greeting }}
@else
@if ($level == 'error')
# Whoops!
@else
# Hello!
@endif
@endif

{{-- Intro Lines --}}
@foreach ($introLines as $line)
{{ $line }}

@endforeach

{{-- Action Button --}}
@if (isset($actionText))
<?php
    switch ($level) {
        case 'success':
            $color = 'green';
            break;
        case 'error':
            $color = 'red';
            break;
        default:
            $color = 'blue';
    }
?>
@component('mail::button', ['url' => $actionUrl, 'color' => $color])
{{ $actionText }}
@endcomponent
@endif

{{-- Outro Lines --}}
@foreach ($outroLines as $line)
{{ $line }}

@endforeach

<!-- Salutation -->
@if (! empty($salutation))
{{ $salutation }}
@else
Regards,<br>{{ config('app.name') }}
@endif

<!-- Subcopy -->
@if (isset($actionText))
@component('mail::subcopy')
If you’re having trouble clicking the "{{ $actionText }}" button, copy and paste the URL below
into your web browser: [{{ $actionUrl }}]({{ $actionUrl }})
@endcomponent
@endif
@endcomponent

8 个答案:

答案 0 :(得分:32)

运行此命令

php artisan vendor:publish --tag=laravel-notifications
php artisan vendor:publish --tag=laravel-mail
  

更新laravel 5.7 +

php artisan vendor:publish

然后你会得到:

  [<number>] Tag: laravel-mail
  [<number>] Tag: laravel-notifications

然后只需在前面输入该号码即可发布要编辑的文件

然后在

/resources/views/vendor/mail/html/

您可以编辑所有组件并自定义所需内容。 例如,我编辑了句子&#34;保留所有权利&#34;。到&#34;所有测试保留&#34;在该文件中该图像的底部:

/resources/views/vendor/mail/html/message.blade.php

这就是我得到的:

enter image description here

答案 1 :(得分:11)

确保在config / mail.php中具有正确的配置:

'markdown' => [
    'theme' => 'default',
    'paths' => [
        resource_path('views/vendor/mail'),
    ]
],

答案 2 :(得分:7)

我写了一篇关于如何创建通知和修改模板的文章,包括页眉和页脚。

它包含有关Laravel组件如何工作以及如何将数据传递到新电子邮件模板的说明。

https://medium.com/@adnanxteam/how-to-customize-laravel-5-4-notification-email-templates-header-and-footer-158b1c7cc1c

最重要的部分是将以下代码放在电子邮件模板中:

@component('mail::layout')
    {{-- Header --}}
    @slot('header')
        @component('mail::header', ['url' => config('app.url')])
            Header Title
        @endcomponent
    @endslot
{{-- Body --}}
    This is our main message {{ $user }}
{{-- Subcopy --}}
    @isset($subcopy)
        @slot('subcopy')
            @component('mail::subcopy')
                {{ $subcopy }}
            @endcomponent
        @endslot
    @endisset
{{-- Footer --}}
    @slot('footer')
        @component('mail::footer')
            © {{ date('Y') }} {{ config('app.name') }}. Super FOOTER!
        @endcomponent
    @endslot
@endcomponent

如果您想了解有关组件如何工作以及如何正确传递数据的更多详细信息,您可以查看中篇文章。

答案 3 :(得分:4)

@布赖恩 您只需更改模板文件中的@component指令即可使用自定义模板。例如:

@component('mail::message')替换为@component('vendor.mail.html.message'),假设您的模板位于/resources/views/vendor/mail/html/message.blade.php

答案 4 :(得分:3)

我最终只是使用自定义视图,而不是试图使内置的Laravel工作。

我将以下use语句添加到我的通知类

use Illuminate\Support\Facades\View;
use Illuminate\Support\HtmlString;
use TijsVerkoyen\CssToInlineStyles\CssToInlineStyles;

然后在toMail方法中:

public function toMail($notifiable)
    {
        $view_file = 'emails.teamInvitation';
        $view = View::make($view_file, ['sender' => $this->sender, 'invitationToken' => $this->invitationToken, 'team' => $this->team ]);

        $view =  new HtmlString(with(new CssToInlineStyles)->convert($view));

        return (new MailMessage)
            ->subject('PreSource Invitation From ' . $this->sender->name )
            ->view('emails.htmlBlank', ['bodyContent' => $view]);
    }

emails.teamInvitation是我的实际电子邮件模板。

我将视图编译为字符串,然后将样式表转换为内联。

emails.htmlBlank是一个视图文件,但它只是回显bodyContent。这是必要的,因为MailMessage->view方法需要视图文件,而不是HtmlString。

答案 5 :(得分:0)

您正在基于组件@component('mail::message')发送电子邮件,这是默认设置,仅是文档中所述的一种。该组件不允许您修改标题。但是,如果您查看文件,

\vendor\laravel\framework\src\Illuminate\Mail\resources\views\markdown\message.blade.php

您将看到它使用了另一个组件@component('mail::layout')

只需将message.blade.php文件的内容复制到您的.blade.php中,然后将{{ $slot }}替换为文件中的内容即可。

现在,您可以在文件中拥有所有的灵活性。

如果要修改样式,请转到文件\config\mail.php

并像这样更改markdown部分

'markdown' => [
    'theme' => 'default0',

    'paths' => [
        resource_path('views/vendor/mail'),
        base_path('resources/views/emails/vendor'),            
    ],
],

在这种情况下,我用自己的\resources\views\emails\vendor\html\themes\default0.css

替换了默认主题

或者,如果您不想自定义路径-将default0.css放入/resources/views/vendor/mail/html/themes-这是默认路径,则无需提及。

在Laravel 5.7上测试

答案 6 :(得分:0)

请勿执行此处建议的操作。

  

这有效。请记住,您应该编辑“ vendor / mail / html”文件夹中包含的模板,而不要编辑“ vendor / mail / markdown”文件夹中的内容,除非您当然使用markdown而不是line()/ greeting( )电子邮件构建功能

相反,运行artisan命令,然后在最终的资源文件夹中编辑生成的文件。永远不要覆盖供应商文件,就好像您使用的是本地版本一样,然后将其推送到活动服务器并运行composer install,您将不再有这些更改。

Laravel的继承使您可以轻松覆盖预定义的方法和文件,因此可以利用它来进行更清晰的版本控制和更好的将更改回滚到核心功能的能力。

答案 7 :(得分:0)

Laravel 5.8

我在文件-> vendor / laravel / framework / src / Illuminate / Mail / resources / views / html / layout.blade.php中找到了电子邮件布局。

就像我不使用markdown发送电子邮件一样,我需要laravel的默认布局(是的,因为我想要:))。

我做了什么?我为我发送了一封重设密码的电子邮件,保存了类似html的电子邮件,然后将html复制到了我的编辑器,并准备更改\ o /。