发送后显示带有降价的 Laravel 通知(MailMessage)

Posted

技术标签:

【中文标题】发送后显示带有降价的 Laravel 通知(MailMessage)【英文标题】:Display Laravel Notification (MailMessage) with markdown after sent 【发布时间】:2020-05-13 00:29:36 【问题描述】:

通过创建函数storeEmail 并将MailMessage 类插入EmailMessage 模型,我将发送给实体的每封电子邮件保存到数据库中。一切正常,主要的目标是在收件人收到邮件时完全按原样显示邮件,并将我作为User发送的所有邮件检索到一个页面。为了更容易在 foreach 循环中检索每个特定消息的渲染,我认为最好从模型中获取它。

这是我的通知类:

class SimpleEmail extends Notification

    use Queueable;

    private $link;
    private $user;

    /**
     * Create a new notification instance.
     *
     * @return void
     */
    public function __construct($link)
    
        $this->link = $link;
        $this->user = Auth::user();
    

    /**
     * Get the notification's delivery channels.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function via($notifiable)
    
        return ['mail'];
    

    /**
     * Get the mail representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return \Illuminate\Notifications\Messages\MailMessage
     */
    public function toMail($notifiable)
       
        $mail = (new MailMessage)
            ->from($this->user->email, $this->user->name)
            ->subject('My Dummy Subject')
            ->greeting('To: '.$notifiable->email)
            ->action('Action Button', url($this->link))
            ->line('Thank you for reading my message')
            ->salutation('Friendly, '.$this->user->name);

        $this->storeEmail($mail,$notifiable);
        return $mail;
    

    public function storeEmail($mail,$notifiable)
        $email = new EmailMessage;
        $email->sender_type = 'App\User';
        $email->sender_id = $this->user->id;
        $email->mail = $mail;
        $email->save();
        $notifiable->email_messages()->save($email);
    

Note:

    我正在使用Illuminate\Notifications\Messages\MailMessage 我的课程扩展Illuminate\Notifications\Notification 我将(新的 MailMessage)保存在 $email->mail = $mail;

我尝试dd($email->mail); 得到了这个:

 ^ array:20 [▼
  "view" => null
  "viewData" => []
  "markdown" => "notifications::email"
  "theme" => null
  "from" => array:2 [▶]
  "replyTo" => []
  "cc" => []
  "bcc" => []
  "attachments" => []
  "rawAttachments" => []
  "priority" => null
  "callbacks" => []
  "level" => "info"
  "subject" => "My Dummy Subject"
  "greeting" => "To: Dohn John"
  "salutation" => "Friendly, Nikolas Diakosavvas"
  "introLines" => array:2 [▶]
  "outroLines" => array:1 [▶]
  "actionText" => "Action Button"
  "actionUrl" => "http://my-example-url.com ▶"

如何显示邮件通知,就像我发送它时一样?什么是最佳解决方案? 谢谢,提前

已编辑

设法使用此代码呈现 MailMessage 作品

$email = EmailMessage::first();
return (new \App\Notifications\SimpleEmail('my-link', $email->recipient->assignto))->toMail($email->recipient);

但这并不是我想要的,因为每次我都需要找到:

    每封电子邮件都使用了哪个通知类,以便我可以呈现它。 每个通知类的变量。

【问题讨论】:

您可以在浏览器中渲染它们laravel.com/docs/master/mail#rendering-mailables 是的,我知道,但是如何呈现来自EmailMessage 模型的消息?因为,从 Model 中访问消息比每次都搜索 Notification 类并传递必要的变量更容易。 在文档中他们有 return (new App\Mail\InvoicePaid($invoice))->render(); 所以在你的例子中,尝试只传递 $email$email->mail 代替他们的 $invoice。更正原因的可邮寄路径 不,它不起作用,因为$invoiceInvoicePaid 类中使用的变量 【参考方案1】:

为了做到这一点:

1.您可以创建accessor。

2.使用Markdown的render方法。

3. 将您保存在storeEmail 中的邮件降价 传入render 方法。

你可以看上面的例子:

use \Illuminate\Mail\Markdown;

public function getRenderAttribute()
    $markdown = new Markdown(view());
    return $markdown->render($this->mail['markdown'], $this->mail);

【讨论】:

以上是关于发送后显示带有降价的 Laravel 通知(MailMessage)的主要内容,如果未能解决你的问题,请参考以下文章

如何在电报中使用降价?我想发送带有超链接的消息

Laravel 安排推送通知并在必要时取消它

带有队列的laravel中的android和ios推送通知

Laravel 推送通知和消息传递

在Laravel中创建记录后发送通知

广播的 Laravel 通知不会在前端实时显示,而是通过 Pusher 发送并显示在控制台中