PHP邮件表单部署至主机后无法发送问题求助
解决PHP联系表单无法发送邮件的问题
我帮你排查了代码里的几个关键问题,这些应该是导致邮件发不出去的核心原因:
1. 邮箱地址格式错误
你定义的收件邮箱jonomarx20@gmailcom缺少了域名里的点,正确格式应该是jonomarx20@gmail.com,这个低级错误会直接导致邮件无法投递到正确的邮箱服务器。
2. mail()函数参数顺序完全错误
PHP的mail()函数标准语法是:
mail(string $to, string $subject, string $message, array|string $additional_headers = [], string $additional_params = "")
但你的代码里把收件人地址这个必填参数漏掉了,反而把主题放在了第一个位置,这是最致命的错误!正确的调用应该把收件人地址作为第一个参数传入。
3. 冗余代码与内容拼接错误
- 你重复定义了三次
$address变量,完全没必要,直接使用提前定义好的WEBMASTER_EMAIL即可 - 你把邮件主题
$e_subject错误地拼接到了邮件内容$msg里,主题应该单独作为mail()的第二个参数
修正后的完整PHP代码
<?php define("WEBMASTER_EMAIL", 'jonomarx20@gmail.com'); // 修正邮箱格式 if (!defined("PHP_EOL")) define("PHP_EOL", "\r\n"); $error = false; $fields = array('name', 'email', 'phone', 'message'); foreach ($fields as $field) { if (empty($_POST[$field]) || trim($_POST[$field]) == '') { $error = true; } } if (!$error) { $name = stripslashes($_POST['name']); $email = stripslashes($_POST['email']); $message = stripslashes($_POST['message']); $phone = stripslashes($_POST['phone']); $e_subject = 'You\'ve been contacted by ' . $name . '.'; // 重新整理邮件内容结构 $e_body = "You have been contacted by: $name" . PHP_EOL . PHP_EOL; $e_reply = "E-mail: $email" . PHP_EOL . PHP_EOL; $e_content = "Message:\r\n$message" . PHP_EOL . PHP_EOL; $e_phone = "Phone:\r\n$phone" . PHP_EOL . PHP_EOL; $msg = wordwrap($e_body . $e_reply . $e_content . $e_phone, 70); // 移除错误加入的主题 $headers = "From: $email" . PHP_EOL; $headers .= "Reply-To: $email" . PHP_EOL; $headers .= "MIME-Version: 1.0" . PHP_EOL; $headers .= "Content-type: text/plain; charset=utf-8" . PHP_EOL; $headers .= "Content-Transfer-Encoding: quoted-printable" . PHP_EOL; // 修正mail函数参数顺序:收件人、主题、内容、头部 if(mail(WEBMASTER_EMAIL, $e_subject, $msg, $headers)) { echo 'Success'; } else { echo 'ERROR!'; } } ?>
其他可能的排查点(如果修正后还是无法发送)
- 检查主机服务器是否开启了
mail()函数支持,部分虚拟主机默认禁用该函数,这种情况下建议使用SMTP方式发送邮件(比如用PHPMailer类) - 确认发件邮箱是否符合主机的SPF/DKIM配置,避免邮件被当成垃圾邮件拦截
- 可以添加错误日志排查:在
mail()调用后加上var_dump(error_get_last());查看具体错误信息
内容的提问来源于stack exchange,提问作者Michael Fuz
相关产品推荐
相关产品推荐

