0

0

Laravel邮件功能?邮件如何发送配置?

星降

星降

发布时间:2025-09-03 09:09:02

|

569人浏览过

|

来源于php中文网

原创

Laravel邮件功能通过Mailable类和Mail门面实现,配置在.env文件中设置MAIL_MAILER、SMTP参数及发件人信息,使用php artisan make:mail创建邮件类,定义envelope、content方法指定主题和视图,Blade模板渲染内容,通过Mail::to()->send()发送,支持queue()异步队列,常用驱动包括SMTP、Mailgun、SES、log、array、null,适用于不同环境,调试时可借助日志、Mailtrap工具、服务商日志及队列监控,确保邮件正确发送。

laravel邮件功能?邮件如何发送配置?

Laravel的邮件功能是其框架的核心服务之一,通过

Mailable
类和
Mail
facade提供了一套优雅且强大的邮件发送机制。配置主要涉及
config/mail.php
文件,指定驱动(如SMTP、Mailgun、SES等)和相应的凭证,然后就可以轻松地构建邮件内容并发送了。它极大地简化了开发者在应用中集成邮件发送的复杂性。

解决方案

在Laravel中发送邮件,通常需要几个核心步骤。首先,是配置你的邮件服务。这通常在

.env
文件中完成,因为这些配置通常是环境敏感的。你需要设置
MAIL_MAILER
来指定你使用的邮件驱动,比如
smtp
mailgun
ses
log
。对于SMTP,你还需要提供
MAIL_HOST
MAIL_PORT
MAIL_USERNAME
MAIL_PASSWORD
MAIL_ENCRYPTION
。别忘了设置
MAIL_FROM_ADDRESS
MAIL_FROM_NAME
,这会影响邮件的“发件人”显示。

MAIL_MAILER=smtp
MAIL_HOST=smtp.mailtrap.io # 或者是你实际的SMTP服务器,比如smtp.gmail.com
MAIL_PORT=2525 # 或者是你的SMTP端口,比如465或587
MAIL_USERNAME=your_username
MAIL_PASSWORD=your_password
MAIL_ENCRYPTION=tls # 或者ssl,或者null
MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"

配置好之后,下一步是创建一个

Mailable
类。这可以通过Artisan命令完成:

php artisan make:mail WelcomeEmail

这个命令会在

app/Mail
目录下生成一个
WelcomeEmail.php
文件。在这个
Mailable
类中,你可以定义邮件的内容、视图、附件以及任何需要传递给视图的数据。通常,你会有一个
build
方法,它返回一个视图:

userName = $userName;
    }

    /**
     * Get the message envelope.
     */
    public function envelope(): Envelope
    {
        return new Envelope(
            subject: '欢迎来到我们的平台!',
        );
    }

    /**
     * Get the message content definition.
     */
    public function content(): Content
    {
        return new Content(
            view: 'emails.welcome', // 指向你的Blade视图文件
            with: [
                'name' => $this->userName,
            ],
        );
    }

    /**
     * Get the attachments for the message.
     *
     * @return array
     */
    public function attachments(): array
    {
        return [];
    }
}

对应的Blade视图文件(例如

resources/views/emails/welcome.blade.php
)可以这样简单:

你好,{{ $name }}!

感谢你注册我们的服务。

最后,在你的控制器、服务或任何你想发送邮件的地方,使用

Mail
facade来发送它:

use App\Mail\WelcomeEmail;
use Illuminate\Support\Facades\Mail;

// ...
public function sendWelcomeEmail($user)
{
    Mail::to($user->email)->send(new WelcomeEmail($user->name));
    // 如果想发送到多个收件人,可以使用 Mail::to(['first@example.com', 'second@example.com'])->send(...)
    // 或者 Mail::to($user->email)->cc($ccEmail)->bcc($bccEmail)->send(...)
}

为了提高应用的响应速度,特别是对于大量邮件发送,强烈建议将邮件发送推送到队列中。只需要让你的

Mailable
类实现
ShouldQueue
接口:

class WelcomeEmail extends Mailable implements ShouldQueue
{
    // ...
}

然后发送方式就变成了:

Mail::to($user->email)->queue(new WelcomeEmail($user->name));

这样,邮件发送任务就会被交给队列处理,不会阻塞用户请求。

