【问题标题】:Laravel 5.4^ - How to customize notification email layout?Laravel 5.4^ - 如何自定义通知电子邮件布局?
【发布时间】:2017-08-01 03:16:50
【问题描述】:

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

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

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

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

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

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

我知道我可以对 Notification 类返回的 MailMessage 设置视图,但我想保留标准的 line()greeting() 等函数。

有谁知道我如何使用/resources/vendor/mail/html 中的视图获取发送电子邮件的通知?

以下是我的/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

【问题讨论】:

  • 是的,我想在页眉中添加公司徽标和标语,在页脚中添加一些链接,以及更改 CSS 字体样式
  • 是的,这是一个通知。我的通知有一个 toMail 方法可以将通知作为电子邮件return (new MailMessage) 等发送。我正在尝试弄清楚如何自定义new MailMessage 的布局
  • 我的通知工作正常,我只想让它在通过 toMail 方法发送时使用我自己的电子邮件模板。
  • $user-&gt;notify(new TeamInvitation())
  • 我的办公网络由于某种原因阻止了该链接。我的通知确实有效,并且我正确收到了包含正确正文的电子邮件。我没有从该文件中删除任何代码。我运行了发布命令,这就是我得到的。

标签: laravel laravel-5 laravel-5.4


【解决方案1】:

Laravel 5.8

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

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

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

【讨论】:

    【解决方案2】:

    运行此命令

    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/
    

    您可以编辑所有组件并自定义您想要的任何内容。 例如,我编辑了“保留所有权利”这句话。到此文件内该图像底部的“所有测试保留”:

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

    这就是我得到的:

    【讨论】:

    • 这行得通。请记住,您应该编辑 'vendor/mail/html' 文件夹中包含的模板,而不是 'vendor/mail/markdown' 文件夹的内容,除非您使用的是 markdown 而不是 line() / greeting( ) 电子邮件构建功能。
    【解决方案3】:

    您正在基于组件@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 上测试

    【讨论】:

      【解决方案4】:

      不要做这里建议的事情。

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

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

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

      【讨论】:

        【解决方案5】:

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

        它包括对 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
        

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

          • 按照@lewis4u 的回答,这个对我有用——特别是这个。如果没有这种自定义,电子邮件的外观根本无法正常工作。
          • 这是我的问题 - 文档中缺少它。应该在vendor:publish 指令之后
          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

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

            我在 Notification 类中添加了以下 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-&gt;view 方法需要一个视图文件,而不是 HtmlString。

            【讨论】:

              猜你喜欢
              • 2020-02-01
              • 1970-01-01
              • 2017-07-02
              • 2018-02-13
              • 2014-01-02
              • 2019-10-31
              • 2017-07-23
              • 2018-01-07
              • 1970-01-01
              相关资源
              最近更新 更多