Laravel在Mailable中使用MailMessage

时间:2018-07-04 19:06:22

标签: laravel email

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

<?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模板吗?

谢谢。

4 个答案:

答案 0 :(得分:5)

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

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));

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

答案 1 :(得分:2)

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

<?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()
            );
    }
}

答案 2 :(得分:0)

发布来自供应商的通知,您可以降价发送

    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());
    }

答案 3 :(得分:0)

您不必使用markdown,仅因为您可能想升级laravel。 https://laravel.com/docs/5.6/notifications#mail-notifications

指定视图

    return $mail->view('emails.default');
相关问题