Laravel邮件配置中,常见的驱动类型有哪些,它们各自的适用场景是什么?

在Laravel的邮件配置中,我们有很多种驱动(Mailer Driver)可以选择,每种都有其独特的适用场景和优缺点。理解这些驱动能帮助我们为项目选择最合适的邮件发送方案。

1. SMTP (Simple Mail Transfer Protocol) 这是最传统的邮件发送方式。你需要提供一个SMTP服务器的地址、端口、用户名和密码。

  • 适用场景: 当你已经拥有一个邮件服务器(比如公司的Exchange服务器、Gmail的SMTP服务、或者你自己搭建的邮件服务器)时,SMTP是一个直接且普遍的选择。对于一些小型项目或内部系统,直接使用SMTP可能足够。
  • 个人看法: SMTP的配置相对直接,但有时候会遇到一些“坑”,比如邮件被标记为垃圾邮件,或者因为IP信誉问题导致发送失败。尤其是当你的应用需要发送大量邮件时,SMTP的可靠性和可扩展性可能会成为瓶颈。调试起来也可能比较麻烦,因为错误信息通常来自SMTP服务器,而不是Laravel本身。

2. Mailgun, Postmark, SES (Amazon Simple Email Service), SendGrid 等第三方服务 这些都是专业的事务性邮件服务提供商。它们提供了API接口,Laravel通过SDK或HTTP请求与它们交互。

  • 适用场景: 几乎所有生产环境下的应用都应该考虑使用这些服务。它们提供了高可靠性、高送达率、详细的发送日志和分析功能。特别适合发送大量通知、注册确认、密码重置等事务性邮件。
  • 个人看法: 我个人在生产环境中几乎总是倾向于使用这些第三方服务。它们不仅能保证邮件的送达率,还能提供强大的监控和调试工具。虽然需要支付一定费用,但相比于自己维护SMTP服务器或处理邮件被拒收的麻烦,这笔投入绝对是值得的。选择哪一个取决于你的预算、地域和对特定功能(如模板管理、A/B测试)的需求。

3. Log (日志驱动) 这个驱动不会真正发送邮件,而是将邮件内容写入Laravel的日志文件。

  • 适用场景: 主要用于开发环境和测试。你可以检查日志文件来确认邮件是否被正确渲染和构建,而无需实际发送邮件。
  • 个人看法: 在本地开发时,我经常将
    MAIL_MAILER
    设置为
    log
    。这能让我快速验证邮件内容和格式,而不用担心误发邮件或配置真实的邮件服务。

4. Array (数组驱动) 与Log驱动类似,Array驱动也不会发送邮件。它会将所有邮件存储在一个内存中的数组里。

  • 适用场景: 主要用于自动化测试。在单元测试或功能测试中,你可以检查这个数组来断言邮件是否被发送以及其内容。
  • 个人看法: 对于编写健壮的自动化测试,Array驱动是不可或缺的。它提供了一种无副作用的方式来测试邮件发送逻辑。

5. Null (空驱动) 这个驱动会简单地丢弃所有邮件,不进行任何操作。

  • 适用场景: 当你希望完全禁用邮件发送功能时。
  • 个人看法: 很少直接使用,但有时在某些特定环境下,比如一个暂时不需要邮件功能的测试分支,可以用来确保没有任何邮件被意外发送。

选择合适的驱动,关键在于平衡开发、测试和生产环境的需求。通常的流程是:开发时使用

log
array
,生产时使用专业的第三方邮件服务。

如何在Laravel中创建自定义的邮件模板并传递数据?

在Laravel中创建自定义邮件模板并向其传递数据是一个非常常见且实用的功能,它让邮件内容更加灵活和个性化。这个过程主要围绕

Mailable
类和Blade模板引擎展开。

首先,如前所述,你需要使用Artisan命令创建一个

Mailable
类:

迦恩计算机资源网源码(图书销售类)
迦恩计算机资源网源码(图书销售类)

采用三层架构开发,前台集成了产品在线展示,用户注册、在线调查、在线投稿后台有类别管理\图书管理\订单管理\会员管理\配送范围管理\邮件列表\广告管理\友情链接管理等后台添加图书时自动生成缩略图和文字水印主要参考了petshop的设计架构、使用了Asp.net2.0中很多MemberShip、master等新功能后台管理地址/web/admin/ 超级管理员账号密码均为aspx1特别提示:该系统需要

