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
相关产品推荐
相关产品推荐

