在 Laravel 中发送 HTML 邮件并确保换行符正确显示

碧海醫心
发布: 2025-11-07 11:31:01
原创
448人浏览过

在 Laravel 中发送 HTML 邮件并确保换行符正确显示

本教程详细阐述了在 laravel 应用程序中发送包含 html 格式内容(如换行符 `
`)的电子邮件时,如何确保邮件客户端正确解析。核心在于通过 laravel 的 mailable 类或直接设置邮件头,明确指定 `content-type: text/html`,从而避免内容被错误解析为纯文本或被截断的问题。

理解邮件内容类型与换行符问题

在构建电子邮件内容时,开发者常常希望通过 HTML 标签(例如 zuojiankuohaophpcnbr />)来实现文本的格式化和换行。然而,如果电子邮件客户端将邮件内容识别为纯文本(text/plain),那么所有 HTML 标签,包括 <br />,都将被视为普通字符串而直接显示出来,或者被邮件客户端忽略,导致内容显示混乱甚至被截断。

例如,以下 PHP 代码片段中直接拼接 HTML 标签:

$mes2 = "loretmtext,";
$mes3 = "loremtext";
$mes4 = "Code:".$code;
$mes5 = "e:".$name;
$mes6 = "text";

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

// 假设 $msg 被直接发送
登录后复制

如果发送此 $msg 时未明确指定邮件的 Content-Type 为 text/html,邮件客户端会将其默认为纯文本,从而无法正确渲染 <br /> 标签。要解决此问题,关键在于告知邮件客户端邮件体是 HTML 格式。

Laravel Mailable:发送 HTML 邮件的最佳实践

Laravel 提供了一个强大且优雅的 Mailable 系统来构建和发送邮件。使用 Mailable 类和 Blade 模板是发送 HTML 邮件并确保正确渲染的最佳实践,因为它会自动处理 Content-Type: text/html 头部设置。

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

示例:创建和发送 HTML 邮件

以下步骤将指导您如何在 Laravel 中创建一个包含换行符和其他 HTML 格式的邮件。

步骤一:生成 Mailable 类

首先,使用 Artisan 命令生成一个新的 Mailable 类。

php artisan make:mail MyHtmlMail
登录后复制

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

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

接下来,创建一个 Blade 模板来定义您的 HTML 邮件内容。Blade 模板允许您使用 HTML 标签,并且可以动态插入数据。

在 resources/views/emails/my-html-message.blade.php 创建以下文件:

芦笋演示
芦笋演示

一键出成片的录屏演示软件,专为制作产品演示、教学课程和使用教程而设计。