下载
php artisan make:mail OrderShipped

假设我们现在要发送一封订单发货通知邮件。在

app/Mail/OrderShipped.php
文件中,你可以定义邮件的主题、视图以及需要传递的数据。

1. 定义需要传递的数据:

Mailable
类的构造函数中接收你需要的数据,并将其存储为公共属性。Laravel会自动将这些公共属性暴露给你的Blade视图。

order = $order; // 将接收到的订单实例赋值给公共属性
    }

    // ... 其他方法
}

2. 定义邮件信封 (Envelope):

envelope()
方法中设置邮件的主题。

    /**
     * Get the message envelope.
     */
    public function envelope(): Envelope
    {
        return new Envelope(
            subject: '您的订单 #' . $this->order->id . ' 已发货!', // 使用订单数据动态设置主题
        );
    }

3. 定义邮件内容 (Content) 和视图:

content()
方法中指定邮件使用的Blade视图文件,并通过
with()
方法传递额外的数据(如果公共属性不够用的话,但通常公共属性更简洁)。

    /**
     * Get the message content definition.
     */
    public function content(): Content
    {
        return new Content(
            view: 'emails.orders.shipped', // 指定视图文件路径
            // with: [ // 也可以在这里传递数据,但通常公共属性更直接
            //     'orderId' => $this->order->id,
            //     'trackingNumber' => $this->order->tracking_number,
            // ],
        );
    }

4. 创建Blade视图模板:

resources/views/emails/orders/shipped.blade.php
创建你的邮件模板。在这个模板中,你可以直接访问
Mailable
类中定义的公共属性。




    订单发货通知


    

订单 #{{ $order->id }} 已发货!

亲爱的 {{ $order->user->name }},

我们很高兴地通知您,您的订单已于 {{ $order->shipped_at->format('Y-m-d H:i') }} 发货。

追踪号码:{{ $order->tracking_number }}

您可以点击以下链接查看订单详情:

查看订单

订单商品:

    @foreach ($order->items as $item)
  • {{ $item->product->name }} (x{{ $item->quantity }}) - {{ $item->price }}
  • @endforeach

感谢您的惠顾!

此致,
您的商店团队

5. 发送邮件: 在你的代码中,实例化

OrderShipped
Mailable并传入订单对象,然后发送。

use App\Mail\OrderShipped;
use App\Models\Order;
use Illuminate\Support\Facades\Mail;

// ...
public function notifyOrderShipped(Order $order)
{
    // 假设$order对象包含了所有需要的数据,包括关联的user和items
    Mail::to($order->user->email)->send(new OrderShipped($order));
}

Markdown Mailable (额外提示): Laravel还提供了Markdown邮件模板,它能让你用Markdown语法编写邮件内容,并且框架会自动将其渲染成美观的HTML邮件,同时提供纯文本版本。这对于那些不希望深入HTML和CSS细节的开发者来说非常方便。创建Markdown Mailable也很简单:

php artisan make:mail WelcomeUser --markdown=emails.welcome-user

然后在

build
方法中指定Markdown视图:

public function build()
{
    return $this->markdown('emails.welcome-user')
                ->with(['name' => $this->userName]);
}

在Markdown视图中,你可以使用

@component('mail::message')
来包裹内容,并使用Markdown语法。这种方式在保持邮件一致性和响应式设计方面有很大优势。

Laravel邮件发送失败时,应该如何进行调试和排查?

邮件发送失败是开发中经常会遇到的问题,特别是在不同环境(开发、测试、生产)之间切换时。有效的调试和排查方法能帮助我们快速定位问题。

1. 检查

.env
config/mail.php
配置:
这是最常见的问题源头。

  • 凭证错误: 仔细检查
    MAIL_USERNAME
    MAIL_PASSWORD
    是否正确。这些凭证通常区分大小写,且可能包含特殊字符。
  • 主机/端口错误: 确认
    MAIL_HOST
    MAIL_PORT
    与你的邮件服务提供商要求的一致。例如,Gmail的SMTP主机是
    smtp.gmail.com
    ,端口通常是
    587
    (TLS)或
    465
    (SSL)。
  • 加密方式:
    MAIL_ENCRYPTION
    tls
    ssl
    null
    )必须与邮件服务商的要求匹配。不匹配会导致连接失败。
  • 发件人地址: 确保
    MAIL_FROM_ADDRESS
    是有效的,并且如果使用第三方服务(如SES、Mailgun),该地址可能需要经过验证。有时,邮件服务会拒绝未经验证的“From”地址。

