首頁 >後端開發 >php教程 >Laravel 5.3中的郵件記錄:擴展郵件驅動程序

Laravel 5.3中的郵件記錄:擴展郵件驅動程序

William Shakespeare
William Shakespeare原創
2025-02-10 11:00:16853瀏覽

Laravel 5.3郵件發送擴展:自定義數據庫郵件日誌

Laravel 5.3 提供了一種簡單的方法來配置和通過多種流行服務發送電子郵件,並包含一個用於開發的日誌輔助程序。然而,它並不涵蓋所有可用的服務,因此可能需要擴展現有的郵件驅動程序系統。

關鍵要點:

  • Laravel 5.3 提供了通過多種流行服務輕鬆配置和發送電子郵件的簡便方法,並包含用於開發的日誌輔助程序。但是,它並不涵蓋所有可用的服務,因此可能需要擴展現有的郵件驅動程序系統。
  • 要擴展郵件驅動程序系統,可以使用 artisan 命令行助手創建一個新的服務提供程序。此服務提供程序在啟動時與應用程序交互並註冊服務。
  • 新的服務提供程序可以擴展現有的 IlluminateMailMailServiceProvider,允許 register 方法已被實現。這允許創建新的傳輸管理器,該管理器可以將 Swift mailer 實例綁定到容器。
  • 擴展的郵件驅動程序系統可用於將電子郵件記錄到數據庫表中以進行調試。這是通過為數據庫表創建一個新的遷移和一個新的模型來與表交互來實現的。然後將提供程序添加到 config/app.php 文件中的提供程序列表中,並將郵件驅動程序註冊到 config/mail.php 文件中的 db 中。

Mail Logging in Laravel 5.3: Extending the Mail Driver

Laravel 提供了許多實用功能,其中包括郵件發送功能。您可以輕鬆配置並通過多種流行服務發送電子郵件,它甚至包含用於開發的日誌輔助程序。

<code class="language-php">Mail::send('emails.welcome', ['user' => $user], function ($m) use ($user) {
    $m->to($user->email, $user->name)->subject('Welcome to the website');
});</code>

這將使用 emails.welcome 視圖向網站上的新註冊用戶發送電子郵件。使用 Laravel 5.3 中的 Mailable,它變得更加簡單(但舊語法仍然有效)。

Mail Logging in Laravel 5.3: Extending the Mail Driver

以下是一個示例:

<code class="language-bash"># 生成一个新的可邮件类
php artisan make:mail WelcomeMail</code>
<code class="language-php">// app/Mail/WelcomeMail.php

class WelcomeUser extends Mailable
{
    use Queueable, SerializesModels;

    public $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }

    public function build()
    {
        return $this->view('emails.welcome');
    }
}</code>
<code class="language-php">// routes/web.php

Route::get('/', function () {
    $user = User::find(2);

    \Mail::to($user->email)->send(new WelcomeUser($user));

    return "done";
});</code>

Laravel 還提供了一個良好的起點,用於在開發階段使用日誌驅動程序發送郵件,在生產階段使用 smtp、sparkpost、mailgun 等。在大多數情況下,這似乎很好,但它無法涵蓋所有可用的服務!在本教程中,我們將學習如何擴展現有的郵件驅動程序系統以添加我們自己的驅動程序。

為了使我們的示例簡單明了,我們將郵件日誌記錄到數據庫表中。

創建服務提供程序

實現此目的的首選方法是創建一個服務提供程序,以便在啟動時與我們的應用程序交互並註冊我們的服務。讓我們首先使用 artisan 命令行助手生成一個新的服務提供程序。

<code class="language-php">Mail::send('emails.welcome', ['user' => $user], function ($m) use ($user) {
    $m->to($user->email, $user->name)->subject('Welcome to the website');
});</code>

這將在我們的 app/Providers 文件夾中創建一個新的類。如果您熟悉 Laravel 服務提供程序,您將知道我們擴展了 ServiceProvider 類並定義了 bootregister 方法。您可以在文檔中閱讀更多關於提供程序的信息。

使用郵件提供程序

與其使用父服務提供程序類,我們可以採取捷徑並擴展現有的 IlluminateMailMailServiceProvider。這意味著 register 方法已實現。

<code class="language-bash"># 生成一个新的可邮件类
php artisan make:mail WelcomeMail</code>

registerSwiftMailer 方法將根據 mail.driver 配置值返回相應的傳輸驅動程序。我們在這裡可以做的是在調用 registerSwiftMailer 父方法之前執行檢查並返回我們自己的 傳輸管理器

<code class="language-php">// app/Mail/WelcomeMail.php

class WelcomeUser extends Mailable
{
    use Queueable, SerializesModels;

    public $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }

    public function build()
    {
        return $this->view('emails.welcome');
    }
}</code>

使用傳輸管理器

Laravel 從 IOC 解析 swift.mailer 實例,它應該返回 Swift_Mailer 的 SwiftMailer 實例。我們需要將我們的 Swift mailer 實例綁定到容器。

<code class="language-php">// routes/web.php

Route::get('/', function () {
    $user = User::find(2);

    \Mail::to($user->email)->send(new WelcomeUser($user));

    return "done";
});</code>

您可以將傳輸對象視為實際的驅動程序。如果您檢查 IlluminateMailTransport 命名空間,您會發現每個驅動程序的不同傳輸類(例如:LogTransportSparkPostTransport 等)。

Swift_Mailer 類需要一個 Swift_Transport 實例,我們可以通過擴展 IlluminateMailTransportTransport 類來滿足它。它應該看起來像這樣。

