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

PHP邮件发送附件正常但正文缺失问题求助

问题分析与解决方案

我看了你的代码,邮件正文不显示的问题主要出在MIME邮件结构的格式错误以及mail函数参数传递错误上,具体问题和修复方案如下:

核心错误点

  • MIME边界格式错误:标准的多部分邮件边界需要以两个连字符(--)开头,你代码里有的地方只用了一个连字符,导致邮件客户端无法正确识别正文和附件的分界。
  • Content-Type定义不完整:正文部分的charset参数引号没有闭合,而且缺少必要的换行分隔,导致客户端无法解析正文内容。
  • mail函数参数错误:你把$mainMessage和$message拼接后传入mail函数,这会破坏原本的MIME结构,额外的正文内容会被客户端当作垃圾内容忽略。
  • 换行符不规范:邮件头和MIME内容应该使用\r\n(CRLF)作为换行符,部分邮件服务器对单独的\n兼容性不好。

修正后的完整代码

<?php
$name = $name; 
$email = $email; 
$to = "$name <$email>"; 
$from = "Travel Mate "; 
$subject = "42 Days Across Border Requirements"; 
$mainMessage = "Kindly Find the Attached File"; 

$fileatt = "42dc-form.pdf"; 
$fileatttype = "application/pdf"; 
$fileattname = "42DaysAcrossBorders.pdf"; 

// 构造邮件头,统一使用\r\n换行
$headers = 'From: info@travelmate.com.pk' . "\r\n" . 
           'Reply-To: info@travelmate.com.pk' . "\r\n" . 
           'X-Mailer: PHP/' . phpversion(); 

// 读取附件内容
$file = fopen($fileatt, 'rb'); 
$data = fread($file, filesize($fileatt)); 
fclose($file); 

// 生成MIME边界
$semi_rand = md5(time()); 
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; 

// 更新邮件头,添加MIME信息
$headers .= "\r\nMIME-Version: 1.0\r\n" . 
            "Content-Type: multipart/mixed;\r\n" . 
            " boundary=\"{$mime_boundary}\""; 

// 构造完整的MIME邮件内容
$message = "--{$mime_boundary}\r\n" . 
           "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n" . 
           "Content-Transfer-Encoding: 7bit\r\n\r\n" . // 空一行分隔头和内容
           $mainMessage . "\r\n\r\n"; // 正文内容

// 处理附件并添加到邮件
$data = chunk_split(base64_encode($data)); 
$message .= "--{$mime_boundary}\r\n" . 
            "Content-Type: {$fileatttype};\r\n" . 
            " name=\"{$fileattname}\"\r\n" . 
            "Content-Disposition: attachment;\r\n" . 
            "filename=\"{$fileattname}\"\r\n" . 
            "Content-Transfer-Encoding: base64\r\n\r\n" . 
            $data . "\r\n"; 

// 结束MIME边界(注意末尾的两个连字符)
$message .= "--{$mime_boundary}--\r\n"; 

// 发送邮件,直接传入构造好的$message
if (mail($to, $subject, $message, $headers)) { 
    header('Location:index.php?s=success'); 
    $result='<div class="alert alert-success col-sm-12">Thank You! I will be in touch</div>'; 
} 
?>

关键修复细节

  1. 规范MIME边界:所有边界开头都使用--{$mime_boundary},结束边界使用--{$mime_boundary}--(末尾多两个连字符),符合RFC邮件标准。
  2. 修正Content-Type格式:补全了charset的闭合引号,并在Content-Transfer-Encoding后添加了空行(\r\n\r\n),这是邮件内容和头部的标准分隔方式。
  3. 移除多余的正文拼接:mail函数的第三个参数直接使用构造好的$message,不再拼接$mainMessage,保证MIME结构完整。
  4. 统一换行符:所有换行都使用\r\n,避免不同邮件服务器解析异常。

内容的提问来源于stack exchange,提问作者propatel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:12:16