」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Laravel 可郵寄教程

Laravel 可郵寄教程

發佈於2024-11-08
瀏覽:921

在 Laravel 中发送电子邮件需要三个组件之间的协作:Laravel 邮件程序、Laravel 可邮件类和 Mail 外观。这三者中的每一个都涉及发送电子邮件生命周期的不同方面。

Mailers 是连接电子邮件发送服务(如 AWS SES、Sendgrid、Mailgun 等)的驱动程序,应用程序可使用这些服务将电子邮件转发给收件人。

Laravel Mailable 是表示要发送的电子邮件模板的特殊类。它包含电子邮件的所有典型信息,如内容、“收件人”字段、附件等。

最后,邮件门面是请求通过邮件程序驱动程序实际发送可邮寄邮件的访问点。

我有机会详细探索这个系统,现在 Inspector 在高峰期每小时发送超过 6000 封电子邮件。

Laravel Mailable Tutorial

我希望我的经验可以帮助您更好地理解框架的这个组件,因为 Laravel Mailable 是任何现代应用程序的关键组件之一。

想要了解更多技术文章,您可以在 Linkedin 或 X 上关注我。

Laravel 邮件程序配置

Laravel 中邮件程序驱动程序的配置位于 config/mail.php 文件中。可以定义多个邮件程序,每个邮件程序都有一个名称和一个传输驱动程序。

