目录
创建服务提供程序
使用邮件提供程序
使用传输管理器
将电子邮件记录到数据库
发送电子邮件
结论
关于 Laravel 5.3 中邮件日志记录的常见问题解答 (FAQ)
如何扩展 Laravel 5.3 中的邮件驱动程序?
Laravel 中邮件日志记录的目的是什么?
如何配置 Laravel 以记录所有传出电子邮件?
如何查看 Laravel 中的邮件日志?
我可以自定义 Laravel 中邮件日志的格式吗?
首页 后端开发 php教程 Laravel 5.3中的邮件记录:扩展邮件驱动程序

Laravel 5.3中的邮件记录:扩展邮件驱动程序

Feb 10, 2025 am 11:00 AM

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 提供了许多实用功能,其中包括邮件发送功能。您可以轻松配置并通过多种流行服务发送电子邮件,它甚至包含用于开发的日志辅助程序。

Mail::send('emails.welcome', ['user' => $user], function ($m) use ($user) {
    $m->to($user->email, $user->name)->subject('Welcome to the website');
});
登录后复制
登录后复制
登录后复制

这将使用 emails.welcome 视图向网站上的新注册用户发送电子邮件。使用 Laravel 5.3 中的 Mailable,它变得更加简单(但旧语法仍然有效)。

Mail Logging in Laravel 5.3: Extending the Mail Driver

以下是一个示例:

# 生成一个新的可邮件类
php artisan make:mail WelcomeMail
登录后复制
登录后复制
登录后复制
// 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');
    }
}
登录后复制
登录后复制
登录后复制
// routes/web.php

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

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

    return "done";
});
登录后复制
登录后复制
登录后复制

Laravel 还提供了一个良好的起点,用于在开发阶段使用日志驱动程序发送邮件,在生产阶段使用 smtp、sparkpost、mailgun 等。在大多数情况下,这似乎很好,但它无法涵盖所有可用的服务!在本教程中,我们将学习如何扩展现有的邮件驱动程序系统以添加我们自己的驱动程序。

为了使我们的示例简单明了,我们将邮件日志记录到数据库表中。

创建服务提供程序

实现此目的的首选方法是创建一个服务提供程序,以便在启动时与我们的应用程序交互并注册我们的服务。让我们首先使用 artisan 命令行助手生成一个新的服务提供程序。

Mail::send('emails.welcome', ['user' => $user], function ($m) use ($user) {
    $m->to($user->email, $user->name)->subject('Welcome to the website');
});
登录后复制
登录后复制
登录后复制

这将在我们的 app/Providers 文件夹中创建一个新的类。如果您熟悉 Laravel 服务提供程序,您将知道我们扩展了 ServiceProvider 类并定义了 bootregister 方法。您可以在文档中阅读更多关于提供程序的信息。

使用邮件提供程序

与其使用父服务提供程序类,我们可以采取捷径并扩展现有的 IlluminateMailMailServiceProvider。这意味着 register 方法已实现。

# 生成一个新的可邮件类
php artisan make:mail WelcomeMail
登录后复制
登录后复制
登录后复制

registerSwiftMailer 方法将根据 mail.driver 配置值返回相应的传输驱动程序。我们在这里可以做的是在调用 registerSwiftMailer 父方法之前执行检查并返回我们自己的 传输管理器

// 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');
    }
}
登录后复制
登录后复制
登录后复制

使用传输管理器

Laravel 从 IOC 解析 swift.mailer 实例,它应该返回 Swift_Mailer 的 SwiftMailer 实例。我们需要将我们的 Swift mailer 实例绑定到容器。

// routes/web.php

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

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

    return "done";
});
登录后复制
登录后复制
登录后复制

您可以将传输对象视为实际的驱动程序。如果您检查 IlluminateMailTransport 命名空间,您会发现每个驱动程序的不同传输类(例如:LogTransportSparkPostTransport 等)。

Swift_Mailer 类需要一个 Swift_Transport 实例,我们可以通过扩展 IlluminateMailTransportTransport 类来满足它。它应该看起来像这样。

