You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:54:03