编程

使用 Laravel Mailable 简化电子邮件处理

147 2024-11-25 20:39:00

Laravel Mailable 提供了一种富有表现力的、面向对象的方法以在应用中编写电子邮件。该特性简化了创建和发送电子邮件的过程,使代码更具可读性和可维护性。让我们探讨一下如何在 Laravel 项目中有效地利用 Mailables。

新建一个 Mailable 类

要创建新的 Mailable,请使用 Laravel 的 Artisan 命令:

php artisan make:mail OrderShipped

这就生成了一个新的 Mailable 类:

use Illuminate\Mail\Mailable;

class OrderShipped extends Mailable
{
    public function build()
    {
        return $this->view('emails.orders.shipped');
    }
}

将数据添加到你的 Mailable 中

你可以轻松地将数据传递到电子邮件模板:

class OrderShipped extends Mailable
{
    public $order;

    public function __construct(Order $order)
    {
        $this->order = $order;
    }

    public function build()
    {
        return $this->view('emails.orders.shipped');
    }
}

Mailable 上的公开属性将在视图中自动可用。

使用 Markdown 作为 Email 模板

Laravel 支持使用 Markdown 作为 Email 模板,使之易于编写及维护:

public function build()
{
    return $this->markdown('emails.orders.shipped');
}

要新建一个 Markdown 模板:

php artisan make:mail OrderShipped --markdown=emails.orders.shipped

自定义发送者

你可用轻松地自定义右键的发送者:

public function build()
{
    return $this->from('sales@example.com')
                ->markdown('emails.orders.shipped');
}

添加附件

向邮件中添加附件也很简单:

public function build()
{
    return $this->markdown('emails.orders.shipped')
                ->attach('/path/to/file');
}

邮件队列

为了获得更好的性能,你可以将电子邮件进入队列:

Mail::to($user)->queue(new OrderShipped($order));

请确保 Mailable 类实现 ShouldQueue:

use Illuminate\Contracts\Queue\ShouldQueue;

class OrderShipped extends Mailable implements ShouldQueue
{
    // ...
}

测试 Mailable

Laravel 使得测试 Mailable 变得轻松:

use App\Mail\OrderShipped;
use App\Models\Order;

public function test_order_shipped_email()
{
    $order = Order::factory()->create();

    $mailable = new OrderShipped($order);

    $mailable->assertSeeInHtml($order->number);
    $mailable->assertSeeInText('Thank you for your order');
}

真实示例

此处是更复杂的 Mailable 示例:

class InvoicePaid extends Mailable implements ShouldQueue
{
    use Queueable, SerializesModels;

    public $invoice;

    public function __construct(Invoice $invoice)
    {
        $this->invoice = $invoice;
    }

    public function build()
    {
        return $this->markdown('emails.invoices.paid')
                    ->subject('Invoice Paid')
                    ->with([
                        'url' => route('invoices.show', $this->invoice),
                        'amount' => $this->invoice->amount,
                    ])
                    ->attach($this->invoice->pdf_path, [
                        'as' => 'invoice.pdf',
                        'mime' => 'application/pdf',
                    ]);
    }
}

Laravel Mailable 提供了一种简洁、富有表现力的方式来处理应用中的电子邮件生成和发送。通过将电子邮件逻辑封装在专用类中,可以为电子邮件功能创建更可维护和可测试的代码。