<code class="language-bash">php artisan make:provider DBMailProvider</code>

我們應該在這裡實現的唯一方法是 send 方法。它負責郵件發送邏輯,在這種情況下,它應該將我們的電子郵件記錄到數據庫中。至於我們的構造函數,我們目前可以將其留空,因為我們不需要任何外部依賴項。

$message->getTo() 方法始終返回收件人電子郵件和名稱的關聯數組。我們使用 array_keys 函數獲取電子郵件列表,然後將它們合併以獲取字符串。

將電子郵件記錄到數據庫

下一步是為我們的數據庫表創建必要的遷移。

<code class="language-php">// vendor/Illuminate/Mail/MailServiceProvider.php

public function register()
{
    $this->registerSwiftMailer();

    // ...
}</code>
<code class="language-php">// app/Providers/DBMailProvider.php

function registerSwiftMailer()
{
    if ($this->app['config']['mail.driver'] == 'db') {
        $this->registerDBSwiftMailer();
    } else {
        parent::registerSwiftMailer();
    }
}</code>

我們的遷移只包含電子郵件正文、主題和收件人電子郵件,但您可以根據需要添加更多詳細信息。檢查 Swift_Mime_Message 類定義以查看可用字段的列表。

現在,我們需要創建一個新的模型來與我們的表交互,並將必要的字段添加到 fillable 數組中。

<code class="language-php">Mail::send('emails.welcome', ['user' => $user], function ($m) use ($user) {
    $m->to($user->email, $user->name)->subject('Welcome to the website');
});</code>
<code class="language-bash"># 生成一个新的可邮件类
php artisan make:mail WelcomeMail</code>

發送電子郵件

好的,現在是時候測試我們到目前為止所取得的成果了。我們首先將我們的提供程序添加到 config/app.php 文件中的提供程序列表中。

<code class="language-php">// app/Mail/WelcomeMail.php

class WelcomeUser extends Mailable
{
    use Queueable, SerializesModels;

    public $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }

    public function build()
    {
        return $this->view('emails.welcome');
    }
}</code>

然後我們將郵件驅動程序註冊到 config/mail.php 文件中的 db 中。

<code class="language-php">// routes/web.php

Route::get('/', function () {
    $user = User::find(2);

    \Mail::to($user->email)->send(new WelcomeUser($user));

    return "done";
});</code>

唯一剩下的部分是發送測試電子郵件並檢查它是否被記錄到數據庫中。我將在訪問主頁 URL 時發送電子郵件。以下是代碼。

<code class="language-bash">php artisan make:provider DBMailProvider</code>

訪問主頁路由後,我們可以運行 php artisan tinker 命令來檢查 emails 表記錄。

Mail Logging in Laravel 5.3: Extending the Mail Driver

結論

在本文中,我們看到瞭如何擴展郵件驅動程序系統以攔截電子郵件以進行調試。我在 Laravel 中欣賞的一件事是其無與倫比的可擴展性:您可以更改或擴展從路由器和 IOC 到郵件及其他幾乎所有功能。

如果您有任何問題或意見,請務必在下面發表,我會盡力回答!

關於 Laravel 5.3 中郵件日誌記錄的常見問題解答 (FAQ)

如何擴展 Laravel 5.3 中的郵件驅動程序?

擴展 Laravel 5.3 中的郵件驅動程序涉及創建新的服務提供程序。此服務提供程序將擴展現有的郵件驅動程序,並允許您添加其他功能。您可以使用 php artisan make:provider 命令創建新的服務提供程序。創建提供程序後,您可以將其註冊到 config/app.php 文件中。在提供程序中,您可以使用 extend 方法將自定義功能添加到郵件驅動程序。

Laravel 中郵件日誌記錄的目的是什麼?

Laravel 中的郵件日誌記錄是一個允許您跟踪應用程序發送的所有傳出電子郵件的功能。這對於調試非常有用,因為它允許您準確查看正在發送哪些電子郵件、何時發送以及發送給誰。它也對審計非常有用,因為它提供了應用程序發送的所有電子郵件通信的記錄。

如何配置 Laravel 以記錄所有傳出電子郵件?

要配置 Laravel 以記錄所有傳出電子郵件,您需要修改 config/mail.php 文件。在此文件中,您可以將 log 選項設置為 true。這將指示 Laravel 記錄所有傳出電子郵件。日誌將存儲在 storage/logs 目錄中。

如何查看 Laravel 中的郵件日誌?

Laravel 中的郵件日誌存儲在 storage/logs 目錄中。您可以通過導航到此目錄並打開日誌文件來查看這些日誌。日誌文件根據日期命名,因此您可以輕鬆找到特定日期的日誌。

我可以自定義 Laravel 中郵件日誌的格式嗎?

是的,您可以自定義 Laravel 中郵件日誌的格式。這可以通過擴展郵件驅動程序並覆蓋 log 方法來完成。在此方法中,您可以指定日誌消息的格式。

(其餘FAQ與郵件發送本身相關,與本例的郵件日誌擴展無關,故省略)

請注意,圖片路徑 /uploads/20250210/173915090467a9563807841.webp/uploads/20250210/173915090467a9563839bfc.webp 以及 /uploads/20250210/173915090667a9563a27b41.jpg 需要替換為實際可訪問的圖片鏈接。

以上是Laravel 5.3中的郵件記錄:擴展郵件驅動程序的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:PHP的美味弊端下一篇:PHP的美味弊端