1

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!

1

4 Answers 4

2

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

Sign up to request clarification or add additional context in comments.

2 Comments

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.
You can check their sources, they bpth have convinient methods to add all sorts of attachments.
0

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)); 

1 Comment

That code just seems to put the attachment in the message text.
0

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

Comments

0
$str = "==Multipart_Boumdary_x{$num}x";

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

$str = "==Multipart_Boundary_x{$num}x";

1 Comment

Thanks, I fixed that but I am still having the same problem.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.