2. 使用

MAIL_MAILER=log
进行本地测试: 在开发环境中,将
.env
中的
MAIL_MAILER
设置为
log
。这样,Laravel会把所有邮件内容写入
storage/logs/laravel.log
文件,而不会实际发送。

  • 排查目的: 检查邮件的Blade模板是否正确渲染,数据是否正确传递。如果日志中能看到完整的邮件内容,说明
    Mailable
    类和模板本身没有问题,问题可能出在实际的发送环节。

3. 使用邮件捕获工具 (Mailtrap/Mailhog/Helo): 这些工具在本地开发时非常有用。它们模拟一个SMTP服务器,捕获所有发送到它的邮件,并在一个Web界面中显示出来,而不会真正将邮件发送到外部。

  • 配置:
    MAIL_HOST
    MAIL_PORT
    MAIL_USERNAME
    MAIL_PASSWORD
    配置为这些工具提供的凭证。
  • 排查目的: 验证邮件是否成功从Laravel应用发出,以及邮件的格式、内容和附件是否正确。如果邮件能被这些工具捕获,说明Laravel的邮件配置和
    Mailable
    构建是正确的,问题可能在于你的生产环境邮件服务配置或网络连接。

4. 检查Laravel日志 (

storage/logs/laravel.log
): 当邮件发送失败时,Laravel通常会记录一个异常。查看日志文件,查找与邮件发送相关的错误信息。

  • 常见错误:
    Connection refused
    (连接被拒绝,可能是主机/端口错误或防火墙问题)、
    Authentication failed
    (认证失败,用户名/密码错误)、
    Expected response code 250 but got code xxx
    (邮件服务器返回了非预期的错误码)。

5. 检查第三方邮件服务提供商的日志: 如果你使用的是Mailgun、SES、SendGrid等服务,登录到它们的控制台,查看邮件发送日志。

  • 排查目的: 这些服务通常提供非常详细的发送状态、错误码和原因。例如,邮件可能因为收件人地址无效、被标记为垃圾邮件、或者服务配额限制而失败。这是定位生产环境邮件问题的最有效方式之一。

6. 队列相关问题排查: 如果你将邮件发送推送到队列中,那么问题可能出在队列本身。

  • 队列工作者: 确认你的队列工作者 (
    php artisan queue:work
    ) 正在运行。如果没有运行,任务就不会被处理。
  • 失败任务表: 检查
    failed_jobs
    数据库表。如果邮件任务失败,它通常会被记录在这里,并包含失败原因。
  • 队列连接: 确保
    config/queue.php
    中的队列连接配置正确(例如Redis、Database)。

7. 网络和防火墙问题: 在生产服务器上,确保服务器可以访问邮件服务的主机和端口。

  • 测试连接: 可以使用
    telnet
    nc
    命令测试服务器到邮件服务SMTP端口的连接,例如
    telnet smtp.mailgun.org 587
    。如果连接不上,可能是服务器防火墙限制了出站连接。

8. 代码逻辑审查: 回顾发送邮件的代码逻辑。

  • 收件人地址: 确保
    Mail::to()
    方法中提供的邮件地址是有效的。
  • 数据传递: 确认所有必需的数据都正确地传递给了
    Mailable
    类。

调试邮件问题需要耐心和系统性。通常我都是从

.env
配置开始,然后是
log
驱动看内容,接着是Mailtrap看是否发出,最后才是深入到服务商日志和服务器网络检查。这个流程能覆盖大部分邮件发送失败的场景。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2027

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1358

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1267

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

948

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1402

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1231

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1440

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1303

2023.11.13

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 1.9万人学习

微信小程序开发之API篇
微信小程序开发之API篇

共15课时 | 1.2万人学习

Webpack4.x---十天技能课堂
Webpack4.x---十天技能课堂

共20课时 | 1.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号