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 файл /resources/views/vendor/notifications/email.blade.php, я могу изменить только содержимое BODY отправляемых электронных писем. Я также хочу изменить нижний колонтитул, заголовок и все остальные части макета электронной почты.

Я попытался также изменить представления внутри /resources/vendor/mail/html/, но всякий раз, когда уведомление отправляется, оно даже не использует эти представления и вместо этого использует стандартные рамки laravel.

Я знаю, что могу установить представление MailMessage возвращаемое моим классом Notification, но я хочу сохранить стандартные функции 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 youre having trouble clicking the "{{ $actionText }}" button, copy and paste the URL below
into your web browser: [{{ $actionUrl }}]({{ $actionUrl }})
@endcomponent
@endif
@endcomponent

Ответ 1

Запустите эту команду

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

и вот что я получил:

enter image description here

Ответ 2

Убедитесь, что вы правильно настроили конфигурацию в файле config/mail.php:

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

Ответ 3

Я написал статью о том, как создать уведомление и изменить ваш шаблон, включая верхний и нижний колонтитулы.

Он включает в себя объяснение того, как работают компоненты 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

Вы можете проверить среднюю статью, если хотите узнать больше о том, как работают компоненты и как правильно передавать данные.

Ответ 4

@Брайан Вы можете просто внести изменения в директивы @component в вашем файле шаблона, чтобы использовать свои собственные шаблоны. Например:

Замените @component('mail::message') на @component('vendor.mail.html.message'), если ваш шаблон находится в /resources/views/vendor/mail/html/message.blade.php

Ответ 5

В итоге я просто использовал пользовательский вид вместо того, чтобы пытаться заставить встроенные Laravel работать.

Я добавил следующий оператор use в класс Notification

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 - это файл вида, но все, что он делает, это echo out bodyContent. Это необходимо, потому что метод MailMessage->view ожидает файл вида, а не HtmlString.

Ответ 6

НЕ делайте то, что предлагается здесь.

Это работает. Просто помните, что вы должны редактировать шаблоны, содержащиеся в папке vendor/mail/html, а НЕ содержимое папки vendor/mail/markdown, если, конечно, вы не используете markdown вместо line()/reeting ( ) функции построения электронной почты

Вместо этого, запустите команды ремесленника, а затем отредактируйте сгенерированные файлы в вашей папке ресурсов, с которой вы в конечном итоге. Никогда не перезаписывайте файлы вендора, как будто вы работаете с локальной версией, затем перенесите ее на работающий сервер и запустите установку composer, таких изменений у вас больше не будет.

Наследование Laravel позволяет вам легко перезаписывать заранее определенные методы и файлы, поэтому используйте это для более чистого контроля версий и лучшей возможности отката изменений в основной функциональности.

Ответ 7

Вы делаете электронную почту на основе компонента @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