【问题标题】:Laravel use MailMessage in MailableLaravel 在 Mailable 中使用 MailMessage
【发布时间】:2018-12-13 05:58:50
【问题描述】:

我试图在我的用户注册时向他们发送一封电子邮件,我创建了一个可邮寄的类:

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class WelcomeMail extends Mailable
{
use Queueable, SerializesModels;

public $user;
public $message;
/**
 * Create a new message instance.
 *
 * @return void
 */
public function __construct($user)
{
    $this->user = $user;

    $this->message = (new MailMessage)
        ->greeting('Bonjour '.$user->name)
        ->line('Nous vous remercions de votre inscription.')
        ->line('Pour rappel voici vos informations :')
        ->line('Mail: '.$user->email)
        ->line('Password: '.$user->password);
}

/**
 * Build the message.
 *
 * @return $this
 */
public function build()
{
    return $this->view('message')->with([
        'slot' => $this->message
    ]);


}

但是如果我使用自定义模板,我必须做所有的 css 和 Html,我看到忘记密码的电子邮件使用 MailMessage,并且所有模板都已经使用 MailMessage 模板。

我有什么方法可以使用相同的模板或直接创建一个 MailMessage 模板但包含我的自定义内容?

谢谢。

【问题讨论】:

标签: laravel email


【解决方案1】:

你不必使用markdown,只是因为你不想升级laravel。 https://laravel.com/docs/5.6/notifications#mail-notifications

指定视图

    return $mail->view('emails.default');

【讨论】:

    【解决方案2】:

    我在 Laravel 8 中使用过这个,不确定它是否仍然与以前版本的 Laravel 兼容。 重点是使用Mailable中的html方法。

    <?php
    
    namespace App\Mail;
    
    use Illuminate\Bus\Queueable;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Mail\Mailable;
    use Illuminate\Notifications\Messages\MailMessage;
    use Illuminate\Queue\SerializesModels;
    
    class MyMail extends Mailable
    {
        use Queueable, SerializesModels;
    
        public function build()
        {
            return $this->subject('My Subject')
                ->html((new MailMessage)
                    ->line('The introduction to the notification.')
                    ->action('Notification Action', url('/'))
                    ->line('Thank you for using our application!')
                    ->render()
                );
        }
    }
    
    

    【讨论】:

    • 我需要在邮件消息上调用render() 方法才能使其工作,否则 laravel 会抛出错误。 (new MailMessage)-&gt;line(...)-&gt;render(),但您的回答将我引向正确的方向。谢谢
    • 这就是这样做的方法,我需要一种方法来使用 Laravel 内置的通知电子邮件模板来保持一致性,他们应该使它成为一个独立的引擎来生成电子邮件,你最终可以附加到通知.
    【解决方案3】:

    从供应商发布通知,您可以在降价中发送它

        public function __construct($user)
        {
            $this->user = $user;
    
            $this->message = (new MailMessage)
                ->greeting('Bonjour '.$user->name)
                ->line('Nous vous remercions de votre inscription.')
                ->line('Pour rappel voici vos informations :')
                ->line('Mail: '.$user->email)
                ->line('Password: '.$user->password);
        }
    
        /**
        * Build the message.
        *
        * @return $this    
        */
        public function build()
        {
             return  $this->markdown('vendor.notifications.email', $this->message->data());
        }
    

    【讨论】:

    • 或者不发布:return $this->markdown('notifications::email', $this->message->data());顺便说一句,很棒的提示
    【解决方案4】:

    您正在混合 2 个独立的 Laravel 概念,通知和邮件程序。 Notifications 可以是 Mailers,但 Mailers 不能是 Notifications。

    MailMessage 类是通知消息,但不能是 Mailable 的消息。要发送MailMessage 邮件,您应该扩展Notification 类:

    <?php
    
    namespace App\Notifications;
    use Illuminate\Notifications\Notification;
    use Illuminate\Notifications\Messages\MailMessage;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Queue\SerializesModels;
    use Illuminate\Bus\Queueable;
    
    class WelcomeNotification extends Notification implements ShouldQueue
    {
        use Queueable, SerializesModels;
    
        public $user;
    
        public function __construct($user)
        {
            // The $notifiable is already a User instance so not really necessary to pass it here
            $this->user = $user;
        }
    
        public function via($notifiable)
        {
            return ['mail'];
        }
    
        public function toMail($notifiable)
        {
    
            return (new MailMessage)
                ->greeting('Bonjour '.$this->user->name)
                ->line('Nous vous remercions de votre inscription.')
                ->line('Pour rappel voici vos informations :')
                ->line('Mail: '.$this->user->email)
                ->line('Password: '.$this->user->password);
        }
    
    }
    

    另外,请参阅 Laravel's ResetPassword notification 作为示例。

    向用户发送通知:

    $user->notify(new WelcomeNotification($user));
    

    通过这种方式,您可以使用默认邮件通知模板创建通用邮件消息。

    【讨论】:

      猜你喜欢
      • 2017-06-09
      • 2018-06-29
      • 2017-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 2018-06-26
      • 1970-01-01
      相关资源
      最近更新 更多