芦笋演示 34
查看详情 芦笋演示
<!DOCTYPE html>
<html>
<head>
    <title>重要通知</title>
    <style>
        /* 简单的内联 CSS 示例 */
        body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
        h1 { color: #0056b3; }
        strong { color: #d9534f; }
    </style>
</head>
<body>
    <h1>尊敬的 {{ $name }},您好!</h1>
    <p>这是一段包含多行内容的通知邮件。</p>
    <p>您的操作验证码是:<strong>{{ $code }}</strong></p>
    <p>请在规定时间内使用此验证码完成操作。此邮件由系统自动发送,请勿直接回复。</p>
    <p>感谢您的使用!</p>
</body>
</html>
登录后复制

在这个模板中,我们使用了 <p> 标签实现段落换行,并且通过 {{ $name }} 和 {{ $code }} 动态插入数据。

步骤三:配置 Mailable 类

编辑 app/Mail/MyHtmlMail.php 文件,将其配置为使用您创建的 Blade 模板,并传入所需的数据。

<?php

namespace App\Mail;

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

class MyHtmlMail extends Mailable
{
    use Queueable, SerializesModels;

    public $name;
    public $code;

    /**
     * 创建一个新的消息实例。
     *
     * @param  string  $name
     * @param  string  $code
     * @return void
     */
    public function __construct($name, $code)
    {
        $this->name = $name;
        $this->code = $code;
    }

    /**
     * 构建消息。
     *
     * @return $this
     */
    public function build()
    {
        return $this->subject('您的重要通知') // 设置邮件主题
                    ->view('emails.my-html-message') // 指定使用的 Blade 模板
                    ->with([ // 传递数据到模板
                        'name' => $this->name,
                        'code' => $this->code,
                    ]);
    }
}
登录后复制

在 build() 方法中,->view('emails.my-html-message') 明确告诉 Laravel 使用该 Blade 模板来渲染邮件内容。Laravel 会自动将其渲染为 HTML,并设置正确的 Content-Type: text/html 头部。

步骤四:发送邮件

最后,在您的控制器或任何需要发送邮件的地方,使用 Mail Facade 来发送您的 Mailable 实例。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use App\Mail\MyHtmlMail; // 引入您创建的 Mailable 类

class NotificationController extends Controller
{
    /**
     * 发送通知邮件。
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function sendNotification(Request $request)
    {
        // 假设从请求中获取数据
        $userName = $request->input('name', '用户');
        $verificationCode = $request->input('code', '123456');
        $recipientEmail = $request->input('email', 'recipient@example.com'); // 收件人邮箱

        try {
            Mail::to($recipientEmail)->send(new MyHtmlMail($userName, $verificationCode));
            return response()->json(['message' => 'HTML 邮件已成功发送!'], 200);
        } catch (\Exception $e) {
            return response()->json(['message' => '邮件发送失败:' . $e->getMessage()], 500);
        }
    }
}
登录后复制

通过以上步骤,当 Mail::to(...)->send(new MyHtmlMail(...)) 被调用时,Laravel 会自动渲染 my-html-message.blade.php 模板,将其作为 HTML 邮件体发送,并确保邮件客户端正确解析其中的 HTML 标签,包括换行符。

直接设置邮件头(不推荐在 Laravel 中使用)

虽然 Laravel 的 Mailable 系统是推荐的方式,但了解底层原理有助于理解。如果是在纯 PHP 环境下,或者需要自定义 Laravel Mailable 无法直接满足的特殊头部,则需要手动设置 Content-Type 头部。

// 这是一个纯 PHP 示例,不适用于 Laravel Mailable 的标准用法
$to = 'recipient@example.com';
$subject = 'HTML 邮件测试';
$message = '<h1>你好!</h1><p>这是一段包含<strong>HTML</strong>内容的邮件。</p><p>这是第二行。</p>';

// 必须设置 Content-Type 头部
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=UTF-8\r\n";
$headers .= "From: sender@example.com\r\n"; // 发件人

// 使用 PHP 的 mail() 函数发送
// mail($to, $subject, $message, $headers);
登录后复制

在 Laravel 中,通常不需要手动设置这些头部,因为 Mailable 类会为您处理。

注意事项与最佳实践

  1. 使用 Blade 模板: 始终优先使用 Blade 模板来构建邮件内容。它们不仅能自动处理 HTML 渲染和 Content-Type 设置,还能提供更好的可维护性、代码结构和安全性(例如防止 XSS 攻击)。
  2. 内联 CSS: 许多邮件客户端对外部样式表和 <style> 标签的支持有限。为了确保邮件在不同客户端上的一致性,推荐使用内联 CSS。Laravel 的 Markdown 邮件模板在编译时会自动将 CSS 内联化,或者您可以考虑使用第三方工具
  3. 响应式设计: 考虑到用户可能在手机上查看邮件,设计邮件模板时应考虑响应式布局,以提供良好的用户体验。
  4. 多客户端测试: 在发送重要邮件之前,务必在不同的邮件客户端(如 Gmail、Outlook、Apple Mail、Thunderbird 等)进行测试,以确保显示效果符合预期。
  5. 纯文本备用: 对于那些不支持 HTML 的邮件客户端或出于辅助功能考虑,Mailable 允许您通过 ->text('emails.my-plain-text-message') 方法提供一个纯文本版本。这会创建一个多部分邮件,其中包含 HTML 和纯文本两种版本,客户端会选择最适合的版本显示。

总结

在 Laravel 中发送包含 HTML 格式内容(如换行符 <br />)的邮件,核心在于确保邮件客户端将邮件体解析为 HTML。通过利用 Laravel 强大的 Mailable 系统和 Blade 模板,您可以轻松实现这一点,因为 Mailable 会自动为您处理 Content-Type: text/html 头部。遵循使用模板、考虑内联 CSS 和进行多客户端测试等最佳实践,将有助于您构建出专业且兼容性强的电子邮件通知系统。

以上就是在 Laravel 中发送 HTML 邮件并确保换行符正确显示的详细内容,更多请关注php中文网其它相关文章!

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

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

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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