Class for sending mail with MIME attachments in multipart format using external sendm

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Class for sending mail with MIME attachments in multipart format using external sendm

    Code:
    <?
     /*
     Mail: An object to encapsulate the sending of email. Allows user-specified 
     From: addresses, handles the encoding of attachments; conforms more or less to 
     MIME standards.. Uses sendmail to send the mail, mimencode to do the MIME 
     encoding, and zip to automatically zip attachments.
    
     Contacting the author(s):
     Brought to you by the team at Sequoia Softworks, http://www.sequoiasoft.com
     Feel free to contact tony@sequoiasoft.com and tell us how you like it!
     (Or to complain bitterly, report bugs, or suggest new features.)
    
     Known shortcomings/bugs:
     o guessMIMEType()only knows about a few MIME types. You can expand this as 
     you need.
     o $mime_boundary in the Send() method should be randomly generated, but it 
     isn't likely to ever hurt anything in its current form
    
     Example:
     require("Mail.phtml");
     $mymessage = new Mail();
     $mymessage->from = "php3.script@www.somedomain.net";
     $mymessage->to = "luckyuser@destination.org";
     $mymessage->subject = "This is your lucky day";
     $mymessage->headers["Reply-To"] = "webmaster@www.somedomain.net";
     $mymessage->headers["X-Extra-Header"] = "Pointless Header v3.0";
     $mymessage->body = "Doesn't it feel good to get mail?\nEspecially with files 
     attached!\n";
     $mymessage->attachments[0] = "tarball.tar.gz";
     $mymessage->attachments[1] = "images/smiling_countenance.gif";
     $mymessage->attachments[2] = "/usr/share/reference/jargondict.html";
     $mymessage->attachments[3] = "./core";
     $mymessage->attachments[4] = "/etc/passwd"; //naughty naughty!!
     $mymessage->ZipAttachments("your_files.zip"); //uncomment this to zip all 
     //the attachments into one big 
     //attachment.
     $mymessage->Send();
     */
     class Mail {
             var $from; //The sender
             var $to; //The recipient
             var $subject; //The subject line
             var $headers; //A hash of additional headers (headername => headervalue)
             var $zipname; //The name of the file the attachments are zipped into
              //($zipname == false if attachments are to be sent 
     //individually)
             var $attachments; //An array of files to attach
             var $body; //The body text of the message
             
             //Mail constructor: initializes vars to default values. 'Nuff said.
             function Mail() {
                     $this->from = "";
                     $this->to = "";
                     $this->subject = "";
                     $this->headers = array();
                     $this->zipname = false;
                     $this->attachments = array();
                     $this->body = "";
             }
             
             //Auxiliary method, used to guess a file's MIME type
             //based on its extension. Doesn't know about too many
             //extensions right now
             function guessMIMEType($filename) {
                     //GUESS MIME TYPE
                     $filename = basename($filename);
                     if(strrchr($filename,".") == false) {
                             return("application/octet-stream");
                     }
                     
                     $ext = strrchr($filename,".");
                     switch($ext) {
                             case ".gif":
                                     return "image/gif";
                                     break;
                             case ".gz":
                                     return "application/x-gzip";
                             case ".htm":
                             case ".html":
                                     return "text/html";
                                     break;
                             case ".jpg":
                                     return "image/jpeg";
                                     break;
                             case ".tar":
                                     return "application/x-tar";
                                     break;
                             case ".txt":
                                     return "text/plain";
                                     break;
                             case ".zip":
                                     return "application/zip";
                                     break;
                             default:
                                     return "application/octet-stream";
                                     break;
                     }
             }
    
             //Cute little convenience method. Supply it with a filename to 
             //zip attachments to, or supply it with false if attachments are
             //sent individually
             function ZipAttachments($name) {
                     $this->zipname = $name;
             }
    
             //The workhorse method, does the actually sending of the mail.
             //Doesn't check for errors so be careful!
             function Send($sendmail = "sendmail") {
                     if($this->from == "")
                             $fp = popen($sendmail . " -i " . $this->to, "w");
                     else
                             $fp = popen($sendmail . " -i -f\"" . $this->from . "\" 
     " . $this->to, "w");
    
                     $mime_boundary = "-1747901728-1448367683-913849620=:4553";
                     
                     if($fp == false)
                             return false;
                     
                     //Write subject header        
                     fwrite($fp,"Subject: " . $this->subject . "\n");
             
                     //Write user-defined headers        
                     reset($this->headers);
                     while(list($hdrname,$hdrval) = each($this->headers)) {
                             fwrite($fp,$hdrname . ": " . $hdrval . "\n");
                     }
                     
                     //If there are attachments, this needs to be a MIME message
                     if(count($this->attachments) > 0) {
                             //Write MIME headers
                             fwrite($fp,"MIME-Version: 1.0\n");
                             fwrite($fp,"Content-Type: multipart/mixed; BOUNDARY=\"" 
     . $mime_boundary . "\"\n");
                             fwrite($fp,"\n");
                             //Write dummy message body
                             fwrite($fp," This message is in MIME format. The 
     first part should be readable text,\n");
                             fwrite($fp," while the remaining parts are likely 
     unreadable without MIME-aware tools.\n");
                             fwrite($fp," Send mail to 
     mime@docserver.cac.washington.edu for more info.\n");
                             fwrite($fp,"\n");
                             
                             //Write message text
                             fwrite($fp,"--" . "$mime_boundary" . "\n");
                             fwrite($fp,"Content-Type: text/plain; charset=US-
     ASCII\n");
                             fwrite($fp,"\n");
                             fwrite($fp,$this->body);
                             fwrite($fp,"\n");
                             
                             //Handle attachments
                             if($this->zipname != false) { //IF we've been told to 
     //zip the attachments
                                     fwrite($fp,"--" . $mime_boundary . "\n");
                                     fwrite($fp,"Content-Type: application/zip; name=
     \"". $this->zipname . "\"\n");
                                     fwrite($fp,"Content-Transfer-Encoding: base64
     \n");
                              //fwrite($fp,"Content-ID: " . $content_ID . "\n");
                                     fwrite($fp,"Content-Description:\n");
                                     fwrite($fp,"\n");
                                     $cmdline = "zip - ";
                     while(list($key, $attachment_name) = each($this->attachments))
                                             $cmdline .= "$attachment_name ";
                                     $cmdline .= "| mimencode -b";
                                     $pp = popen($cmdline,"r");
                                     while(!feof($pp)) {
                                             $data = fread($pp,4096);
                                             fwrite($fp,$data);
                                     }
                                     pclose($pp);
                             }
                             else { //no need to zip the attachments, attach them 
     //separately
                     while(list($key, $attachment_name) = each($this->attachments)) {
                                     fwrite($fp,"--" . $mime_boundary . "\n");
     fwrite($fp,"Content-Type: " . $this->guessMIMEType($attachment_name) . "; 
     name=\"". basename($attachment_name) . "\"\n");
                             fwrite($fp,"Content-Transfer-Encoding: base64\n");
                                             //fwrite($fp,"Content-ID: " . 
     //$content_ID . "\n");
                                             fwrite($fp,"Content-Description:\n");
                                             fwrite($fp,"\n");
                              $pp = popen("mimencode -b $attachment_name","r");
                                             while(!feof($pp)) {
                                                     $data = fread($pp,4096);
                                                     fwrite($fp,$data);
                                             }
                                             pclose($pp);
                                     }
                             }
                             
                             fwrite($fp,"--" . $mime_boundary . "--\n");
                     }
                     //No need for a MIME message, so it's an RFC822 message
                     else {
                             fwrite($fp,"\n");
                             fwrite($fp,$this->body);
                     }
                     
                     
                     pclose($fp);
             }
     }
     ?>
    ________________
    Jacques
    jacques@gw-designs.co.za
    http://coding.biz.tm
    Come join and lets make it a place to learn all the noobies how to code
    __________________

    NEVER FORGET TO CLICK THE TANX BUTTON IF U LIKE WHAT IM SHARING OR HELPING WITH
Working...
X