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

PHP发送带PDF附件邮件问题:附件为何转为正文代码?

解决PHP发送PDF附件邮件的问题

我来帮你搞定这个问题!你的代码里有几个关键的MIME格式错误,导致PDF的Base64编码直接显示在正文里,而非作为附件。咱们一步步修正:

你的代码里的核心问题

  • Boundary设置错误:boundary=""是空值,而且没有用这个分隔符来区分邮件的正文和附件部分
  • Headers被覆盖:你先给$headers追加了MIME相关设置,然后又用$headers = "From:..."把之前的内容覆盖了,导致MIME配置失效
  • 邮件体结构不符合multipart规范:没有按照MIME要求用boundary分隔正文和附件,直接把Base64内容拼到正文里

修正后的完整代码

<?php
$to = "$Email";
$email_subject = "Thank You from Admission Cell";
$email_body_text = "Dear $Name 
Greeting from ........... 

Thank You & Regards 
Admission Cell
";

// 生成唯一的boundary分隔符,避免冲突
$boundary = uniqid('np_');

// 正确设置邮件头,顺序很重要
$headers = "From: Admission Cell <your-email@example.com>\r\n";
$headers .= "Reply-To: your-reply-email@example.com\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
$headers .= "X-Mailer: PHP/" . phpversion();

// 构建完整的邮件内容,按照multipart/mixed格式组织
$email_body = "--$boundary\r\n";
// 正文部分:设置为纯文本格式
$email_body .= "Content-Type: text/plain; charset=utf-8\r\n";
$email_body .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
$email_body .= $email_body_text . "\r\n\r\n";

// 附件部分
$file_path = "/file_path/public_html/admission.pdf";
$file_name = "admission.pdf";
$file_content = file_get_contents($file_path);

$email_body .= "--$boundary\r\n";
$email_body .= "Content-Type: application/pdf; name=\"$file_name\"\r\n";
$email_body .= "Content-Disposition: attachment; filename=\"$file_name\"\r\n";
$email_body .= "Content-Transfer-Encoding: base64\r\n\r\n";
$email_body .= chunk_split(base64_encode($file_content)) . "\r\n";

// 结束boundary,注意末尾的两个连字符
$email_body .= "--$boundary--";

// 发送邮件
mail($to, $email_subject, $email_body, $headers);
?>

关键修改说明

  • 唯一Boundary:用uniqid()生成唯一的分隔符,确保邮件客户端能正确识别正文和附件的边界
  • 正确的Headers顺序:先设置From/Reply-To,再配置MIME参数,避免内容被覆盖
  • 严格的MIME结构:
    1. 每个部分以--$boundary开头
    2. 正文部分指定text/plain格式和编码
    3. 附件部分明确设置application/pdf的Content-Type,attachment的Content-Disposition(告诉客户端这是附件),以及base64的传输编码
    4. 最后用--$boundary--结束整个邮件内容

这样修改后,邮件客户端就能正确识别PDF为附件,而不是把编码内容显示在正文里了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:07:27