如何用PHP发送带附件的HTML邮件?附实现示例
如何用PHP实现带附件的HTML邮件发送?
我来帮你搞定这个带附件的HTML邮件发送问题!你已经完成了表单搭建和基础的邮件内容生成,现在只需要补充MIME多部分邮件的构建逻辑就行,下面是完整的实现方案:
核心原理
发送带附件的HTML邮件不能直接用普通的text/html格式,需要构建multipart/mixed类型的MIME邮件,把HTML正文和附件分成独立的“部分”,用自定义的边界字符串分隔每个部分,确保邮件客户端能正确解析正文和附件。
完整的career.php代码
替换你现有的PHP代码,以下是包含附件处理的完整实现:
<?php if(isset($_POST['submit'])){ // 获取表单数据 $fname = $_POST['fname']; $lname = $_POST['lname']; $phone = $_POST['phone']; $email = $_POST['email']; $education = $_POST['education']; $experience = $_POST['experience']; $dept = $_POST['dept']; // 构建HTML邮件正文(补全你未完成的表格内容) $html_message = ' <table width="70%" border="1" cellpadding="5" cellspacing="0" style="height: 129px;"> <tbody> <tr style="height: 21px;"> <td colspan="2" bgcolor="#6b9e19" align="center" style="font-family: Verdana, Geneva, sans-serif; font-size: 14px; color: #ffffff; height: 21px;"><b>Resume From Website.</b></td> </tr> <tr style="height: 18px;"> <td width="30%" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px; text-align: left; color: #7a7a7a; height: 18px;"><b>First Name</b></td> <td width="70%" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px; text-align: left; color: #404040; height: 18px;"><b>' . $fname . '</b></td> </tr> <tr style="height: 18px;"> <td width="30%" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px; text-align: left; color: #7a7a7a; height: 18px;"><b>Last Name</b></td> <td width="70%" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px; text-align: left; color: #404040; height: 18px;"><b>' . $lname . '</b></td> </tr> <tr style="height: 18px;"> <td width="30%" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px; text-align: left; color: #7a7a7a; height: 18px;"><b>Phone Number</b></td> <td width="70%" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px; text-align: left; color: #404040; height: 18px;"><b>' . $phone . '</b></td> </tr> <tr style="height: 18px;"> <td width="30%" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px; text-align: left; color: #7a7a7a; height: 18px;"><b>Email</b></td> <td width="70%" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px; text-align: left; color: #404040; height: 18px;"><b>' . $email . '</b></td> </tr> <tr style="height: 18px;"> <td width="30%" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px; text-align: left; color: #7a7a7a; height: 18px;"><b>Education</b></td> <td width="70%" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px; text-align: left; color: #404040; height: 18px;"><b>' . $education . '</b></td> </tr> <tr style="height: 18px;"> <td width="30%" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px; text-align: left; color: #7a7a7a; height: 18px;"><b>Work Experience</b></td> <td width="70%" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px; text-align: left; color: #404040; height: 18px;"><b>' . $experience . '</b></td> </tr> <tr style="height: 18px;"> <td width="30%" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px; text-align: left; color: #7a7a7a; height: 18px;"><b>Department Applying For</b></td> <td width="70%" style="font-family: Verdana, Geneva, sans-serif; font-size: 12px; text-align: left; color: #404040; height: 18px;"><b>' . $dept . '</b></td> </tr> </tbody> </table>'; // 邮件基本配置 $to = "your-recipient-email@example.com"; // 替换为接收简历的目标邮箱 $subject = "New Job Application - " . $fname . " " . $lname; $sender_email = $email; // 用用户提交的邮箱作为发件人 $sender_name = $fname . " " . $lname; // 生成唯一边界字符串(分隔邮件的不同部分) $boundary = md5(time()); // 构建邮件头 $headers = "From: " . $sender_name . " <" . $sender_email . ">\r\n"; $headers .= "Reply-To: " . $sender_email . "\r\n"; $headers .= "MIME-Version: 1.0\r\n"; $headers .= "Content-Type: multipart/mixed; boundary=\"" . $boundary . "\"\r\n"; $headers .= "X-Mailer: PHP/" . phpversion(); // 构建多部分邮件内容 $message = "--" . $boundary . "\r\n"; $message .= "Content-Type: text/html; charset=UTF-8\r\n"; $message .= "Content-Transfer-Encoding: quoted-printable\r\n\r\n"; $message .= $html_message . "\r\n\r\n"; // 处理上传的附件 if(isset($_FILES['my_file']) && $_FILES['my_file']['error'] == UPLOAD_ERR_OK){ $file_name = $_FILES['my_file']['name']; $file_tmp = $_FILES['my_file']['tmp_name']; $file_type = $_FILES['my_file']['type']; // 读取文件内容并转为base64编码(邮件附件要求的格式) $file_content = chunk_split(base64_encode(file_get_contents($file_tmp))); // 将附件添加到邮件中 $message .= "--" . $boundary . "\r\n"; $message .= "Content-Type: " . $file_type . "; name=\"" . $file_name . "\"\r\n"; $message .= "Content-Disposition: attachment; filename=\"" . $file_name . "\"\r\n"; $message .= "Content-Transfer-Encoding: base64\r\n\r\n"; $message .= $file_content . "\r\n\r\n"; } // 结束邮件边界 $message .= "--" . $boundary . "--"; // 发送邮件并反馈结果 if(mail($to, $subject, $message, $headers)){ echo "<p>Application submitted successfully! We'll get back to you soon.</p>"; } else { echo "<p>Oops! There was an error sending your application. Please try again later.</p>"; } } ?>
关键代码解析
- 边界字符串:用
md5(time())生成唯一标识,确保邮件的正文和附件部分不会互相混淆。 - 邮件头配置:指定
multipart/mixed类型,告诉邮件客户端这是包含多个部分的邮件,同时关联边界字符串。 - HTML正文处理:设置
text/html类型和UTF-8编码,保证HTML格式能在邮件客户端正确渲染。 - 附件处理流程:
- 先检查文件上传是否成功(通过
UPLOAD_ERR_OK判断) - 读取临时文件内容,用
base64_encode编码为邮件支持的格式 - 添加附件的类型、文件名、编码方式等元信息到邮件内容
- 先检查文件上传是否成功(通过
- 邮件发送:调用PHP原生
mail()函数,传入完整的邮件头和多部分内容。
重要注意事项
- 服务器配置:PHP的
mail()函数依赖服务器的sendmail或SMTP配置,如果遇到发送失败的情况,推荐使用PHPMailer库(原生PHP库,无需额外安装),它更稳定且支持SMTP认证,适合生产环境。 - 文件上传限制:确保
php.ini中设置了合理的参数:upload_max_filesize = 10M(允许上传的最大文件大小)post_max_size = 10M(POST请求的总大小限制)
- 安全验证:为了防范恶意文件,建议添加文件类型白名单验证,比如只允许PDF、DOC、DOCX格式:
$allowed_types = ["application/pdf", "application/msword", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"]; if(!in_array($file_type, $allowed_types)){ echo "<p>Only PDF, DOC, DOCX files are allowed!</p>"; exit; } - 字符编码:全程使用UTF-8编码,避免邮件内容出现乱码。
内容的提问来源于stack exchange,提问作者Amit Mhaske
相关产品推荐
相关产品推荐

