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

PHP发送含PDF/DOCX附件的HTML内容邮件问题求助

解决PHP发送带HTML内容和PDF/DOCX附件的邮件问题

我明白你现在遇到的问题——纯HTML邮件能正常发送,但一加上PDF或DOCX附件就卡壳了对吧?这是因为你之前的邮件头只设置了text/html类型,没法处理多部分内容(HTML正文+附件)。咱们得改成多部分MIME消息来搞定这个问题,下面是具体的实现步骤和完整代码:

核心原理

邮件要同时包含HTML正文和附件,必须使用multipart/mixed的MIME类型,并用一个唯一的“边界字符串”来分隔不同的内容块(正文、附件),避免内容相互混淆。

完整实现代码

$to = 'test@yandex.ru';
$subject = 'Test with Attachment';
$from = 'test@icloud.com';

// 生成唯一的边界字符串,用来分隔邮件里的不同内容块
$boundary = uniqid('np');

// 构建邮件头,重点设置多部分MIME类型
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'From: ' . $from . "\r\n";
$headers .= 'Reply-To: ' . $from . "\r\n";
$headers .= 'X-Mailer: PHP/' . phpversion() . "\r\n";
$headers .= 'Content-Type: multipart/mixed; boundary="' . $boundary . '"' . "\r\n\r\n";

// 开始拼接邮件内容
$message = '';

// 第一部分:HTML正文
$message .= '--' . $boundary . "\r\n";
$message .= 'Content-Type: text/html; charset=iso-8859-1' . "\r\n";
$message .= 'Content-Transfer-Encoding: 8bit' . "\r\n\r\n";
$message .= '<h1>Hello, this is an HTML email with attachment!</h1>' . "\r\n\r\n";

// 第二部分:添加附件(以PDF为例,DOCX只需替换MIME类型)
$file_path = 'path/to/your/file.pdf'; // 替换成你的实际文件路径
$file_name = basename($file_path);
$file_content = file_get_contents($file_path);

if ($file_content) {
    $message .= '--' . $boundary . "\r\n";
    // 不同文件对应不同MIME类型:
    // PDF → application/pdf
    // DOCX → application/vnd.openxmlformats-officedocument.wordprocessingml.document
    $message .= 'Content-Type: application/pdf; name="' . $file_name . '"' . "\r\n";
    $message .= 'Content-Disposition: attachment; filename="' . $file_name . '"' . "\r\n";
    $message .= 'Content-Transfer-Encoding: base64' . "\r\n\r\n";
    // 用base64编码文件内容,并用chunk_split分割成符合邮件规范的长度
    $message .= chunk_split(base64_encode($file_content)) . "\r\n\r\n";
}

// 结束边界,别忘了加上两个短横线
$message .= '--' . $boundary . '--';

// 发送邮件
if (mail($to, $subject, $message, $headers)) {
    echo 'Your mail with attachment has been sent successfully.';
} else {
    echo 'Unable to send email. Please try again.';
}

关键注意事项

  • 边界字符串要唯一:用uniqid()生成就能保证唯一性,避免内容解析错误
  • 附件编码:邮件传输要求附件内容必须用base64_encode编码,再用chunk_split分割成每行76字符的格式(符合邮件传输规范)
  • MIME类型要对应:不同文件类型必须设置正确的MIME类型,不然收件方可能无法识别附件
  • 文件权限:确保PHP脚本有读取附件文件的权限,不然会读取失败
  • 边界格式:每个内容块开头是--$boundary,最后必须用--$boundary--结束整个邮件内容,少了短横线会导致邮件解析失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 00:17:36