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>'; } ?>
关键修复细节
- 规范MIME边界:所有边界开头都使用
--{$mime_boundary},结束边界使用--{$mime_boundary}--(末尾多两个连字符),符合RFC邮件标准。 - 修正Content-Type格式:补全了
charset的闭合引号,并在Content-Transfer-Encoding后添加了空行(\r\n\r\n),这是邮件内容和头部的标准分隔方式。 - 移除多余的正文拼接:mail函数的第三个参数直接使用构造好的
$message,不再拼接$mainMessage,保证MIME结构完整。 - 统一换行符:所有换行都使用
\r\n,避免不同邮件服务器解析异常。
内容的提问来源于stack exchange,提问作者propatel
相关产品推荐
相关产品推荐

