<?php
/* Dan Potter:
Sure. I changed a few other things in here too though. One is that I let
you specify what the destination filename is (i.e., what is shows up as
in the attachment). This is useful since in a web submission you often
can't tell what the filename was supposed to be from the submission
itself. I also added my own version of chunk_split because our
production version of PHP doesn't have it. You can change that back or
whatever though =).  Finally, I added an extra "\n" before the message
text gets added into the MIME output because otherwise the message text
wasn't showing up.
note: someone mentioned a command-line utility called 'mutt' that 
can mail attachments.

If chunk_split works on your system, change the call to my_chunk_split
to chunk_split 

Note: if you don't have base64_encode on your sytem it will not work
*/

/**
 * CMailFile sends mail with attachment
 *
 * @package   Include
 * @author    <a href=mailto:ylee@monet.csc.vill.edu>YLee</a>
 * @author    Dan Potter
 */

class CMailFile {
  var 
$actual_name;
  var 
$subject;
  var 
$addr_to;
  var 
$text_body;
  var 
$text_encoded;
  var 
$mime_headers;
  var 
$mime_boundary "--==================_846811060==_";
  var 
$smtp_headers;
  
  
/**
   * Constructor
   *
   * Initializes the complete object and sets all values for sending
   * Added option to add headers
   * @author    YLee
   * @author    Herman Suijs
   * @param    $subject: subject
   */
  
function CMailFile($subject,$to,$from,$msg,$filename,$mimetype "application/octet-stream"$mime_filename false,$actual_name="",$headers="") {
    
$this->actual_name $actual_name;
    
$this->subject $subject;
    
$this->addr_to $to;
    
$this->smtp_headers $this->write_smtpheaders($from);
    
$this->text_body $this->write_body($msg);
    
$this->text_encoded $this->attach_file($filename,$mimetype,$mime_filename);
    
$this->mime_headers $this->write_mimeheaders($filename$mime_filename).$headers;
  } 
/* function CMailFile($subject,$t... */

  /**
   * Attach file
   *
   * This method attaches the file to the messagetext
   * Problem with actual name corrected
   * @author YLee
   * @author Herman Suijs
   */
  
function attach_file($filename,$mimetype,$mime_filename) {
    
$encoded $this->encode_file($filename);
    if (
$mime_filename$filename $mime_filename;
    
$out "--" $this->mime_boundary "\n";
    
$out $out "Content-type: " $mimetype "; name=\"$this->actual_name\";\n";    
    
$out $out "Content-Transfer-Encoding: base64\n";
    
$out $out "Content-disposition: attachment; filename=\"$this->actual_name\"\n\n";
    
$out $out $encoded "\n";
    
$out $out "--" $this->mime_boundary "--" "\n";
    return 
$out
// added -- to notify email client attachment is done
  
/* function attach_file($filename... */

  /**
   * Encode the file
   *
   * Properly encode the file before sending
   * @author    YLee
   */
  
function encode_file($sourcefile) {
    if (
is_readable($sourcefile)) {
      
$fd fopen($sourcefile"r");
      
$contents fread($fdfilesize($sourcefile));
      
$encoded my_chunk_split(base64_encode($contents));
      
fclose($fd);  
    } 
/* if (is_readable($sourcefile)) */
    
return $encoded;
  } 
/* function encode_file($sourcefi... */

  /**
   * Send the file
   */
  
function sendfile() {
    
$headers $this->smtp_headers $this->mime_headers;   
    
$message $this->text_body $this->text_encoded;
    
mail($this->addr_to,$this->subject,$message,$headers);
  } 
/* function sendfile() */

  /**
   * Write bodytext
   */
  
function write_body($msgtext) {
    
$out "--" $this->mime_boundary "\n";
    
$out $out "Content-Type: text/plain; charset=\"us-ascii\"\n\n";
    
$out $out $msgtext "\n";
    return 
$out;
  } 
/* function write_body($msgtext) */

  /**
   * Write the MIME Headers
   */
  
function write_mimeheaders($filename$mime_filename) {
    if (
$mime_filename$filename $mime_filename;
    
$out "MIME-version: 1.0\n";
    
$out $out "Content-type: multipart/mixed; ";
    
$out $out "boundary=\"$this->mime_boundary\"\n";
    
$out $out "Content-transfer-encoding: 7BIT\n";
    
$out $out "X-attachments: $filename;\n\n";
    return 
$out;
  } 
/* function write_mimeheaders($fi... */

  /**
   * Write the SMTP Headers
   */
  
function write_smtpheaders($addr_from) {
    
$out "From: $addr_from\n";
    
$out $out "Reply-To: $addr_from\n";
    
$out $out "X-Mailer: PHP\n"// Probably not appropriate for PHP3
    
$out $out "X-Sender: $addr_from\n";
    return 
$out;
  } 
/* function write_smtpheaders($ad... */
/* class CMailFile */

// usage - mimetype example "image/gif"
// $mailfile = new CMailFile($subject,$sendto,$replyto,$message,$filename,$mimetype);
// $mailfile->sendfile();

// Splits a string by RFC2045 semantics (76 chars per line, end with \r\n).
// This is not in all PHP versions so I define one here manuall.
/**
 * Chunk split
 *
 * This is an extra function added to make it work with all PHP versions
 * @author    YLee
 */
function my_chunk_split($str)
{
  
$stmp $str;
  
$len strlen($stmp);
  
$out "";
  while (
$len 0) {
    if (
$len >= 76) {
      
$out $out substr($stmp076) . "\r\n";
      
$stmp substr($stmp76);
      
$len $len 76;
    } 
/* if ($len >= 76) */
    
else {
      
$out $out $stmp "\r\n";
      
$stmp ""$len 0;
    } 
/* else */
  
/* while ($len > 0) */
  
return $out;
/* function my_chunk_split($str) */

// end script