部署在DreamHost主机的PHP contact form无法正常发送邮件问题咨询
问题修复与排查步骤
1 修复PHP代码逻辑错误
你的PHP代码存在2个直接导致发信失败的核心问题:
$headers中的From字段格式非法,必须为合规的邮箱格式,不能仅填写字符串。同时DreamHost限制发件人必须是当前托管站点域名下已创建生效的真实邮箱,不支持任意自定义发件人。- 缺少必要的邮件头字段,极易被邮件服务商判定为垃圾邮件直接拦截,不会进入收件箱。
修复后的PHP参考代码如下:
<?php // 先增加表单参数校验,避免空内容提交触发拦截 if (isset($_POST['send']) && !empty($_POST['name']) && !empty($_POST['mail']) && filter_var($_POST['mail'], FILTER_VALIDATE_EMAIL)) { $name = $_POST['name']; $subject = $_POST['subject']; $mailFrom = $_POST['mail']; $message = $_POST['message']; $mailTo = "你的收件邮箱@xxx.com"; // 这里替换为你在DreamHost后台创建的、和站点同域名的发件邮箱,比如no-reply@你的域名.com $headers = "From: 站点联系表单 <no-reply@你的域名.com>\r\n"; // 增加回复头,方便直接回复用户填写的邮箱 $headers .= "Reply-To: " . $mailFrom . "\r\n"; $headers .= "Content-Type: text/plain; charset=utf-8\r\n"; $txt = "Commission from " . $name . ".\n\n" . $message; // 增加发信结果判断,方便排查问题 $sendStatus = mail($mailTo, $subject, $txt, $headers); if(!$sendStatus) { // 排查阶段可以打开下面的注释看具体错误,上线后记得删除 // print_r(error_get_last()); // exit; header("Location: ../commissions.php?error=mailfail"); } else { header("Location: ../commissions.php?error=mailsent"); } exit; }
2 DreamHost主机侧配置检查
- 确认你填写的发件邮箱已在DreamHost后台邮件管理中创建完成,且和当前站点属于同一个域名
- 不要使用第三方域名邮箱(如Gmail、QQ邮箱)作为发件人,DreamHost会直接拦截此类跨域名发信请求
- 排查阶段先检查收件邮箱的垃圾邮件文件夹,未配置邮件头的邮件大概率会被判定为垃圾邮件
- 确认
php/contact.php文件路径正确,文件权限设置为755,DreamHost默认不允许权限过高的PHP文件执行
3 基础逻辑排查
- 临时注释掉header跳转代码,提交表单后查看页面输出,确认代码确实执行到了发信逻辑分支
- 可以临时打印表单提交的参数,确认所有字段都能正常获取,排除表单提交失败的问题
内容的提问来源于stack exchange,提问作者Sol Emperor
相关产品推荐
相关产品推荐

