web-dev-qa-db-fra.com

Laravel 5.4 - Comment personnaliser la présentation des e-mails de notification?

J'essaie de personnaliser la présentation du courrier électronique HTML utilisée lors de l'envoi de notifications par courrier électronique.

J'ai publié les vues de courrier et de notification.

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

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

Si je modifie le fichier /resources/views/vendor/notifications/email.blade.php, je ne pourrai modifier que le contenu BODY des emails envoyés. Je souhaite modifier le pied de page, l'en-tête et toutes les autres parties de la présentation de l'e-mail.

J'ai également essayé de modifier les vues à l'intérieur de /resources/vendor/mail/html/, mais chaque fois que la notification est envoyée, elle n'utilise même pas ces vues mais utilise celles par défaut de laravel framework.

Je sais que je peux définir une vue sur la MailMessage renvoyée par ma classe Notification, mais je souhaite conserver les fonctions standard line(), greeting(), etc.

Est-ce que quelqu'un sait comment je peux obtenir mes notifications pour envoyer un courrier électronique en utilisant les vues dans /resources/vendor/mail/html?

 enter image description here

Ce qui suit est mon fichier /resources/views/vendor/notifications/email.blade.php, mais il n’a aucun emplacement pour personnaliser la disposition en-tête/pied de page/globale.

@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
10
Brian Glaz

Exécuter cette commande

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

mise à jour pour laravel 5.7+

php artisan vendor:publish

et alors vous obtiendrez:

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

et puis il suffit de taper ce numéro devant pour publier le fichier pour édition


puis dans 

/resources/views/vendor/mail/html/

vous pouvez éditer tous les composants et personnaliser tout ce que vous voulez ... Par exemple, j'ai édité la phrase "Tous droits réservés". dans "Tous les tests réservés" au bas de cette image dans ce fichier:

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

et voici ce que j'ai eu:

 enter image description here

28
lewis4u

Assurez-vous d’avoir la bonne configuration dans votre config/mail.php:

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

J'ai écrit un article sur la création d'une notification et la modification de votre modèle, y compris l'en-tête et le pied de page. 

Il comprend des explications sur le fonctionnement des composants Laravel et sur la manière de transmettre vos données à un nouveau modèle de courrier électronique.

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

La partie la plus importante consiste à insérer le code suivant dans votre modèle de courrier électronique:

@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

Vous pouvez consulter l'article intermédiaire au cas où vous voudriez plus de détails sur le fonctionnement des composants et la manière de transmettre correctement les données.

7
shabany

@Brian Vous pouvez simplement modifier les directives @component dans votre fichier de modèle pour utiliser vos modèles personnalisés. Par exemple:

Remplacez @component('mail::message') par @component('vendor.mail.html.message'), en supposant que votre modèle se trouve à /resources/views/vendor/mail/html/message.blade.php

4
Nam Dau

J'ai fini par utiliser une vue personnalisée plutôt que d'essayer de faire fonctionner les versions intégrées de Laravel.

J'ai ajouté l'instruction use suivante à ma classe Notification

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

Puis dans la méthode 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 est mon modèle de courrier électronique actuel.

Je compile la vue en une chaîne, puis convertis les feuilles de style en ligne.

emails.htmlBlank est un fichier de vue, mais il ne fait que mettre echo out bodyContent. Cela est nécessaire car la méthode MailMessage->view attend un fichier de vue, et non un HtmlString. 

3
Brian Glaz

Ne faites pas ce qui est suggéré ici.

Cela marche. Rappelez-vous simplement que vous devez éditer les modèles contenus dans le dossier 'vendor/mail/html' ET NON le contenu du dossier 'vendor/mail/markdown', sauf si vous utilisez bien sûr markdown au lieu de la ligne ()/greeting ( ) fonctions de création d'e-mails

Au lieu de cela, exécutez les commandes artisan, puis modifiez les fichiers générés dans votre dossier de ressources avec lequel vous vous retrouvez. N'écrasez jamais les fichiers du fournisseur, comme si vous travailliez sur une version locale, puis envoyez-le sur un serveur en direct et exécutez l'installation de composer, vous ne subirez plus ces modifications.

L'héritage de Laravel vous permet de remplacer facilement des méthodes et des fichiers prédéfinis. Profitez-en pour optimiser le contrôle des versions et optimiser les modifications apportées aux fonctionnalités principales.

1
Brenden Clerget

Vous créez un courrier électronique en fonction du composant @component('mail::message') Il s'agit d'un paramètre par défaut, décrit dans la documentation. Ce composant ne vous permet pas de modifier l'en-tête. Cependant, si vous regardez dans son fichier, 

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

vous verrez qu'il utilise un autre composant @component('mail::layout')

Copiez simplement le contenu du fichier message.blade.php dans votre .blade.php et remplacez {{ $slot }} par ce que vous aviez auparavant dans votre fichier.

Et maintenant, vous avez toute la flexibilité dans votre dossier.

Plus  

si vous voulez modifier les styles, allez dans le fichier \config\mail.php

et changer la section markdown comme si

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

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

Dans ce cas, j'ai remplacé le thème par défaut par mon propre \resources\views\emails\vendor\html\themes\default0.css

ou, si vous ne voulez pas personnaliser les chemins - mettez votre default0.css dans /resources/views/vendor/mail/html/themes - c'est un chemin par défaut et vous n'avez pas besoin de le mentionner.

Testé sur Laravel 5.7

0
Yevgeniy Afanasyev