tags:

views:

85

answers:

4

Hello, I am trying to create an email form that allows you to send an attachment. I have pieced code together from my PHP book and several websites.

When I send the email using this form the attachment ends up corrupted and the "$comments" don't seem to go through.

Here is the code I am using:

<?php
$to = $_POST['to'];
$from = $_POST['from'];
$re = $_POST['re'];
$comments= $_POST['comments'];

$att = $_FILES['att'];
$att_path= $_FILES['att']['tmp_name'];
$att_name = $_FILES['att']['name'];
$att_size = $_FILES['att']['size'];
$att_type = $_FILES['att']['type'];

//open, read, then close the file
$fp = fopen( $att_path, "rb" );
$file = fread( $fp, $att_size );
fclose($fp);

#create a boundary string
$num = md5(time());
$str = "==Multipart_Boumdary_x{$num}x";

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

//define header
$hdr = "MIME-Versio: 1.0\r\n";
$hdr .= "Content-Type: multipart/mixed; ";
$hdr .= "boundary=\"{$str}\"\r\n";
$hdr .= "From: $from \r\n";

#define message
$msg = "This is a multi-part message in MIME format\r\n\n";
$msg .= "--{$str}\r\n";
$msg .= "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n";
$msg .= "Content-Transfer-Encoding: 8bit\r\n";
$msg .= "$comments\r\n\n";
$msg .= "--{$str}\r\n";

#define the non-text attatchment
$msg .= "Content-Type: {$att_type}; ";
$msg .= "name=\"{$att_name}\"\r\n";
$msg .= "Content-Disposition: attachment; ";
$msh .= "filename=\"{$att_name}\"\r\n";
$msg .= "Content-Transfer-Encoding: base64\r\n";
$msg .= "$file\r\n\n";
$msg .= "--{$str}";

#sendmail
$ok = mail( $to, $re, $msg, $hdr );
if( $ok ) echo "OK";

?>

So, what am I doing wrong?

Thanks!

+2  A: 

You better use http://swiftmailer.org/ or http://phpmailer.worxware.com/

Kane
Swift Mailer seems nice however, the propose of this is for me to better my PHP skills, so I would like to know what I did wrong so that I can improve it.
mrlanrat
You can check their sources, they bpth have convinient methods to add all sorts of attachments.
Kane
A: 

I think you'd find it easier to use a something like PHPMailer http://phpmailer.worxware.com/index.php?pg=phpmailer

Palo Verde
A: 

Try this to encode your file for transit.

Replace the line:

  $file = chunk_split(base64_encode($file));

With:

  //Encode the file for transit
  $content = '';
  $fp = fopen($att_path, 'r'); 
  do { 
    $data = fread($fp, 8192); 
    if (strlen($data) == 0) break; 
    $content .= $data; 
  } while (true); 
  $file = chunk_split(base64_encode($content));
Wadih M.
That code just seems to put the attachment in the message text.
mrlanrat
A: 
$str = "==Multipart_Boumdary_x{$num}x";

Hopefully you've tried (notice the spelling of bouNdary):

$str = "==Multipart_Boundary_x{$num}x";
ken
Thanks, I fixed that but I am still having the same problem.
mrlanrat