运行4年的PHP邮件脚本突然失效,未改代码求排查方案
PHP邮件脚本突然无法发送的排查与解决方案
问题背景
- 脚本已稳定运行4年,近1个月无法发送邮件,期间未做任何修改
- 服务器PHP版本为7.2,托管于GoDaddy,客服称未改动服务器配置
- 测试发送至Gmail、Yahoo邮箱均失败
核心疑问解答
1. 邮件协议近期变更情况
Gmail、Yahoo等主流邮箱近年确实强化了发件验证规则:
- SPF/DKIM/DMARC强制要求:未配置这三类认证记录的发件服务器,邮件大概率会被直接拦截或归入垃圾邮件
- 端口限制:部分服务商(包括GoDaddy)可能默认封停25端口,需改用465(SSL)或587(TLS)端口发送
- 发件人验证:不再允许随意伪造
From头,很多邮箱会校验发件域名的真实性,你的脚本直接用用户提交的gEmail作为发件人,很容易触发反垃圾机制
2. PHP版本升级建议
PHP7.2已于2020年11月停止所有安全支持,强烈建议升级至8.1:
- 8.1版本性能更优,安全补丁持续更新
- 原生
mail()函数在新版本中虽无核心变更,但配套的扩展(如openssl)兼容性更好,有助于TLS加密发送 - 不过升级本身不会直接解决当前邮件发送问题,只是解决长期安全和兼容性隐患
针对性解决方案
替换原生mail()函数为SMTP发送
原生mail()依赖服务器本地sendmail配置,稳定性差,建议改用SMTP认证发送,示例如下(使用PHPMailer):
<?php error_reporting(E_ALL); ini_set('display_errors', 1); require 'PHPMailer/src/PHPMailer.php'; require 'PHPMailer/src/SMTP.php'; require 'PHPMailer/src/Exception.php'; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; function mailcheck($field) { $field = filter_var($field, FILTER_SANITIZE_EMAIL); return filter_var($field, FILTER_VALIDATE_EMAIL); } function checkInput($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } if(isset($_POST['gName'])) { if (!mailcheck($_POST['gEmail'])) { echo json_encode("Invalid email"); exit; } $gName = checkInput($_POST['gName']); $gEmail = checkInput($_POST['gEmail']); $gComments = checkInput($_POST['gComments']); $gRating = checkInput($_POST['gRating']); $mBody = "SENT BY - ".$gName."\n"; $mBody .= "SENDER EMAIL - ".$gEmail."\n"; $mBody .= "RATING - ".$gRating."\n\n"; $mBody .= "MESSAGE - ".$gComments."\n"; $mail = new PHPMailer(true); try { // SMTP配置(使用GoDaddy提供的SMTP服务器) $mail->isSMTP(); $mail->Host = 'smtpout.secureserver.net'; // GoDaddy SMTP地址 $mail->SMTPAuth = true; $mail->Username = 'your-godaddy-email@yourdomain.com'; // 你的GoDaddy邮箱账号 $mail->Password = 'your-email-password'; // 邮箱密码 $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; $mail->Port = 465; // 收件人、发件人设置 $mail->setFrom('your-godaddy-email@yourdomain.com', 'Guest Review System'); // 用自己域名的邮箱作为发件人 $mail->addAddress('myemail@gmail.com'); // 目标收件邮箱 $mail->addReplyTo($gEmail, $gName); // 设置回复地址为用户邮箱 // 邮件内容 $mail->isHTML(false); $mail->Subject = 'Guest Review'; $mail->Body = $mBody; $mail->send(); echo json_encode("Review sent. Thank You!"); } catch (Exception $e) { echo json_encode("Error. Please try again. Error detail: {$mail->ErrorInfo}"); } } ?>
额外排查步骤
- 检查域名的SPF、DKIM、DMARC记录是否正确配置(可通过GoDaddy域名管理后台设置)
- 联系GoDaddy确认服务器的邮件发送权限,是否开启了SMTP服务,是否有发送量限制
- 查看服务器的邮件日志(通常在
/var/log/mail.log或GoDaddy控制面板的邮件日志模块),获取具体错误信息
内容的提问来源于stack exchange,提问作者Frankenscarf
相关产品推荐
相关产品推荐

