
php脚本无法在html邮件正文中直接执行——邮件客户端不解析php,必须在发送前由服务器完成数据查询与html拼接。
php脚本无法在html邮件正文中直接执行——邮件客户端不解析php,必须在发送前由服务器完成数据查询与html拼接。
在使用 mail() 函数发送 HTML 邮件时,一个常见误区是试图将可执行的 PHP 代码(如 <?php ... ?> 标签)直接写入 $message 字符串中,期望收件人的邮箱客户端能运行它。这是完全不可行的:邮件客户端(如 Gmail、Outlook、Apple Mail)只渲染纯 HTML/CSS,绝不会执行任何 PHP、JavaScript 或服务器端逻辑。你看到的“空白”或“代码未渲染”,正是因为 PHP 标签被当作普通文本显示,或被邮件服务自动过滤/忽略。
✅ 正确做法是:先在服务器端执行所有 PHP 逻辑(数据库查询、变量处理等),再将结果拼接到 HTML 字符串中,最后将完整的静态 HTML 作为邮件正文发送。
以下是重构后的完整示例(含关键修复与最佳实践):
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
<?php
try {
$to = 'recipient@example.com'; // 替换为真实邮箱,移除混淆的 data-cfemail
$subject = 'Query from website';
// 设置邮件头:务必使用 UTF-8 编码(推荐),避免乱码;注意换行符为 \r\n
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-Type: text/html; charset=UTF-8'; // ✅ 推荐 UTF-8 而非 iso-8859-1
$headers[] = 'From: noreply@yourdomain.com'; // ✅ 添加 From 头提升送达率
// 1️⃣ 执行数据库操作(确保 database.php 已正确建立 $conn 连接)
include_once "database.php";
$result = mysqli_query($conn, "SELECT id, UPPER(make) AS make_name FROM makes ORDER BY make_name");
if (!$result) {
throw new Exception('Database query failed: ' . mysqli_error($conn));
}
// 2️⃣ 构建完整 HTML 邮件正文(纯字符串拼接,无 PHP 标签)
$message = '<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Delete employee data</title>
<style>
body { font-family: Arial, sans-serif; margin: 0; padding: 20px; }
table { border-collapse: collapse; width: 100%; margin-top: 15px; }
th, td { padding: 10px; text-align: left; border: 1px solid #ddd; }
tr:nth-of-type(odd) { background-color: #f9f9f9; }
</style>
</head>
<body>
<h2>Makes List</h2>
<table>
<thead>
<tr>
<th>Make Name</th>
</tr>
</thead>
<tbody>';
// 3️⃣ 动态拼接表格行
while ($row = mysqli_fetch_assoc($result)) {
$makeName = htmlspecialchars($row['make_name'], ENT_QUOTES, 'UTF-8'); // ✅ 防 XSS
$message .= "<tr><td style='width: 300px; text-align: center;'>{$makeName}</td></tr>";
}
$message .= '</tbody></table></body></html>';
// 4️⃣ 发送邮件(注意:implode("\r\n", $headers) 是标准用法)
$sent = mail($to, $subject, $message, implode("\r\n", $headers));
if ($sent) {
echo "Email sent successfully.";
} else {
throw new Exception("Mail function returned false.");
}
} catch (Exception $e) {
error_log("Email sending failed: " . $e->getMessage());
echo "Error: " . $e->getMessage();
}
?>? 关键注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 绝不嵌入 <?php ?> 到 $message 中:邮件正文必须是最终渲染的 HTML 字符串。
- 编码统一用 UTF-8:兼容中文、特殊字符,避免乱码(iso-8859-1 仅支持西欧字符)。
- 安全过滤输出:使用 htmlspecialchars() 转义数据库内容,防止 HTML 注入。
- 添加 From 和 charset 头:提升邮件可信度与兼容性。
- 检查数据库连接与查询结果:mysqli_query() 可能失败,需显式错误处理。
- 测试邮件客户端渲染效果:不同客户端对 CSS 支持差异大,建议使用 Litmus 或 Email on Acid 测试。
总结:PHP 是服务器端语言,邮件正文是客户端呈现的静态内容。把“生成 HTML”和“发送邮件”视为两个独立阶段——先用 PHP 生成 HTML 字符串,再将其作为纯文本发送。遵循这一原则,即可稳定实现动态数据邮件化。


















