求助:如何用PHP的mail函数发送带项目文件夹附件的HTML结构化邮件
PHP mail() 函数实现带附件的HTML邮件修改方案
以下是调整后的完整代码,已支持发送带项目文件夹附件的HTML结构化邮件:
<?php $mail_to = 'receiver@gmail.com'; $mail_subject = 'Sample Document Name'; // 生成随机MIME边界符,用于分隔邮件不同内容块 $boundary = uniqid('boundary_', true); // 构建邮件头(转为字符串格式,提升服务器兼容性) $mail_headers = "MIME-Version: 1.0\r\n"; $mail_headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n"; $mail_headers .= "From: PROJECT <reply@gmail.com>\r\n"; $mail_headers .= "Reply-To: reply@gmail.com\r\n"; $mail_receiver_name = 'Sample Receiver Name'; $mail_document_type_name = 'Sample Document Type'; $mail_document_subject = 'Sample Subject'; $mail_document_number = 'Sample Document Number'; $mail_document_remarks = 'Sample Remarks'; // 获取HTML模板内容 ob_start(); require_once('mail_template.php'); $html_content = ob_get_contents(); ob_end_clean(); // 附件配置:替换为你的项目文件夹实际路径和文件名 $attachment_path = './documents/sample_file.pdf'; // 示例路径 $attachment_filename = 'sample_document.pdf'; // 检查附件是否存在,避免报错 if (!file_exists($attachment_path)) { echo '错误:附件文件不存在'; exit; } // 读取并编码附件内容,符合MIME传输规范 $attachment_content = file_get_contents($attachment_path); $attachment_content = chunk_split(base64_encode($attachment_content)); // 拼接完整邮件内容 $mail_message = "--$boundary\r\n"; $mail_message .= "Content-Type: text/html; charset=UTF-8\r\n"; $mail_message .= "Content-Transfer-Encoding: 7bit\r\n\r\n"; $mail_message .= $html_content . "\r\n\r\n"; // 添加附件部分 $mail_message .= "--$boundary\r\n"; $mail_message .= "Content-Type: application/octet-stream; name=\"$attachment_filename\"\r\n"; $mail_message .= "Content-Transfer-Encoding: base64\r\n"; $mail_message .= "Content-Disposition: attachment; filename=\"$attachment_filename\"\r\n\r\n"; $mail_message .= $attachment_content . "\r\n\r\n"; // 结束边界符,标记邮件内容结束 $mail_message .= "--$boundary--"; // 发送邮件 $send = mail($mail_to, $mail_subject, $mail_message, $mail_headers); // 输出准确的发送结果 $output = $send ? '邮件发送成功' : '邮件发送失败'; echo $output; ?>
关键改动说明
- MIME边界符:新增
$boundary作为邮件内容块的分隔标记,确保HTML内容和附件能被邮件客户端正确识别。 - 邮件头优化:
- 将
Content-Type改为multipart/mixed,支持同时承载HTML内容和附件。 - 把原数组格式的headers转为字符串,避免部分服务器对数组格式的解析兼容问题。
- 修正
From头格式,补充有效邮箱地址(多数邮件服务器要求From必须包含合法邮箱)。
- 将
- 附件处理:
- 增加文件存在性检查,提前拦截无效路径的错误。
- 对附件内容做base64编码并分割成符合规范的行长度,确保邮件传输时不会出现格式问题。
- 内容拼接:严格按照MIME规范,用边界符分隔HTML内容和附件,分别设置对应的类型与编码。
- 输出修正:将原逻辑混乱的提示改为直接反馈发送成功/失败。
内容的提问来源于stack exchange,提问作者Mr.Jepoyyy
相关产品推荐
相关产品推荐

