如何在现有PHP邮件代码中添加附件发送功能?
在现有PHP邮件代码中添加附件发送功能的修改方案
你只需修改邮件头和邮件内容的构建逻辑,无需新增独立代码块,具体修改如下:
关键修改点说明
- 生成多部分邮件边界字符串,用于区分邮件的HTML内容和附件部分
- 将邮件的
Content-Type从纯HTML改为multipart/mixed,并绑定边界 - 重构邮件内容,把原有的HTML消息和附件内容按多部分格式拼接
- 读取已上传的文件内容,用Base64编码后嵌入邮件附件部分
修改后的完整代码
<?php if(isset($_POST["submit"])){ $file_name = $_FILES['fileToUpload']['name']; $file_name1 = rand().$file_name; $file_tmp = $_FILES['fileToUpload']['tmp_name']; move_uploaded_file($file_tmp,"cv/".$file_name1); $conn = mysqli_connect("localhost", "", "", ""); if($conn === false){ die("ERROR: Could not connect. " . mysqli_connect_error()); } $CV = $_REQUEST['fileToUpload']; $Name = $_REQUEST['name']; $Email = $_REQUEST['email']; $Mobile = $_REQUEST['mobile']; $CGPA = $_REQUEST['cgpa']; $RegNo = $_REQUEST['regno']; $Position = $_REQUEST['position']; $Why = $_REQUEST['why']; $sql = "INSERT INTO `ExecutiveBody`(`ID`, `CV`, `Name`, `Email`, `Mobile`, `CGPA`, `RegNo`, `Position`, `Why`) VALUES ('','$file_name1','$Name','$Email','$Mobile','$CGPA','$RegNo','$Position','$Why')"; if(mysqli_query($conn, $sql)){ echo "<script>alert('Thanks For Your Interest. Check Your Email For Confirmation.');</script>"; } else{ echo "ERROR: Hush! Sorry $sql. " . mysqli_error($conn); } $to = "mail@hotmail.com"; // 接收方邮箱 $from = $_REQUEST['email']; // 发送方邮箱 $name = $_REQUEST['name']; $mobile = $_REQUEST['mobile']; $cgpa = $_REQUEST['cgpa']; $regno = $_REQUEST['regno']; $position = $_REQUEST['position']; $why = $_REQUEST['why']; $subject = "Executive Body | Application"; $subject2 = "Copy Of Your Executive Body Application Submission"; $html_message = "<b>Name: </b>" . $name . "<br><br>" . "<b>Email: </b>" . $from . "<br><br>" ."<b>Mobile: </b>" . $mobile . "<br><br>" . "<b>CGPA: </b>" . $cgpa . "<br><br>" . "<b>Reg No: </b>" . $regno . "<br><br>" . "<b>Position: </b>" . $position . "<br><br>" . "<b>Why You Want To Be Part Of Society?: </b><br><br>" . $why; // -------------------------- 新增/修改的邮件附件逻辑 -------------------------- // 生成多部分邮件边界 $boundary = md5(time()); // 构建邮件头 $headers = "MIME-Version: 1.0\r\n"; $headers .= "From: " . $from . "\r\n"; $headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n"; // 构建邮件内容:HTML部分 $message = "--$boundary\r\n"; $message .= "Content-Type: text/html; charset=ISO-8859-1\r\n"; $message .= "Content-Transfer-Encoding: 7bit\r\n\r\n"; $message .= $html_message . "\r\n\r\n"; // 添加附件部分 $file_path = "cv/" . $file_name1; if(file_exists($file_path)){ $file_content = file_get_contents($file_path); $file_content = chunk_split(base64_encode($file_content)); $message .= "--$boundary\r\n"; $message .= "Content-Type: application/octet-stream; name=\"$file_name\"\r\n"; $message .= "Content-Transfer-Encoding: base64\r\n"; $message .= "Content-Disposition: attachment; filename=\"$file_name\"\r\n\r\n"; $message .= $file_content . "\r\n\r\n"; } // 结束边界 $message .= "--$boundary--"; // -------------------------- 邮件附件逻辑结束 -------------------------- // 发送邮件 mail($to, $subject, $message, $headers); // 关闭数据库连接 mysqli_close($conn); } ?>
额外注意事项
- 确保
cv/目录有足够的读写权限,否则文件无法读取和嵌入邮件 - 原代码中的
$cv = $_REQUEST['cv'];未实际使用,可以直接删除 - 如果需要给发送方也发送带附件的确认邮件,只需复制上述邮件构建逻辑,把
$to改成$from,$subject换成$subject2即可
内容的提问来源于stack exchange,提问作者Wasi Ur Rehman Qamar
相关产品推荐
相关产品推荐

