求助:PHP数组生成HTML表格嵌入邮件实现失败
解决PHP数组转HTML邮件表格的问题
嘿,我明白你现在的困扰——想把PHP里的数组数据转成两列HTML表格用来发邮件,但用foreach遍历的时候没成功。别担心,咱们一步步来搞定这个事儿!
首先,先理清楚你的需求:你有一个$fields数组,它是表单字段名和友好显示名称的映射,你需要把每个字段的显示名称和对应的实际提交值做成两列的表格。假设你还有一个存储用户提交数据的数组(比如叫$reservationData),里面包含了kosten、name这些字段的实际值,那咱们可以这样写代码:
完整代码示例
<?php // 邮件主题 $subject = 'Nieuwe reservering'; // 字段名与荷兰语显示名称的映射 $fields = array( 'kosten' => 'Kosten', 'name' => 'Naam', 'surname' => 'Achternaam', 'phone' => 'Telefoonnummer', 'kamer' => 'Kamer', 'aankomst' => 'Aankomstdatum', 'vertrek' => 'Vertrekdatum' ); // 假设这是用户提交的实际预订数据(替换成你的真实数据源即可) $reservationData = array( 'kosten' => '€150,-', 'name' => 'Jan', 'surname' => 'Janssen', 'phone' => '06-12345678', 'kamer' => 'Deluxe Kamer 3', 'aankomst' => '2024-05-10', 'vertrek' => '2024-05-15' ); // 开始构建HTML邮件内容(适配邮件客户端的样式) $htmlContent = '<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>' . $subject . '</title> <style> table { border-collapse: collapse; width: 100%; max-width: 600px; margin: 20px auto; } th, td { border: 1px solid #ddd; padding: 10px; text-align: left; } th { background-color: #f5f5f5; } h2 { text-align: center; color: #333; } </style> </head> <body> <h2>' . $subject . '</h2> <table>'; // 用foreach遍历数组,生成表格行 foreach ($fields as $fieldKey => $fieldLabel) { // 检查对应数据是否存在,避免PHP警告 $fieldValue = isset($reservationData[$fieldKey]) ? $reservationData[$fieldKey] : 'Niet opgegeven'; // 转义特殊字符,防止HTML结构被破坏或XSS攻击 $htmlContent .= '<tr> <td><strong>' . htmlspecialchars($fieldLabel) . '</strong></td> <td>' . htmlspecialchars($fieldValue) . '</td> </tr>'; } // 结束表格与HTML内容 $htmlContent .= '</table> </body> </html>'; // 发送邮件的基础配置(根据你的服务器调整) $to = 'ontvanger@voorbeeld.nl'; $headers = "MIME-Version: 1.0" . "\r\n"; $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n"; $headers .= 'From: <noreply@jouwwebsite.nl>' . "\r\n"; // 执行发送 mail($to, $subject, $htmlContent, $headers); ?>
关键要点说明
- 邮件样式适配:邮件客户端对CSS支持有限,所以尽量用内部样式或inline样式,避免外部CSS文件,保证表格在多数客户端里显示正常。
htmlspecialchars()必加:这个函数会转义用户输入里的特殊字符(比如<、>),既防止XSS攻击,也避免破坏HTML结构。- 数据存在性检查:用
isset()判断实际提交数据是否存在,不存在就显示默认文本(比如Niet opgegeven),避免出现PHP警告。 - foreach遍历逻辑:遍历
$fields的键和值,通过键去$reservationData里匹配实际值,这样就能完美对应显示名称和数据。
如果你之前的foreach没成功,大概率是这几个原因:
- 拼接HTML时漏掉了
.连接符,导致字符串没有正确累加; - 只遍历了数组的值,没有利用键去匹配实际数据;
- 没有转义特殊字符,导致HTML结构被破坏。
内容的提问来源于stack exchange,提问作者Lars Breuren
相关产品推荐
相关产品推荐

