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

如何用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>";
    }
}
?>

关键代码解析

  1. 边界字符串:用md5(time())生成唯一标识,确保邮件的正文和附件部分不会互相混淆。
  2. 邮件头配置:指定multipart/mixed类型,告诉邮件客户端这是包含多个部分的邮件,同时关联边界字符串。
  3. HTML正文处理:设置text/html类型和UTF-8编码,保证HTML格式能在邮件客户端正确渲染。
  4. 附件处理流程:
    • 先检查文件上传是否成功(通过UPLOAD_ERR_OK判断)
    • 读取临时文件内容,用base64_encode编码为邮件支持的格式
    • 添加附件的类型、文件名、编码方式等元信息到邮件内容
  5. 邮件发送:调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:25:46