0

0

在 Laravel 中发送 HTML 邮件并解决内容换行与格式显示问题

DDD

DDD

发布时间:2025-11-16 12:39:05

|

883人浏览过

|

来源于php中文网

原创

在 Laravel 中发送 HTML 邮件并解决内容换行与格式显示问题

本教程详细介绍了在 laravel 应用中发送 html 格式邮件的方法,以解决邮件内容换行符(如 `
`)无法正确渲染,导致文本被截断或格式混乱的问题。核心在于确保邮件内容被识别为 html 类型,并通过 laravel 的 mailable 类和 blade 模板实现这一目标,从而保证邮件在各种客户端中都能美观呈现。

解决 Laravel 邮件内容换行与格式问题

在开发 Web 应用时,通过电子邮件发送通知、报告或营销信息是常见需求。然而,开发者经常会遇到一个问题:在邮件正文中插入 HTML 标签(例如
用于换行)时,这些标签未能正确渲染,导致邮件内容显示为纯文本,排版混乱,甚至被邮件客户端截断(如显示 (...))。这通常是因为邮件被默认当作纯文本处理,而未被识别为 HTML 格式。

理解 HTML 邮件的必要性

为了在邮件中实现丰富的文本格式、图片、链接以及自定义布局,邮件内容必须以 HTML 格式发送。当邮件客户端收到一份 HTML 邮件时,它会解析其中的 HTML 标签并渲染出预期的视觉效果。实现这一点的关键在于在邮件请求的头部明确指定 Content-Type: text/html;。这个头部信息告知邮件客户端,邮件体应作为 HTML 文档进行解析。

在 Laravel 中发送 HTML 邮件的最佳实践

Laravel 提供了一套优雅且功能强大的邮件发送机制,通过 Mailable 类和 Blade 模板,可以轻松构建和发送 HTML 格式的邮件,并自动处理 Content-Type 头部。

1. 使用 Mailable 类和 Blade 模板 (推荐方式)

这是 Laravel 官方推荐且最健壮的方式,它将邮件的构建逻辑与视图分离,易于维护和扩展。

立即学习前端免费学习笔记(深入)”;

步骤一:创建 Mailable 类

首先,使用 Artisan 命令生成一个新的 Mailable 类。例如,我们创建一个名为 OrderShipped 的 Mailable:

php artisan make:mail OrderShipped

这会在 app/Mail 目录下创建一个 OrderShipped.php 文件。

步骤二:定义邮件内容视图 (Blade 模板)

在 resources/views/emails 目录下创建一个 Blade 模板文件,例如 order-shipped.blade.php。在这个文件中,你可以像构建普通 HTML 页面一样编写邮件内容,包括使用
标签、CSS 样式等。

resources/views/emails/order-shipped.blade.php 示例:

