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

PHP邮件附件无法读取求助:表单上传ODT简历附件异常

Hey there! Let's tackle that ODT attachment issue with PHP's mail() function— I've run into similar headaches before, so here are the most likely fixes to get your resume attachments working properly:

1. Stop using the uploaded file's "name" directly

A common rookie mistake is trying to read from $_FILES['resume']['name']— that's just the original filename from the user's computer. The actual uploaded file lives in a temporary location on your server, which you need to access via $_FILES['resume']['tmp_name'].

First, always verify the file was actually uploaded successfully:

if (!is_uploaded_file($_FILES['resume']['tmp_name'])) {
    die("Error: Uploaded file is not valid");
}

2. Properly encode the binary ODT file

ODT files are binary, so you can't just dump their content into the email. You need to base64-encode the file content and split it into 76-character chunks (per email standards):

$attachment_content = chunk_split(base64_encode(file_get_contents($_FILES['resume']['tmp_name'])));

If file_get_contents() returns false here, check your server's temp directory permissions— PHP might not have read access to it.

3. Fix your MIME headers and mail structure

The mail() function needs a properly formatted multipart message to handle attachments. Here's a complete example of setting up the headers and message body correctly:

// Define a unique boundary string for the multipart message
$boundary = md5(uniqid(time()));

// Build headers
$headers = "From: Your Name <your-email@example.com>\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";

// Build the message content
$message = "--$boundary\r\n";
// Add form submission details as plain text
$message .= "Content-Type: text/plain; charset=UTF-8\r\n\r\n";
$message .= "New resume submission:\r\n";
$message .= "Name: " . $_POST['name'] . "\r\n";
// Add other form fields here...

// Add the ODT attachment
$filename = $_FILES['resume']['name'];
$filetype = $_FILES['resume']['type'] ?: 'application/vnd.oasis.opendocument.text'; // Fallback if type is missing

$message .= "--$boundary\r\n";
$message .= "Content-Type: $filetype; name=\"$filename\"\r\n";
$message .= "Content-Disposition: attachment; filename=\"$filename\"\r\n";
$message .= "Content-Transfer-Encoding: base64\r\n\r\n";
$message .= $attachment_content . "\r\n";

// Close the multipart boundary
$message .= "--$boundary--";

// Send the email
mail('your-recipient@example.com', 'New Resume Submission', $message, $headers);

Critical note: Use \r\n for line breaks in headers and message parts— using just \n can break email parsing on some servers.

4. Consider ditching mail() for PHPMailer

Let's be real: manually building MIME messages with mail() is error-prone. The PHPMailer library handles attachments, encoding, and server quirks automatically, making your life way easier. Here's a quick example:

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php'; // Install via Composer

$mail = new PHPMailer(true);
try {
    // Set up basic mail settings
    $mail->setFrom('your-email@example.com', 'Your Name');
    $mail->addAddress('your-recipient@example.com');
    
    // Add the uploaded ODT file directly
    $mail->addAttachment($_FILES['resume']['tmp_name'], $_FILES['resume']['name']);
    
    // Add form content
    $mail->isHTML(false);
    $mail->Subject = 'New Resume Submission';
    $mail->Body = "User details:\r\nName: " . $_POST['name'];
    
    $mail->send();
    echo "Submission sent successfully!";
} catch (Exception $e) {
    echo "Error sending email: {$mail->ErrorInfo}";
}

Quick troubleshooting tip

If you're still stuck, send a test email to yourself and view the "raw" message source in your email client. Check if the attachment's base64 content looks valid (it should be a long string of alphanumeric characters without random garbage).

内容的提问来源于stack exchange,提问作者user8070092

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:56:29