php artisan make:provider DBMailProvider
登录后复制
登录后复制

我们应该在这里实现的唯一方法是 send 方法。它负责邮件发送逻辑,在这种情况下,它应该将我们的电子邮件记录到数据库中。至于我们的构造函数,我们目前可以将其留空,因为我们不需要任何外部依赖项。

$message->getTo() 方法始终返回收件人电子邮件和名称的关联数组。我们使用 array_keys 函数获取电子邮件列表,然后将它们合并以获取字符串。

将电子邮件记录到数据库

下一步是为我们的数据库表创建必要的迁移。

// vendor/Illuminate/Mail/MailServiceProvider.php

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

    // ...
}
登录后复制
// app/Providers/DBMailProvider.php

function registerSwiftMailer()
{
    if ($this->app['config']['mail.driver'] == 'db') {
        $this->registerDBSwiftMailer();
    } else {
        parent::registerSwiftMailer();
    }
}
登录后复制

我们的迁移只包含电子邮件正文、主题和收件人电子邮件,但您可以根据需要添加更多详细信息。检查 Swift_Mime_Message 类定义以查看可用字段的列表。

现在,我们需要创建一个新的模型来与我们的表交互,并将必要的字段添加到 fillable 数组中。

Mail::send('emails.welcome', ['user' => $user], function ($m) use ($user) {
    $m->to($user->email, $user->name)->subject('Welcome to the website');
});
登录后复制
登录后复制
登录后复制
# 生成一个新的可邮件类
php artisan make:mail WelcomeMail
登录后复制
登录后复制
登录后复制

发送电子邮件

好的,现在是时候测试我们到目前为止所取得的成果了。我们首先将我们的提供程序添加到 config/app.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');
    }
}
登录后复制
登录后复制
登录后复制

然后我们将邮件驱动程序注册到 config/mail.php 文件中的 db 中。

// routes/web.php

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

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

    return "done";
});
登录后复制
登录后复制
登录后复制

唯一剩下的部分是发送测试电子邮件并检查它是否被记录到数据库中。我将在访问主页 URL 时发送电子邮件。以下是代码。

php artisan make:provider DBMailProvider
登录后复制
登录后复制

访问主页路由后,我们可以运行 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

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

在PHP API中说明JSON Web令牌(JWT)及其用例。 在PHP API中说明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话如何劫持工作,如何在PHP中减轻它? 会话如何劫持工作,如何在PHP中减轻它? Apr 06, 2025 am 12:02 AM

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

描述扎实的原则及其如何应用于PHP的开发。 描述扎实的原则及其如何应用于PHP的开发。 Apr 03, 2025 am 12:04 AM

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

在PHPStorm中如何进行CLI模式的调试? 在PHPStorm中如何进行CLI模式的调试? Apr 01, 2025 pm 02:57 PM

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

框架安全功能:防止漏洞。 框架安全功能:防止漏洞。 Mar 28, 2025 pm 05:11 PM

文章讨论了框架中的基本安全功能,以防止漏洞,包括输入验证,身份验证和常规更新。

如何在系统重启后自动设置unixsocket的权限? 如何在系统重启后自动设置unixsocket的权限? Mar 31, 2025 pm 11:54 PM

如何在系统重启后自动设置unixsocket的权限每次系统重启后,我们都需要执行以下命令来修改unixsocket的权限:sudo...

PHP 8.1中的枚举(枚举)是什么? PHP 8.1中的枚举(枚举)是什么? Apr 03, 2025 am 12:05 AM

PHP8.1中的枚举功能通过定义命名常量增强了代码的清晰度和类型安全性。1)枚举可以是整数、字符串或对象,提高了代码可读性和类型安全性。2)枚举基于类,支持面向对象特性,如遍历和反射。3)枚举可用于比较和赋值,确保类型安全。4)枚举支持添加方法,实现复杂逻辑。5)严格类型检查和错误处理可避免常见错误。6)枚举减少魔法值,提升可维护性,但需注意性能优化。

See all articles