web-dev-qa-db-ja.com

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フレームワークのものを使用します。

Notificationクラスによって返される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
_
18
Brian Glaz

このコマンドを実行する

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」という文を編集しました。このファイル内のその画像の下部にある「すべてのテスト予約済み」に:

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

これは私が得たものです:

enter image description here

35
lewis4u

Config/mail.phpに正しい設定があることを確認してください:

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

通知を作成し、ヘッダーとフッターを含むテンプレートを変更する方法に関する記事を書きました。

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

コンポーネントがどのように機能し、データを適切に渡す方法に関する詳細が必要な場合は、中記事を確認できます。

8
shabany

@Brianテンプレートファイルの@componentディレクティブを変更するだけで、カスタムテンプレートを使用できます。例えば:

テンプレートが_/resources/views/vendor/mail/html/message.blade.php_にあると仮定して、@component('mail::message')@component('vendor.mail.html.message')に置き換えます。

4
Nam Dau

組み込みの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->viewメソッドは、HtmlStringではなくビューファイルを想定しています。

3
Brian Glaz

ここで提案されていることをしないでください。

これは動作します。もちろん、「vendor/mail/markdown」フォルダの内容ではなく「vendor/mail/html」フォルダに含まれるテンプレートを編集する必要があることを覚えておいてください。もちろん、line()/ greeting( )メール作成機能

代わりに、artisanコマンドを実行してから、リソースフォルダー内の生成されたファイルを編集します。ベンダーファイルを上書きしないでください。ローカルバージョンで作業している場合は、ライブサーバーにプッシュしてcomposer installを実行すると、これらの変更はもうありません。

Laravelの継承により、事前に定義されたメソッドとファイルを簡単に上書きできるため、それを利用して、よりクリーンなバージョン管理と、コア機能への変更をロールバックする能力を高めます。

1
Brenden Clerget

コンポーネント@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

0