
本教程详细介绍了在 laravel 应用中发送 html 格式邮件的方法,以解决邮件内容换行符(如 `
`)无法正确渲染,导致文本被截断或格式混乱的问题。核心在于确保邮件内容被识别为 html 类型,并通过 laravel 的 mailable 类和 blade 模板实现这一目标,从而保证邮件在各种客户端中都能美观呈现。
在开发 Web 应用时,通过电子邮件发送通知、报告或营销信息是常见需求。然而,开发者经常会遇到一个问题:在邮件正文中插入 HTML 标签(例如 zuojiankuohaophpcnbr /> 用于换行)时,这些标签未能正确渲染,导致邮件内容显示为纯文本,排版混乱,甚至被邮件客户端截断(如显示 (...))。这通常是因为邮件被默认当作纯文本处理,而未被识别为 HTML 格式。
为了在邮件中实现丰富的文本格式、图片、链接以及自定义布局,邮件内容必须以 HTML 格式发送。当邮件客户端收到一份 HTML 邮件时,它会解析其中的 HTML 标签并渲染出预期的视觉效果。实现这一点的关键在于在邮件请求的头部明确指定 Content-Type: text/html;。这个头部信息告知邮件客户端,邮件体应作为 HTML 文档进行解析。
Laravel 提供了一套优雅且功能强大的邮件发送机制,通过 Mailable 类和 Blade 模板,可以轻松构建和发送 HTML 格式的邮件,并自动处理 Content-Type 头部。
这是 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 页面一样编写邮件内容,包括使用 <br /> 标签、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>
<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 头部,确保 <br /> 等 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 头部。
解决 Laravel 邮件内容中 <br /> 标签不换行或内容被截断的问题,核心在于确保邮件被正确识别为 HTML 格式。在 Laravel 中,最优雅和推荐的解决方案是利用 Mailable 类和 Blade 模板来构建邮件。通过这种方式,Laravel 会自动处理 Content-Type: text/html 头部,确保你的邮件内容能够以预期的格式呈现在收件人面前。如果特殊情况下需要直接发送 HTML 字符串,可以使用 Mail::html() 方法,但请务必注意其潜在的维护性问题。遵循这些最佳实践,可以显著提升邮件的用户体验和专业性。
以上就是在 Laravel 中发送 HTML 邮件并解决内容换行与格式显示问题的详细内容,更多请关注php中文网其它相关文章!
HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号