PHP中使用mail()函数发送两封邮件仅收到第二封的问题排查
邮件发送问题排查与修复
以下是导致第一封邮件无法收到的常见原因及解决办法:
邮件头换行格式错误:PHP的
mail()函数要求邮件头的换行必须使用\r\n(CRLF),你代码里用的普通换行会导致邮件头解析异常,被服务器拒收。需要把第一封邮件的headers里的换行全部替换成\r\n。缺少错误检查:第一封邮件调用
mail()后没有验证发送状态,无法确认是否发送成功。可以添加状态判断并记录错误日志,方便排查问题。邮件内容易被垃圾邮件拦截:第一封邮件内容只有"Test",过于简单容易触发垃圾邮件过滤器,建议添加
Content-Type头声明编码和类型,同时丰富内容。MessageID域名无效:第一封邮件的MessageID用了
@test.com,如果该域名没有正确的MX记录,邮件服务器可能会拒绝投递,建议替换为你实际使用的域名。服务器发件人验证限制:部分服务器要求设置信封发件人,可在
mail()的第五个参数添加-f$from,确保发件人通过验证。
修改后的示例代码
$to = $visitor_email; $subject = "Get started"; $from = $your_email; $body = "这是测试邮件,添加具体内容避免被垃圾邮件拦截"; // 修正邮件头格式,添加Content-Type $headers = "From: $from\r\n"; $headers .= "Reply-To: $visitor_email\r\n"; $headers .= "Content-Type: text/plain; charset=UTF-8\r\n"; $headers .= "MessageID: <" . md5('HELLO'.(idate("U")-1000000000).uniqid())."@your-real-domain.com>\r\n"; // 检查第一封邮件发送状态 $firstSent = mail($to, $subject, $body, $headers, "-f$from"); if (!$firstSent) { error_log("第一封邮件发送失败,收件人:$to"); } $to2 = $your_email_2; $subject2 = "Form"; $from2 = $your_email_2; $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : ''; $body2 = "IP: $ip\r\n" . "Name: $name\r\n" . "Company: $company\r\n" . "Email: $visitor_email_2\r\n"; // 统一修正第二封邮件头格式 $headers2 = "From: $from2\r\n"; $headers2 .= "Reply-To: $visitor_email_2\r\n"; $headers2 .= "Content-Type: text/plain; charset=UTF-8\r\n"; $headers2 .= "MessageID: <" . md5('HELLO'.(idate("U")-1000000000).uniqid())."@your-real-domain.com>\r\n"; if (mail($to2, $subject2, $body2, $headers2, "-f$from2")) { header('Location: success.html'); } else { header('Location: fail.html'); }
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

