PHP带附件邮件发送本地正常线上提示成功却收不到邮件如何解决
PHP带附件表单线上无法收到邮件问题解决方案
核心问题及对应修复方法如下:
1. 头部变量未初始化
代码中首次使用$headers时直接用了拼接符.=,变量未提前初始化会导致首部出现无效内容,线上PHP严格配置或邮件服务商解析时会直接判定邮件格式非法,同时你缺少必填的发件人头部,非常容易被邮件服务商拦截:
// 新增初始化代码,放在所有$headers赋值之前 $headers = ""; // 新增发件人配置,替换为你线上主机绑定的域名邮箱,大幅降低拦截概率 $headers .= "From: 网站表单通知 <noreply@你的域名.com>" . $eol;
2. MIME结构错误
你将给非MIME客户端展示的提示语放在了请求头部里,属于结构错误,会直接导致邮件解析失败:
// 删除$headers中这一行错误代码 // $headers .= "This is a MIME encoded message." . $eol; // 把这行内容移到body的最开头,放在第一个分隔符之前 $body = "This is a MIME encoded message." . $eol; $body .= "--" . $separator . $eol; // 后面接原本的body内容即可
3. 附件读取逻辑无校验
你未判断附件是否上传成功就直接读取临时文件,若线上PHP上传大小超限、用户未传附件都会导致附件内容为空,破坏MIME结构:
// 放在读取附件文件之前,先校验附件是否合法 if (empty($_FILES['file']['tmp_name']) || !is_uploaded_file($_FILES['file']['tmp_name'])) { // 无附件时可直接发纯文本,或者提示用户上传附件 echo "<script>alert('请上传有效附件');</script>"; exit; } $content = file_get_contents($fileName); $content = chunk_split(base64_encode($content));
4. 系统兼容优化
不同操作系统的换行符规则不同,将固定写死的\r\n替换为PHP内置常量PHP_EOL,适配线上Linux主机的邮件服务配置:
// 替换原来的$eol定义 $eol = PHP_EOL;
5. 拦截排查操作
如果修改后还是收不到邮件,先做以下排查:
- 去收件邮箱的垃圾箱、广告邮件目录查找,带附件的陌生发件人邮件很容易被自动归类
- 先将收件邮箱替换为和你线上主机同域名的邮箱测试,排除Gmail对域外陌生发件人的拦截规则
- 检查线上主机的邮件发送日志,确认邮件是被本地服务拒收还是被收件方服务商退回
内容的提问来源于stack exchange,提问作者Levche
相关产品推荐
相关产品推荐

