Welcome to WebmasterWorld Guest from 23.23.53.177

Forum Moderators: coopster & jatar k

Message Too Old, No Replies

PHP multiple email attachments, I've got a problem with my script

   
5:52 pm on Oct 30, 2002 (gmt 0)

10+ Year Member



I'm trying to modify a PHP email attachment script where up to 3 attachments can be sent from a form. For example, the user browses their hard-drive for 3 images and sends them along with their name and address.

I can get one attachment to send but not the others. The attachment fields on the form are named "fileatt", "fileatt2", and "fileatt3. I've included the PHP portion of the script below.

Any ideas would be helpful. Thanks.

----------------------------------------------------------

<?php
// Read POST request params into global vars
$to = $_POST['to'];
$from = $_POST['from'];
$subject = $_POST['subject'];
$message = $_POST['message'];

// Obtain file upload vars
$fileatt = $_FILES['fileatt']['tmp_name'];
$fileatt_type = $_FILES['fileatt']['type'];
$fileatt_name = $_FILES['fileatt']['name'];

$fileatt2 = $_FILES['fileatt2']['tmp_name'];
$fileatt2_type = $_FILES['fileatt2']['type'];
$fileatt2_name = $_FILES['fileatt2']['name'];

$fileatt3 = $_FILES['fileatt3']['tmp_name'];
$fileatt3_type = $_FILES['fileatt3']['type'];
$fileatt3_name = $_FILES['fileatt3']['name'];

$headers = "From: $from";

if (is_uploaded_file($fileatt)) {
// Read the file to be attached ('rb' = read binary)
$file = fopen($fileatt,'rb');
$data = fread($file,filesize($fileatt));
fclose($file);

$file2 = fopen($fileatt2,'rb');
$data2 = fread($file,filesize($fileatt2));
fclose($file2);

$file3 = fopen($fileatt3,'rb');
$data3 = fread($file,filesize($fileatt3));
fclose($file3);

// Generate a boundary string
$semi_rand = md5(time());
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";

// Add the headers for a file attachment
$headers .= "\nMIME-Version: 1.0\n" .
"Content-Type: multipart/mixed;\n" .
" boundary=\"{$mime_boundary}\"";

// Add a multipart boundary above the plain message
$message = "This is a multi-part message in MIME format.\n\n" .
"--{$mime_boundary}\n" .
"Content-Type: text/plain; charset=\"iso-8859-1\"\n" .
"Content-Transfer-Encoding: 7bit\n\n" .
$message . "\n\n";

// Base64 encode the file data
$data = chunk_split(base64_encode($data));

// Add file attachment to the message
$message .= "--{$mime_boundary}\n" .
"Content-Type: {$fileatt_type};\n" .
" name=\"{$fileatt_name}\"\n" .
//"Content-Disposition: attachment;\n" .
//" filename=\"{$fileatt_name}\"\n" .
"Content-Transfer-Encoding: base64\n\n" .
$message . "\n\n" .
//"--{$mime_boundary}--\n";

$message .= "--{$mime_boundary}\n" .
"Content-Type: {$fileatt2_type};\n" .
" name=\"{$fileatt2_name}\"\n" .
//"Content-Disposition: attachment;\n" .
//" filename=\"{$fileatt_name}\"\n" .
"Content-Transfer-Encoding: base64\n\n" .
$message . "\n\n" .
//"--{$mime_boundary}--\n";


$message .= "--{$mime_boundary}\n" .
"Content-Type: {$fileatt3_type};\n" .
" name=\"{$fileatt3_name}\"\n" .
//"Content-Disposition: attachment;\n" .
//" filename=\"{$fileatt_name}\"\n" .
"Content-Transfer-Encoding: base64\n\n" .
$data . $data2 . $data3 . "\n\n" .
"--{$mime_boundary}--\n";



}

// Send the message
$ok = @mail($to, $subject, $message, $headers);
if ($ok) {
echo "<p>Mail sent! Yay PHP!</p>";
} else {
echo "<p>Mail could not be sent. Sorry!</p>";
}
?>

5:58 pm on Oct 31, 2002 (gmt 0)

WebmasterWorld Administrator jatar_k is a WebmasterWorld Top Contributor of All Time 10+ Year Member



Welcome to WebmasterWorld [webmasterworld.com] tdev01

I have looked at this code a couple of times now and I just can't see what might be giving you the problem. Any other hints or error messages? Anyone else have some great insight?

8:34 pm on Oct 31, 2002 (gmt 0)

10+ Year Member



Thanks for the welcome,

The tough part is that the script processes smoothly, no error messages are produced ... but just only the first attachment gets passed along.

I'm out of ideas.

8:21 am on Nov 3, 2002 (gmt 0)

WebmasterWorld Senior Member 10+ Year Member



if (is_uploaded_file($fileatt)) {  
// Read the file to be attached ('rb' = read binary)
$file = fopen($fileatt,'rb');
$data = fread($file,filesize($fileatt));
fclose($file);
}

if (is_uploaded_file($fileatt2)) {
$file2 = fopen($fileatt2,'rb');
$data2 = fread($file2,filesize($fileatt2));
fclose($file2);
}

if (is_uploaded_file($fileatt2)) {
$file3 = fopen($fileatt3,'rb');
$data3 = fread($file3,filesize($fileatt3));
fclose($file3);
}

You might want to try this slightly changed code. It checks whether files two and three were actually uploaded while you only checked the first one. To get $data2 and $data3 it reads from $file2 and $file3 respectively instead of $file as your code did.

You will need to base64_encode $data2 and $data3 as well.

Each attached file needs to reside in its own multipart part. How is the MUA supposed to tell the boundaries of the attachments if you stick them together as one single attachment ($data . $data2 . $data3 . "\n\n")?

Have a look at Sending MIME e-mail from PHP [zend.com] to learn more.

Hope this helps.

Andreas

 

Featured Threads

Hot Threads This Week

Hot Threads This Month