PHP邮件表单无法识别带重音/特殊字符,请求解决乱码问题
解决PHP邮件表单UTF-8字符乱码问题
你遇到的"Envío"显示为"EnvÃo"是UTF-8编码在邮件传输中未正确配置导致的乱码,以下是针对你代码的具体修复方案:
核心问题分析
- 定义的
$headers变量未在mail函数中传递,导致UTF-8编码设置无效 - 邮件主题未做UTF-8编码处理
From头部格式不符合标准- 缺少内容传输编码的声明
修正后的完整代码
<html lang="es"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <link href="assets/css/style.css" rel="stylesheet"> <link href="assets/css/custom.css" rel="stylesheet"> </head> <body> <div class="col-md-6"> <div class="form contact-form"> <?php error_reporting(0); $action=$_REQUEST['action']; if ($action=="") /* display the contact form */ { ?> <form class="php-email-form" id="contact-form" action="<?php echo $_SERVER["PHP_SELF"];?>" method="POST" enctype="multipart/form-data" autocomplete="off"> <input type="hidden" name="action" value="submit"> <div class="form-group"> <input class="form-control" type="text" name="name" value="" size="30" placeholder="Nombre" class="form-area" autocomplete="off" /></div> <div class="form-group mt-3"><input class="form-control" type="text" name="email" value="" size="30" placeholder="e-Mail" class="form-area" autocomplete="off" /></div> <div class="form-group mt-3"><input class="form-control" type="text" name="phone" value="" size="30" placeholder="Teléfono" class="form-area" autocomplete="off" /></div> <textarea class="form-control mt-3" name="message" placeholder="Tu mensaje" class="form-area"></textarea> <div class="my-3"><div class="loading">Enviando...</div></div> <div class="text-left"><button type="submit">Enviar Mensaje</button></div> </form> <?php } else { $name=$_REQUEST['name']; $email=$_REQUEST['email']; $phone=$_REQUEST ['phone']; $message=$_REQUEST['message']; if (($name=="")||($email=="")||($phone=="")||($message=="")) { echo "<div class='error-message'><strong>Tu mensaje no pudo ser enviado</strong><br>Por favor, completá todos los campos.<br> <a href=\"javascript:history.back()\" target=\"_self\"><img src='assets/img/back.png' /></a></div>"; } else{ // 处理邮件内容,确保换行符符合邮件标准 $body = "Nuevo mensaje desde la web!\r\n". "Nombre: $name\r\n". "e-Mail: $email\r\n". "Telefono: $phone\r\n". "Mensaje:\r\n". $message; // 构建完整的邮件头部信息 $headers = "From: \"Web Contact\" <web@mydomain.com>\r\n"; $headers .= "Return-Path: $email\r\n"; $headers .= "Content-Type: text/plain; charset=UTF-8\r\n"; $headers .= "Content-Transfer-Encoding: quoted-printable\r\n"; // 对邮件主题进行UTF-8编码,兼容所有邮件客户端 $subject = mb_encode_mimeheader("Contacto WEB", "UTF-8"); // 发送邮件,传递完整的头部配置 mail("web@mydomain.com", $subject, $body, $headers); echo "<div class='sent-message'>Tu mensaje ha sido enviado<br /> y pronto será respondido.<br><br> <strong>Gracias por contactarnos!</strong></div>"; } } ?> </div> </div> </body> </html>
关键修改说明
- 统一头部传递:将
From、编码配置等合并到$headers变量,确保mail函数能读取到完整的编码规则。 - 主题编码处理:用
mb_encode_mimeheader对主题做UTF-8编码,解决非ASCII字符乱码问题。 - 内容格式规范:把换行符改为
\r\n(符合邮件传输标准),同时明确设置内容类型为纯文本+UTF-8(若需HTML邮件,可改为text/html并确保内容为HTML格式)。 - 传输编码声明:添加
Content-Transfer-Encoding: quoted-printable,保证UTF-8字符能正确解析。 - 表单细节修正:补充
action属性的echo输出,修复反向的autocomplete值为标准的off。
内容的提问来源于stack exchange,提问作者Speedbit
相关产品推荐
相关产品推荐

