邮件发送成功但PHP页面返回500错误,求排查建议
咱们一步步来拆解这个奇怪的问题——邮件能正常发送,但页面偏返回500错误,确实挺让人困惑的。结合你的代码和描述,我整理了几个优先级很高的排查方向:
立刻移除
mysql_escape_string()对mail()参数的包裹mysql_escape_string()是专门用于处理SQL语句中字符串的函数,完全不适合处理邮件收件人、主题、内容和头信息。它会转义邮件系统依赖的特殊字符(比如引号、换行),更关键的是:这个函数在PHP 7.0+已经被彻底移除了!如果你的服务器用的是PHP7及以上版本,调用这个函数直接就会触发致命错误,这大概率就是500错误的元凶。把代码改成直接调用mail($to, $subject, $message, $headers)即可。查看HTTP服务器的错误日志
你已经开启了PHP的错误显示,但可能服务器层面(比如Apache/Nginx)禁用了错误输出到浏览器。去检查服务器的错误日志:- Apache的日志通常在
/var/log/apache2/error.log(Linux系统) - Nginx的日志通常在
/var/log/nginx/error.log
日志里会有500错误的详细堆栈信息,能直接定位到问题代码行。
- Apache的日志通常在
修复邮件头的换行格式
邮件头的规范要求必须使用\r\n(CRLF)作为换行符,而你的代码里用的是普通的\n。虽然部分服务器兼容\n,但不规范的换行可能导致邮件头解析异常,间接引发服务器错误。把所有头信息里的\n替换成\r\n试试。修正
mail()函数的错误捕获逻辑mail()函数执行失败时只会返回false,不会抛出异常——所以你写的try...catch根本抓不到它的错误!改成下面的写法才能获取到mail()的具体错误信息:function sendmail($to, $subject, $message) { $headers = "From: info@mosaique-oost.nl\r\n"; $headers .= "Reply-to: info@mosaique-oost.nl\r\n"; $headers .= "MIME-Version: 1.0\r\n"; $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n"; $mailResult = mail($to, $subject, $message, $headers); if (!$mailResult) { $error = error_get_last(); die("邮件发送错误详情: " . $error['message']); } }捕获隐藏的PHP警告/通知
有时候PHP的警告或通知不会显示在页面上,但会累积导致500错误。你可以在函数开头开启输出缓冲,捕获所有隐藏的输出信息:function sendmail($to, $subject, $message) { ob_start(); // 你的函数逻辑... $hiddenOutput = ob_get_clean(); if (!empty($hiddenOutput)) { die("隐藏的错误信息: " . $hiddenOutput); } }
内容的提问来源于stack exchange,提问作者Edwin van Hulst

