CoderZone.org

Category: >> PHP Code >> Email w/ attachments class Bookmark and Share

<< lastnext >>

Snippet Name: Email w/ attachments class

Description: Class for sending mail with MIME attachments in multipart format using
external sendmail, mimencode and zip.

Also see:
» Transfer or migrate messages betwe...
» Easy way to break apart an email a...
» Send iCal Email Meeting Requests u...
» Email attachments with PHP mail()
» Fake email addresses

Comment: (none)

Author: CoderZone
Language: PHP
Highlight Mode: PHP
Last Modified: March 16th, 2009

<?php
 
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,"\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); 
    } 
} 
?>
 
 
There haven't been any comments added for this snippet yet. You may add one if you like.  Add a comment 
© coderzone.org | users online: 7