Laravel 5.3郵件發送擴展:自定義數據庫郵件日誌
Laravel 5.3 提供了一種簡單的方法來配置和通過多種流行服務發送電子郵件,並包含一個用於開發的日誌輔助程序。然而,它並不涵蓋所有可用的服務,因此可能需要擴展現有的郵件驅動程序系統。
關鍵要點:
IlluminateMailMailServiceProvider
,允許 register
方法已被實現。這允許創建新的傳輸管理器,該管理器可以將 Swift mailer 實例綁定到容器。 config/app.php
文件中的提供程序列表中,並將郵件驅動程序註冊到 config/mail.php
文件中的 db
中。 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,它變得更加簡單(但舊語法仍然有效)。
以下是一個示例:
<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
類並定義了 boot
和 register
方法。您可以在文檔中閱讀更多關於提供程序的信息。
與其使用父服務提供程序類,我們可以採取捷徑並擴展現有的 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
命名空間,您會發現每個驅動程序的不同傳輸類(例如:LogTransport
、SparkPostTransport
等)。
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
表記錄。
在本文中,我們看到瞭如何擴展郵件驅動程序系統以攔截電子郵件以進行調試。我在 Laravel 中欣賞的一件事是其無與倫比的可擴展性:您可以更改或擴展從路由器和 IOC 到郵件及其他幾乎所有功能。
如果您有任何問題或意見,請務必在下面發表,我會盡力回答!
擴展 Laravel 5.3 中的郵件驅動程序涉及創建新的服務提供程序。此服務提供程序將擴展現有的郵件驅動程序,並允許您添加其他功能。您可以使用 php artisan make:provider
命令創建新的服務提供程序。創建提供程序後,您可以將其註冊到 config/app.php
文件中。在提供程序中,您可以使用 extend
方法將自定義功能添加到郵件驅動程序。
Laravel 中的郵件日誌記錄是一個允許您跟踪應用程序發送的所有傳出電子郵件的功能。這對於調試非常有用,因為它允許您準確查看正在發送哪些電子郵件、何時發送以及發送給誰。它也對審計非常有用,因為它提供了應用程序發送的所有電子郵件通信的記錄。
要配置 Laravel 以記錄所有傳出電子郵件,您需要修改 config/mail.php
文件。在此文件中,您可以將 log
選項設置為 true
。這將指示 Laravel 記錄所有傳出電子郵件。日誌將存儲在 storage/logs
目錄中。
Laravel 中的郵件日誌存儲在 storage/logs
目錄中。您可以通過導航到此目錄並打開日誌文件來查看這些日誌。日誌文件根據日期命名,因此您可以輕鬆找到特定日期的日誌。
是的,您可以自定義 Laravel 中郵件日誌的格式。這可以通過擴展郵件驅動程序並覆蓋 log
方法來完成。在此方法中,您可以指定日誌消息的格式。
(其餘FAQ與郵件發送本身相關,與本例的郵件日誌擴展無關,故省略)
請注意,圖片路徑 /uploads/20250210/173915090467a9563807841.webp
和 /uploads/20250210/173915090467a9563839bfc.webp
以及 /uploads/20250210/173915090667a9563a27b41.jpg
需要替換為實際可訪問的圖片鏈接。
以上是Laravel 5.3中的郵件記錄:擴展郵件驅動程序的詳細內容。更多資訊請關注PHP中文網其他相關文章!