”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Laravel 可邮寄教程

Laravel 可邮寄教程

发布于2024-11-08
浏览:157

在 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]删除
最新教程 更多>
  • 解决Spring Security 4.1及以上版本CORS问题指南
    解决Spring Security 4.1及以上版本CORS问题指南
    弹簧安全性cors filter:故障排除常见问题 在将Spring Security集成到现有项目中时,您可能会遇到与CORS相关的错误,如果像“访问Control-allo-allow-Origin”之类的标头,则无法设置在响应中。为了解决此问题,您可以实现自定义过滤器,例如代码段中的MyFi...
    编程 发布于2025-05-10
  • 如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    从python import codecs import codecs import codecs 导入 text = codecs.decode('这狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#带有...
    编程 发布于2025-05-10
  • 如何实时捕获和流媒体以进行聊天机器人命令执行?
    如何实时捕获和流媒体以进行聊天机器人命令执行?
    在开发能够执行命令的chatbots的领域中,实时从命令执行实时捕获Stdout,一个常见的需求是能够检索和显示标准输出(stdout)在cath cath cant cant cant cant cant cant cant cant interfaces in Chate cant inter...
    编程 发布于2025-05-10
  • 如何使用“ JSON”软件包解析JSON阵列?
    如何使用“ JSON”软件包解析JSON阵列?
    parsing JSON与JSON软件包 QUALDALS:考虑以下go代码:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    编程 发布于2025-05-10
  • 如何使用组在MySQL中旋转数据?
    如何使用组在MySQL中旋转数据?
    在关系数据库中使用mySQL组使用mySQL组进行查询结果,在关系数据库中使用MySQL组,转移数据的数据是指重新排列的行和列的重排以增强数据可视化。在这里,我们面对一个共同的挑战:使用组的组将数据从基于行的基于列的转换为基于列。 Let's consider the following ...
    编程 发布于2025-05-10
  • 如何在Chrome中居中选择框文本?
    如何在Chrome中居中选择框文本?
    选择框的文本对齐:局部chrome-inly-ly-ly-lyly solument 您可能希望将文本中心集中在选择框中,以获取优化的原因或提高可访问性。但是,在CSS中的选择元素中手动添加一个文本 - 对属性可能无法正常工作。初始尝试 state)</option> < op...
    编程 发布于2025-05-10
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-05-10
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-05-10
  • C++中如何将独占指针作为函数或构造函数参数传递?
    C++中如何将独占指针作为函数或构造函数参数传递?
    在构造函数和函数中将唯一的指数管理为参数 unique pointers( unique_ptr [2启示。通过值: base(std :: simelor_ptr n) :next(std :: move(n)){} 此方法将唯一指针的所有权转移到函数/对象。指针的内容被移至功能中,在操作...
    编程 发布于2025-05-10
  • 反射动态实现Go接口用于RPC方法探索
    反射动态实现Go接口用于RPC方法探索
    在GO 使用反射来实现定义RPC式方法的界面。例如,考虑一个接口,例如:键入myService接口{ 登录(用户名,密码字符串)(sessionId int,错误错误) helloworld(sessionid int)(hi String,错误错误) } 替代方案而不是依靠反射...
    编程 发布于2025-05-10
  • 为什么我的CSS背景图像出现?
    为什么我的CSS背景图像出现?
    故障排除:CSS背景图像未出现 ,您的背景图像尽管遵循教程说明,但您的背景图像仍未加载。图像和样式表位于相同的目录中,但背景仍然是空白的白色帆布。而不是不弃用的,您已经使用了CSS样式: bockent {背景:封闭图像文件名:背景图:url(nickcage.jpg); 如果您的html,css...
    编程 发布于2025-05-10
  • 对象拟合:IE和Edge中的封面失败,如何修复?
    对象拟合:IE和Edge中的封面失败,如何修复?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    编程 发布于2025-05-10
  • 在Pandas中如何将年份和季度列合并为一个周期列?
    在Pandas中如何将年份和季度列合并为一个周期列?
    pandas data frame thing commans date lay neal and pree pree'和pree pree pree”,季度 2000 q2 这个目标是通过组合“年度”和“季度”列来创建一个新列,以获取以下结果: [python中的concate...
    编程 发布于2025-05-10
  • 哪种在JavaScript中声明多个变量的方法更可维护?
    哪种在JavaScript中声明多个变量的方法更可维护?
    在JavaScript中声明多个变量:探索两个方法在JavaScript中,开发人员经常遇到需要声明多个变量的需要。对此的两种常见方法是:在单独的行上声明每个变量: 当涉及性能时,这两种方法本质上都是等效的。但是,可维护性可能会有所不同。 第一个方法被认为更易于维护。每个声明都是其自己的语句,使其...
    编程 发布于2025-05-10
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案:的,请访问量很大,并应为procectiquiestate的,并在整个代码上正确格式不多: java.text.simpledateformat; 导入java.util.calendar; 导入java...
    编程 发布于2025-05-10

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3