'mailgun' => [
    'transport' => 'mailgun',
    // 'client' => [
    //     'timeout' => 5,
    // ]

Laravel 将尝试使用它们,以防主电子邮件服务出现故障。

创建可邮寄的课程

mailable 是一个 PHP 类,代表您的应用程序发送的电子邮件。您可以使用 Artisan make 命令创建一个新的可邮寄类。

php artisan make:mail OrderConfirmation

可邮寄的配置通过信封、内容和附件三个主要方法进行,它们分别处理定义标头、消息正文和任何附件。

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailables\Address;
use Illuminate\Mail\Mailables\Attachment;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class OrderConfirmation extends Mailable
{
    use Queueable;
    use SerializesModels;

    public function __construct(public Order $order) {}

    /**
     * Configure the email message
     */
    public function envelope()
    {
        return new Envelope(
            from: new Address('[email protected]', 'E-commerce'),
            subject: 'Order Confirmation',
        );
    }

    /**
     * Generate the body
     */
    public function content()
    {
        return new Content(
            markdown: 'emails.orders.confirm',
        );
    }

    /**
     * Configure the email attachements
     */
    public function attachments()
    {
        $code = $this->order->code;

        return [
            Attachment::fromPath("/path/to/order-{$code}.pdf"),
        ];
    }
}

电子邮件内容的呈现显然委托给适当的 Blade 模板。在 Blade 视图中,可以使用 mailable 类中定义的公共属性(上例中的 $order )检索用于呈现电子邮件的数据。

Code: {{ $order->code }}
Address: {{ $order->address }}
...

发送 Laravel 邮件

电子邮件的实际发送是通过 Mail 外观及其 to 和 send 方法进行的。

class OrderController extends Controller
{
    public function ship(Order $order)
    {
        // do stuff with the order

        // Send the confirmation email
        Mail::to($order->user)->send(new OrderConfirmation($order));
    }
}

电子邮件收件人可以作为电子邮件地址字符串传递,也可以通过用户对象或具有名称和电子邮件属性的对象集合传递。

要发送的实际电子邮件由可邮寄对象表示,该对象接收必要的属性来呈现与内容关联的 Blade 模板。

邮件门面提供了各种可链接的方法,允许您更详细地定义发送配置,包括收件人(使用抄送和密件抄送方法)以及发送时间和方法(队列或稍后)。

如果您想学习如何创建自己的外观,您可以阅读下面的文章:

https://inspector.dev/how-to-extend-laravel-with-driver-based-services/

将 Laravel Mailable 排队

由于发送电子邮件需要使用外部服务(Mailer 驱动程序),因此操作可能很慢,会对用户体验产生负面影响。

Laravel 允许您对电子邮件进行排队以便后台发送。如果您对如何大规模使用 Laravel 队列系统的教程感兴趣,您可以阅读下面的文章:

https://inspector.dev/what-worked-for-me-using-laravel-queues-from-the-basics-to-horizo​​n/

要推迟在后台发送电子邮件,您有两个选择:ShouldQueue 接口,或 Mail 门面的队列方法。

如前面的代码片段所示,可邮寄类是在默认情况下附加一些特征(如 Queueable)生成的。

它允许以编程方式使用邮件外观上的队列方法,而无需触及您的实现:

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

您也可以在 Mailable 类中声明 ShouldQueue 接口的实现:

use Illuminate\Contracts\Queue\ShouldQueue;

class OrderConfirmation extends Mailable implements ShouldQueue
{
    ...
}

如果您使用此接口,则即使您在邮件门面上调用标准发送方法,电子邮件的发送也始终会排队。

// If the mailable class implements ShouldQueue these methods has the same behaviour.
Mail::to($user)->send(new OrderConfirmation($order));
Mail::to($user)->queue(new OrderConfirmation($order));

在浏览器中渲染 Laravel Mailable 模板

当您实现与电子邮件消息相关的视图时,获得 Blade 视图将呈现的最终结果的视觉反馈确实很有帮助。您可以使用 Laravel 项目中的 paths/mailable.php 文件来做到这一点。

/*
 * Render email in the browser.
 *
 * Visit https://homestead.test/mailable
 */
Route::get('/', function () {
    return new \App\Domains\Organization\Mails\IngestionLimitMail(
        \App\Domains\Organization\Models\Organization::firstOrFail()
    );
});

您可以从路由返回一个有效的 Mailable 实例,Laravel 将在浏览器中渲染视图。就像开发一个普通的网页一样。

Laravel Mailable Tutorial

最后记得在
中限制该路由的可用性 路线服务提供商:

class RouteServiceProvider extends ServiceProvider
{
    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot()
    {
        if (app()->environment('local')) {
            $this->mapMailableRoutes();
        }
    }

    /**
     * Render mailables in the browser.
     *
     * @return void
     */
    protected function mapMailableRoutes()
    {
        Route::prefix('mailable')
            ->group(base_path('routes/mailable.php'));
    }
}

想要了解更多技术文章,您可以在 Linkedin 或 X 上关注我。

免费监控您的 Laravel 应用程序

Inspector是专门为软件开发人员设计的代码执行监控工具。您不需要在服务器级别安装任何东西,只需安装 Laravel 包 就可以开始了。

如果您正在寻找 HTTP 监控、数据库查询见解以及将警报和通知转发到您首选消息传递环境的功能,请免费尝试 Inspector。注册您的帐户。

或者在网站上了解更多信息:https://inspector.dev

Laravel Mailable Tutorial

版本聲明 本文轉載於:https://dev.to/inspector/laravel-mailable-tutorial-59o0?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 重新學習CS基礎知識-實作佇列
    重新學習CS基礎知識-實作佇列
    你曾經站在隊列中嗎,隊列資料結構也做同樣的事情。當你想在你最喜歡的自助餐廳點餐時,你站在隊伍的最後,然後你就可以繼續排隊並離開。 CS 中的佇列資料結構執行相同的功能。佇列資料結構是先進先出的資料結構。佇列資料結構可以使用兩個基本函數 Enqueue 和 Dequeue 來構建,這兩個函數基本上是...
    程式設計 發佈於2024-11-09
  • 為 Angular 18 設定 linter 和 IDE
    為 Angular 18 設定 linter 和 IDE
    將 eslint、prettier、env 加入應用程式。 遺憾的是,Angular 預設不會自行產生這一切。更改原理圖可以提高數千個 Angular 專案的品質。 設定 eslint 9 連結 eslint: yarn ng add @angular-eslint/schema...
    程式設計 發佈於2024-11-09
  • 使用 JavaScript 進行網頁抓取和代理設定的初學者指南
    使用 JavaScript 進行網頁抓取和代理設定的初學者指南
    使用JavaScript程式碼模擬使用者操作,以取得所需資訊。包括模擬使用者開啟網頁、點擊連結、輸入關鍵字等操作,並從網頁中提取所需資訊。 Javascript網頁抓取的核心原理 使用JavaScript程式碼模擬使用者操作來取得所需資訊。包括模擬使用者開啟網頁、點擊連結、輸入關鍵...
    程式設計 發佈於2024-11-09
  • 在 Android 上運行 Llama:使用 Ollama 的逐步指南
    在 Android 上運行 Llama:使用 Ollama 的逐步指南
    Llama 3.2 最近在 Meta 開發者大會上推出,展示了令人印象深刻的多模式功能以及針對使用高通和聯發科技硬體的行動裝置進行最佳化的版本。這項突破使開發人員能夠在行動裝置上運行 Llama 3.2 等強大的 AI 模型,為更高效、私密和響應迅速的 AI 應用程式鋪平道路。 Meta 發布了 ...
    程式設計 發佈於2024-11-09
  • 如何在 Python 中格式化字串以將它們對齊直列?
    如何在 Python 中格式化字串以將它們對齊直列?
    以固定寬度列印字串列印字串時,將它們對齊成直列可以增強可讀性。在 Python 中使用 format 或 f-string 提供了實現此目的的便捷方法。 使用 str.format()str.format() 提供了一個簡單的填充方法字串。其語法包括佔位符 {},後跟格式化表達式。對於左對齊,請使用...
    程式設計 發佈於2024-11-09
  • 為什麼微服務比單體架構重要
    為什麼微服務比單體架構重要
    在當今快節奏的技術環境中,企業需要可擴展且靈活的解決方案來快速適應不斷變化的需求。與傳統的整體方法相比,這就是微服務架構的亮點。 1.什麼是單體架構? 單體架構是一個單一的、統一的系統,其中所有元件都是互連和相互依賴的。這意味著對系統的任何更改或更新都需要重新建置和重新部署整個應用...
    程式設計 發佈於2024-11-09
  • 如何在 PHP 中存取物件屬性:了解語法和錯誤解決方案
    如何在 PHP 中存取物件屬性:了解語法和錯誤解決方案
    瞭解 PHP 物件屬性存取在 PHP 中,存取物件屬性對於處理複雜的資料結構至關重要。屬性保存與物件關聯的信息,使我們能夠管理和操作該數據。 存取物件屬性有兩種常用語法:1。 $property1此語法直接透過名稱存取特定屬性。它用於分配或檢索各個屬性的值。但是,這種方法要求您事先知道確切的屬性名稱...
    程式設計 發佈於2024-11-09
  • PDO如何防止SQL注入並取代轉義單引號?
    PDO如何防止SQL注入並取代轉義單引號?
    PDO防止SQL注入的方法如果你已經從mysql函式庫過渡到PDO,你可能想知道如何取代real_escape_string來轉義發往資料庫的字串中的單引號的函數。雖然向每個字串添加斜杠可能看起來很麻煩,但 PDO 提供了一種更有效的替代方案。 PDO 準備的強大功能為了防止 SQL 注入,PDO ...
    程式設計 發佈於2024-11-09
  • 透過「專案:使用互斥體同步多執行緒列印」課程釋放您的編碼潛力
    透過「專案:使用互斥體同步多執行緒列印」課程釋放您的編碼潛力
    您準備好深入多執行緒程式設計的世界並學習如何使用互斥體來同步字串的列印了嗎? LabEx 提供的項目:使用互斥體同步多執行緒列印課程就是您的最佳選擇。 在這個基於專案的綜合課程中,您將踏上了解互斥體在協調多執行緒執行方面的重要性的旅程。您將首先修改現有的「混沌打字機」程序,確保字串以正確的順序列印...
    程式設計 發佈於2024-11-09
  • 為什麼我在 MySQL 中收到「\'create_date\'時間戳欄位的預設值無效」錯誤?
    為什麼我在 MySQL 中收到「\'create_date\'時間戳欄位的預設值無效」錯誤?
    “create_date”時間戳字段的預設值無效建立帶有時間戳列的表並指定預設值“0000-”時00-00 00:00:00',可能會出現錯誤,指示「'create_date'的預設值無效」。這個錯誤是由 MySQL 的 SQL 模式 - NO_ZERO_DATE 所造成的。...
    程式設計 發佈於2024-11-09
  • 儘管出現「頁面已移動」錯誤,如何使用 cURL 檢索頁面內容?
    儘管出現「頁面已移動」錯誤,如何使用 cURL 檢索頁面內容?
    使用 cURL 檢索頁面內容在此上下文中,您試圖使用 cURL 抓取 Google 搜尋結果頁面的內容。儘管嘗試設定使用者代理程式和各種選項,但您仍無法成功檢索頁面內容。重定向或“頁面移動”錯誤繼續困擾著您。 據信此問題可能源自於查詢字串中特殊字元的編碼。為了緩解這種情況,需要更改 PHP 程式碼。...
    程式設計 發佈於2024-11-09
  • 如何使用 JPA 和 Hibernate 以 UTC 格式儲存日期/時間?
    如何使用 JPA 和 Hibernate 以 UTC 格式儲存日期/時間?
    使用JPA 和Hibernate 在UTC 時區儲存日期/時間在JPA/ 中處理日期和時間時擔心時區差異休眠應用程式?本文探討如何在 UTC (GMT) 時區有效儲存和檢索時態數據,確保跨不同時區進行一致且準確的處理。 考慮以下附註的 JPA 實體:public class Event { ...
    程式設計 發佈於2024-11-09
  • 如何使用 CSS 建立動態擴充的文字輸入欄位?
    如何使用 CSS 建立動態擴充的文字輸入欄位?
    透過 CSS 增強文字輸入回應能力製作 Web 表單時,控製文字輸入欄位的大小至關重要。 CSS 提供了一種簡單的方法來定義其初始尺寸。但是,如果您希望輸入隨著使用者鍵入而動態擴展並達到最大寬度,該怎麼辦?本文深入研究了僅 CSS 和基於 HTML 的技術來實現此行為。 CSS 和內容可編輯利用 C...
    程式設計 發佈於2024-11-09
  • 關於 Javascript Promise 的有趣事實
    關於 Javascript Promise 的有趣事實
    Promise 始終是異步的 Promise 的回呼總是在同步程式碼之後執行 const promise = Promise.resolve(); promise.then(() => console.log('async')); console.log('sync');...
    程式設計 發佈於2024-11-09
  • LightFlow:Go 的任務編排框架
    LightFlow:Go 的任務編排框架
    我發展了 LightFlow,一個任務編排框架,旨在簡化 Go 中複雜工作流程的管理。它專注於執行時序並減少對外部設定檔的需求。 主要特點: 獨立上下文:每個步驟都通過獨立上下文鏈接,僅允許訪問相關數據。 可合併流程:您可以靈活組合任務流程,以便在不同流程中重複使用。 檢查點恢...
    程式設計 發佈於2024-11-09

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3