homepage Welcome to WebmasterWorld Guest from 54.205.241.107
register, free tools, login, search, pro membership, help, library, announcements, recent posts, open posts,
Become a Pro Member

Home / Forums Index / Code, Content, and Presentation / PHP Server Side Scripting
Forum Library, Charter, Moderators: coopster & jatar k

PHP Server Side Scripting Forum

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

10+ Year Member



 
Msg#: 1080 posted 5:52 pm on Oct 30, 2002 (gmt 0)

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

 

jatar_k

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



 
Msg#: 1080 posted 5:58 pm on Oct 31, 2002 (gmt 0)

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?

tdev01

10+ Year Member



 
Msg#: 1080 posted 8:34 pm on Oct 31, 2002 (gmt 0)

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.

andreasfriedrich

WebmasterWorld Senior Member 10+ Year Member



 
Msg#: 1080 posted 8:21 am on Nov 3, 2002 (gmt 0)

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($file
2,filesize($fileatt2));
fclose($file2);
}

if (is_uploaded_file($fileatt2)) {
$file3 = fopen($fileatt3,'rb');
$data3 = fread($file
3,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

Global Options:
 top home search open messages active posts  
 

Home / Forums Index / Code, Content, and Presentation / PHP Server Side Scripting
rss feed

All trademarks and copyrights held by respective owners. Member comments are owned by the poster.
Home ¦ Free Tools ¦ Terms of Service ¦ Privacy Policy ¦ Report Problem ¦ About ¦ Library ¦ Newsletter
WebmasterWorld is a Developer Shed Community owned by Jim Boykin.
© Webmaster World 1996-2014 all rights reserved