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

28

我正在尝试自定义通过电子邮件发送通知时使用的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

是的,这是一条通知。我的通知有一个toMail方法,可以将通知作为电子邮件发送return (new MailMessage)等等。我正在尝试找出如何自定义new MailMessage的布局。 - Brian Glaz
我的通知功能正常工作,我只是希望在通过toMail方法发送时使用自己的电子邮件模板。 - Brian Glaz
$user->notify(new TeamInvitation()) - Brian Glaz
我所做的一切都没有任何效果。我已经更改了框架源代码中的themes/default.css以及发布的themes/default.css,但电子邮件通知看起来仍然完全相同。 - Brian Glaz
不,当发送通知电子邮件时,对那个文件所做的任何更改都没有被反映出来。 - Brian Glaz
显示剩余4条评论
8个回答

53

运行这个命令

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/

您可以编辑所有组件并自定义任何想要的内容。例如,我已经在此文件内部的该图像底部编辑了句子“All rights reserved”为“All test reserved”。

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

这是我得到的内容:

在此输入图片描述


1
这个可以运行。只需记住,你应该编辑位于“vendor/mail/html”文件夹中的模板,而不是“vendor/mail/markdown”文件夹中的内容,除非你正在使用markdown而不是line() / greeting()电子邮件构建函数。 - Stuart Cusack

16

请确保在config/mail.php文件中拥有正确的配置:

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

根据@lewis4u的答案,以及这个答案对我有用 - 具体来说是这个。如果没有这个,自定义电子邮件的外观根本不起作用。 - James
1
这是我的问题 - 它在文档中找不到。应该紧随 vendor:publish 指令之后。 - Stetzon

8
我写了一篇关于如何创建通知并修改模板(包括标题和页脚)的文章。其中包括对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

如果您需要更多关于组件如何工作以及如何正确传递数据的详细信息,请查看中等文章。


7

@Brian 您可以在模板文件中更改@component指令以使用您的自定义模板。例如:

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


4

我最终决定使用自定义视图,而不是试图让内置的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。


1

不要按照此处建议的操作。

这个方法是有效的。只需要记住,你应该编辑 'vendor/mail/html' 文件夹中包含的模板,而不是 'vendor/mail/markdown' 文件夹中的内容,除非你正在使用 markdown 而不是 line() / greeting() 邮件构建函数。

相反,运行 artisan 命令,然后编辑你在 resources 文件夹中生成的文件。永远不要覆盖 vendor 文件,因为如果你在本地版本上工作,然后将其推送到生产服务器并运行 composer install,你将不再拥有这些更改。

Laravel 的继承功能允许你轻松地覆盖预定义的方法和文件,因此利用它可以更好地进行版本控制,并更好地回滚核心功能的更改。


0

Laravel 5.8

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

因为我不使用Markdown发送电子邮件,所以我需要Laravel的默认布局(是的,因为我想要它:)。

我做了什么? 我给自己发送了一封重置密码的电子邮件,将电子邮件保存为HTML,然后将HTML复制到我的编辑器中进行更改\o/。


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上测试过。

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