<!DOCTYPE html>
<html>
<head>
    <title>您的订单已发货!</title>
    <style>
        body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
        .container { max-width: 600px; margin: 0 auto; padding: 20px; border: 1px solid #ddd; border-radius: 5px; }
        .header { background-color: #f8f8f8; padding: 10px; text-align: center; }
        .content { padding: 20px 0; }
        .footer { text-align: center; font-size: 0.8em; color: #666; margin-top: 20px; }
    </style>
</head>
<body>
    <div class="container">
        <div class="header">
            <h2>订单发货通知</h2>
        </div>
        <div class="content">
            <p>亲爱的 {{ $name }},</p>
            <p>您的订单 <strong>#{{ $orderCode }}</strong> 已成功发货!</p>
            <p>物流信息如下:<br>
               <strong>物流单号:</strong> {{ $trackingNumber }}<br>
               <strong>预计送达:</strong> {{ $deliveryDate }}
            </p>
            <p>请点击以下链接查看订单详情:<br>
               <a href="{{ $orderUrl }}">查看订单</a>
            </p>
            <p>感谢您的购物!</p><div class="aritcle_card flexRow">
                                                        <div class="artcardd flexRow">
                                                                <a class="aritcle_card_img" href="/ai/1689" title="银河易创"><img
                                                                                src="https://img.php.cn/upload/ai_manual/000/000/000/175680306969426.png" alt="银河易创"  onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
                                                                <div class="aritcle_card_info flexColumn">
                                                                        <a href="/ai/1689" title="银河易创">银河易创</a>
                                                                        <p>一站式AIGC创作平台,集成GPT-3.5、GPT-4、文心一言等对话模型、Midjourney、DallE等绘画工具、AI音乐、AI视频和AI PPT等功能!</p>
                                                                </div>
                                                                <a href="/ai/1689" title="银河易创" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
                                                        </div>
                                                </div>
        </div>
        <div class="footer">
            <p>此邮件为系统自动发送,请勿直接回复。</p>
        </div>
    </div>
</body>
</html>

步骤三:在 Mailable 类中配置视图和数据

编辑 app/Mail/OrderShipped.php 文件,在 build 方法中指定使用的 Blade 视图,并传递所需的数据。

app/Mail/OrderShipped.php 示例:

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Mail\Mailables\Content;
use Illuminate\Mail\Mailables\Envelope;
use Illuminate\Queue\SerializesModels;

class OrderShipped extends Mailable
{
    use Queueable, SerializesModels;

    public $name;
    public $orderCode;
    public $trackingNumber;
    public $deliveryDate;
    public $orderUrl;

    /**
     * 创建新的消息实例。
     *
     * @param string $name
     * @param string $orderCode
     * @param string $trackingNumber
     * @param string $deliveryDate
     * @param string $orderUrl
     */
    public function __construct($name, $orderCode, $trackingNumber, $deliveryDate, $orderUrl)
    {
        $this->name = $name;
        $this->orderCode = $orderCode;
        $this->trackingNumber = $trackingNumber;
        $this->deliveryDate = $deliveryDate;
        $this->orderUrl = $orderUrl;
    }

    /**
     * 获取消息的信封。
     */
    public function envelope(): Envelope
    {
        return new Envelope(
            subject: '您的订单已发货!',
        );
    }

    /**
     * 获取消息的内容定义。
     */
    public function content(): Content
    {
        return new Content(
            view: 'emails.order-shipped', // 指定 Blade 视图
            with: [ // 传递给视图的数据
                'name' => $this->name,
                'orderCode' => $this->orderCode,
                'trackingNumber' => $this->trackingNumber,
                'deliveryDate' => $this->deliveryDate,
                'orderUrl' => $this->orderUrl,
            ],
        );
    }

    /**
     * 获取消息的附件。
     *
     * @return array<int, \Illuminate\Mail\Mailables\Attachment>
     */
    public function attachments(): array
    {
        return [];
    }
}

步骤四:发送邮件

在你的控制器、服务或任何需要发送邮件的地方,使用 Mail Facade 来发送 Mailable 实例。

控制器发送邮件示例:

<?php

namespace App\Http\Controllers;

use App\Mail\OrderShipped;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class OrderController extends Controller
{
    public function shipOrder(Request $request)
    {
        // 假设这里获取了订单和用户信息
        $userName = '张三';
        $userEmail = 'zhangsan@example.com';
        $orderCode = '20231026001';
        $trackingNumber = 'SF123456789';
        $deliveryDate = '2023年11月2日';
        $orderUrl = url('/orders/' . $orderCode);

        // 发送邮件
        Mail::to($userEmail)->send(new OrderShipped(
            $userName,
            $orderCode,
            $trackingNumber,
            $deliveryDate,
            $orderUrl
        ));

        return response()->json(['message' => '订单发货通知已发送!']);
    }
}

通过这种方式,Laravel 会自动将邮件内容渲染为 HTML,并设置正确的 Content-Type 头部,确保
等 HTML 标签能够被邮件客户端正确解析和显示。

2. 直接构建 HTML 字符串并发送 (非推荐但可行)

如果你确实需要直接构建一个包含 HTML 的字符串作为邮件内容,而不是使用 Blade 模板,Laravel 也提供了方法来处理。但请注意,这种方式可维护性较低,且容易出错。

在 Laravel 10+ 版本中,你可以使用 Mail::html() 方法来发送一个原始的 HTML 字符串。

示例代码:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class MailController extends Controller
{
    public function sendRawHtmlEmail(Request $request)
    {
        $name = $request->input('name', '用户');
        $code = $request->input('code', 'XYZ123');

        // 直接构建包含 HTML 标签的字符串
        $mes2 = "这是一段文本,";
        $mes3 = "需要新的一行。";
        $mes4 = "代码是:" . $code;
        $mes5 = "姓名是:" . $name;
        $mes6 = "这是最后一行文本。";

        $htmlContent = $mes2 . "<br />" . $mes3 . "<br />" . $mes4 . "<br />" . $mes5 . "<br />" . $mes6;

        Mail::to('recipient@example.com')
            ->subject('原始 HTML 邮件测试')
            ->html($htmlContent) // 使用 html() 方法发送 HTML 字符串
            ->send();

        return response()->json(['message' => '原始 HTML 邮件已发送!']);
    }
}

使用 ->html($htmlContent) 方法时,Laravel 会将 $htmlContent 视为 HTML 内容,并自动设置 Content-Type: text/html 头部。

注意事项与最佳实践

  1. 邮件客户端兼容性: 不同的邮件客户端(如 Gmail, Outlook, Apple Mail)对 HTML 和 CSS 的支持程度不一。尽量使用简单、标准的 HTML 结构和内联 CSS,以确保最佳兼容性。避免复杂的 JavaScript 或外部样式表。
  2. CSS 内联: 许多邮件客户端会剥离
  3. 测试: 在发送生产环境邮件之前,务必在多种主流邮件客户端(包括桌面、网页和移动端)上进行充分测试,以验证邮件的显示效果。
  4. 避免直接拼接: 尽管 Mail::html() 可以发送原始 HTML 字符串,但强烈建议优先使用 Mailable 类配合 Blade 模板。这种方式不仅结构清晰、易于管理,还能更好地利用 Laravel 的邮件队列、Markdown 邮件等高级功能。

总结

解决 Laravel 邮件内容中
标签不换行或内容被截断的问题,核心在于确保邮件被正确识别为 HTML 格式。在 Laravel 中,最优雅和推荐的解决方案是利用 Mailable 类和 Blade 模板来构建邮件。通过这种方式,Laravel 会自动处理 Content-Type: text/html 头部,确保你的邮件内容能够以预期的格式呈现在收件人面前。如果特殊情况下需要直接发送 HTML 字符串,可以使用 Mail::html() 方法,但请务必注意其潜在的维护性问题。遵循这些最佳实践,可以显著提升邮件的用户体验和专业性。

相关文章

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

339

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

293

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

772

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

385

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

140

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

85

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

80

2025.08.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

422

2026.03.04

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

CSS教程
CSS教程

共754课时 | 42万人学习

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

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