PX : code

Enhancements to R.Chambers' Email Library by Jonathan Barlow
Download this code


<?php
/*******************************************************************************
        Name:           Email
        Description:    This class is used for sending emails.  
                        These emails can be
                        Plain Text, HTML, or Both. Other uses include file 
                        Attachments and email Templates(from a file).
        Testing:
                test_email.php3:

                     $mail = new Email;
                $mail->setTo("myEmail@yo.com");
                $mail->setFrom("yourEmail@oy.com");
                $mail->setSubject("Your confidential test results");
                     $mail->setText("Dear You,\n\nYour tests were negative.\n\nLove,\nDoctor Smith");
                     $mail->setAttachments("/user/lib/xray.jpg");
                $mail->send();

                                                
        Changelog:
        Date            Name                    Description
        ----------- -----------         ------------------------------------------------
1.0     10/21/1999      R.Chambers              created
        
1.1     10/17/2000       Jonathan Barlow            modified to allow sending
                                                                attachments with text only
                                                                jon@barlownet.com
                                                                http://www.barlownet.com/
                                                                http://www.barlowfarms.com/
                                                                
                                                                Also enhanced the sample testing
                                                                use above so that it would be
                                                                clearer how to use it.
                                                                            
*******************************************************************************/
/*******************************************************************************
        Issues:
                [] no error reporting
                [] can only send HTML with TEXT
                [x] can only send attachements with HTML and TEXT - fixed by jb.
*******************************************************************************/
/*******************************************************************************
        Function Listing:
                setTo($inAddress)
                setCC($inAddress)
                setBCC($inAddress)
                setFrom($inAddress)
                setSubject($inSubject)
                setText($inText)
                setHTML($inHTML)
                setAttachments($inAttachments)
                checkEmail($inAddress)
                loadTemplate($inFileLocation,$inHash,$inFormat)
                getRandomBoundary($offset)
                getContentType()
                formatTextHeader()
                formatHTMLHeader()
                formatAttachmentHeader($inFileLocation)
                send()
*******************************************************************************/

class Email
{
        
//---Global Variables
        
var $mailTo                             "";                                           // array of To addresses
        
var $mailCC                             "";                                           // copied recipients
        
var $mailBCC                    "";                                           // hidden recipients
        
var $mailFrom                   "";                                           // from address
        
var $mailSubject                "";                                           // email subject
        
var $mailText                   "";                                           // plain text message
        
var $mailHTML                   "";                                           // html message
        
var $mailAttachments    "";                                           // array of attachments

/*******************************************************************************
        Function:               setTo($inAddress)
        Description:    sets the email To address
        Arguments:              $inAddress as string
                                        separate multiple values with comma
        Returns:                true if set
*******************************************************************************/
        
function setTo($inAddress){
                
//--split addresses at commas
                
$addressArray explode(",",$inAddress);
                
//--loop through each address and exit on error
                
for($i=0;$i<count($addressArray);$i++){
                        if(
$this->checkEmail($addressArray[$i])==false) return false;
                }
                
//--all values are OK so implode array into string
                
$this->mailTo implode($addressArray,",");
                return 
true;
        }
/*******************************************************************************
        Function:               setCC($inAddress)
        Description:    sets the email cc address
        Arguments:              $inAddress as string
                                        separate multiple values with comma
        Returns:                true if set
*******************************************************************************/
        
function setCC($inAddress){
                
//--split addresses at commas
                
$addressArray explode(",",$inAddress);
                
//--loop through each address and exit on error
                
for($i=0;$i<count($addressArray);$i++){
                        if(
$this->checkEmail($addressArray[$i])==false) return false;
                }
                
//--all values are OK so implode array into string
                
$this->mailCC implode($addressArray,",");
                return 
true;
        }
/*******************************************************************************
        Function:               setBCC($inAddress)
        Description:    sets the email bcc address
        Arguments:              $inAddress as string
                                        separate multiple values with comma
        Returns:                true if set
*******************************************************************************/
        
function setBCC($inAddress){
                
//--split addresses at commas
                
$addressArray explode(",",$inAddress);
                
//--loop through each address and exit on error
                
for($i=0;$i<count($addressArray);$i++){
                        if(
$this->checkEmail($addressArray[$i])==false) return false;
                }
                
//--all values are OK so implode array into string
                
$this->mailBCC implode($addressArray,",");
                return 
true;
        }
/*******************************************************************************
        Function:               setFrom($inAddress)
        Description:    sets the email FROM address
        Arguments:              $inAddress as string (takes single email address)
        Returns:                true if set
*******************************************************************************/
        
function setFrom($inAddress){
                if(
$this->checkEmail($inAddress)){
                        
$this->mailFrom $inAddress;
                        return 
true;
                }
                return 
false;
        }
/*******************************************************************************
        Function:               setSubject($inSubject)
        Description:    sets the email subject
        Arguments:              $inSubject as string
        Returns:                true if set
*******************************************************************************/
        
function setSubject($inSubject){
                if(
strlen(trim($inSubject)) > 0){
                        
$this->mailSubject ereg_replace("\n","",$inSubject);
                        return 
true;
                }
                return 
false;
        }
/*******************************************************************************
        Function:               setText($inText)
        Description:    sets the email text
        Arguments:              $inText as string
        Returns:                true if set
*******************************************************************************/
        
function setText($inText){
                if(
strlen(trim($inText)) > 0){
                        
$this->mailText $inText;
                        return 
true;
                }
                return 
false;
        }
/*******************************************************************************
        Function:               setHTML($inHTML)
        Description:    sets the email HMTL
        Arguments:              $inHTML as string
        Returns:                true if set
*******************************************************************************/
        
function setHTML($inHTML){
                if(
strlen(trim($inHTML)) > 0){
                        
$this->mailHTML $inHTML;
                        return 
true;
                }
                return 
false;
        }
/*******************************************************************************
        Function:               setAttachments($inAttachments)
        Description:    stores the Attachment string
        Arguments:              $inAttachments as string with directory included
                                        separate multiple values with comma
        Returns:                true if stored
*******************************************************************************/
        
function setAttachments($inAttachments){
                if(
strlen(trim($inAttachments)) > 0){
                        
$this->mailAttachments $inAttachments;
                        return 
true;
                }               
                return 
false;
        }
/*******************************************************************************
        Function:               checkEmail($inAddress)
        Description:    checks for valid email
        Arguments:              $inAddress as string
        Returns:                true if valid
*******************************************************************************/
        
function checkEmail($inAddress){
                return (
ereg"^[^@ ]+@([a-zA-Z0-9\-]+\.)+([a-zA-Z0-9\-]{2}|net|com|gov|mil|org|edu|int)\$",$inAddress));
        }
/*******************************************************************************
        Function:               loadTemplate($inFileLocation,$inHash,$inFormat)
        Description:    reads in a template file and replaces hash values
        Arguments:              $inFileLocation as string with relative directory
                                        $inHash as Hash with populated values
                                        $inFormat as string either "text" or "html"
        Returns:                true if loaded
*******************************************************************************/
        
function loadTemplate($inFileLocation,$inHash,$inFormat){
                
/*
                template files have lines such as:
                        Dear ~!UserName~,
                        Your address is ~!UserAddress~
                */
                //--specify template delimeters
                
$templateDelim "~";
                
$templateNameStart "!";
                
//--set out string
                
$templateLineOut "";
                
//--open template file
                
if($templateFile fopen($inFileLocation,"r")){
                        
//--loop through file, line by line
                        
while(!feof($templateFile)){
                                
//--get 1000 chars or (line break internal to fgets)
                                
$templateLine fgets($templateFile,1000);
                                
//--split line into array of hashNames and regular sentences
                                
$templateLineArray explode($templateDelim,$templateLine);
                                
//--loop through array 
                                
for( $i=0$i<count($templateLineArray);$i++){
                                        
//--look for $templateNameStart at position 0
                                        
if(strcspn($templateLineArray[$i],$templateNameStart)==0){
                                                
//--get hashName after $templateNameStart
                                                
$hashName substr($templateLineArray[$i],1);
                                                
//--replace hashName with acual value in $inHash
                                                //--(string) casts all values as "strings"
                                                
$templateLineArray[$i] = ereg_replace($hashName,(string)$inHash[$hashName],$hashName);
                                        }
                                }
                                
//--output array as string and add to out string
                                
$templateLineOut .= implode($templateLineArray,"");             
                        }
                        
//--close file          
                        
fclose($templateFile);
                        
//--set Mail body to proper format
                        
if( strtoupper($inFormat)=="TEXT" ) return($this->setText($templateLineOut));
                        else if( 
strtoupper($inFormat)=="HTML" ) return($this->setHTML($templateLineOut));
                }
                return 
false;
        }
/*******************************************************************************
        Function:               getRandomBoundary($offset)
        Description:    returns a random boundary
        Arguments:              $offset as integer - used for multiple calls
        Returns:                string
*******************************************************************************/
        
function getRandomBoundary($offset 0){
                
//--seed random number generator
                
srand(time()+$offset);
                
//--return md5 32 bits plus 4 dashes to make 38 chars
                
return ("----".(md5(rand())));
        }
/*******************************************************************************
        Function:               getContentType($inFileName)
        Description:    returns content type for the file type
        Arguments:              $inFileName as file name string (can include path)
        Returns:                string
*******************************************************************************/
        
function getContentType($inFileName){
                
//--strip path
                
$inFileName basename($inFileName);
                
//--check for no extension
        
if(strrchr($inFileName,".") == false){
                        return 
"application/octet-stream";
                }
                
//--get extension and check cases
        
$extension strrchr($inFileName,".");
        
        switch(
$extension){
                        case 
".gif":    return "image/gif";
                        case 
".gz":             return "application/x-gzip";
            case 
".htm":        return "text/html";
            case 
".html":       return "text/html";
            case 
".jpg":        return "image/jpeg";
            case 
".tar":        return "application/x-tar";
                        case 
".txt":    return "text/plain";
            case 
".zip":    return "application/zip";
            default:            return 
"application/octet-stream";
        }
                return 
"application/octet-stream";
        }
/*******************************************************************************
        Function:               formatTextHeader
        Description:    returns a formated header for text
        Arguments:              none
        Returns:                string
*******************************************************************************/
        
function formatTextHeader(){
                
$outTextHeader "";
                
$outTextHeader .= "Content-Type: text/plain; charset=us-ascii\n";
                
$outTextHeader .= "Content-Transfer-Encoding: 7bit\n\n";
                
$outTextHeader .= $this->mailText."\n";
                return 
$outTextHeader;
        }
/*******************************************************************************
        Function:               formatHTMLHeader
        Description:    returns a formated header for HTML
        Arguments:              none
        Returns:                string
*******************************************************************************/
        
function formatHTMLHeader(){
                
$outHTMLHeader "";
                
$outHTMLHeader .= "Content-Type: text/html; charset=us-ascii\n";
                
$outHTMLHeader .= "Content-Transfer-Encoding: 7bit\n\n";
                
$outHTMLHeader .= $this->mailHTML."\n";
                return 
$outHTMLHeader;
        }
/*******************************************************************************
        Function:               formatAttachmentHeader($inFileLocation)
        Description:    returns a formated header for an attachment
        Arguments:              $inFileLocation as string with relative directory
        Returns:                string
*******************************************************************************/
        
function formatAttachmentHeader($inFileLocation){
                
$outAttachmentHeader "";
                
//--get content type based on file extension
                
$contentType $this->getContentType($inFileLocation);
                
//--if content type is TEXT the standard 7bit encoding
                
if(ereg("text",$contentType)){
                        
//--format header
                        
$outAttachmentHeader .= "Content-Type: ".$contentType.";\n";
                        
$outAttachmentHeader .= ' name="'.basename($inFileLocation).'"'."\n";
                        
$outAttachmentHeader .= "Content-Transfer-Encoding: 7bit\n";
                        
$outAttachmentHeader .= "Content-Disposition: attachment;\n";   //--other: inline
                        
$outAttachmentHeader .= ' filename="'.basename($inFileLocation).'"'."\n\n";
                        
$textFile fopen($inFileLocation,"r");
                        
//--loop through file, line by line
                        
while(!feof($textFile)){
                                
//--get 1000 chars or (line break internal to fgets)
                                
$outAttachmentHeader .= fgets($textFile,1000);
                        }
                        
//--close file          
                        
fclose($textFile);
                        
$outAttachmentHeader .= "\n";
                }
                
//--NON-TEXT use 64-bit encoding
                
else{
                        
//--format header
                        
$outAttachmentHeader .= "Content-Type: ".$contentType.";\n";
                        
$outAttachmentHeader .= ' name="'.basename($inFileLocation).'"'."\n";
                        
$outAttachmentHeader .= "Content-Transfer-Encoding: base64\n";
                        
$outAttachmentHeader .= "Content-Disposition: attachment;\n";   //--other: inline
                        
$outAttachmentHeader .= ' filename="'.basename($inFileLocation).'"'."\n\n";
                        
//--call uuencode - output is returned to the return array
                        
exec("uuencode -m $inFileLocation nothing_out",$returnArray);
                        
//--add each line returned
                        
for ($i 1$i<(count($returnArray)); $i++){ 
                                
$outAttachmentHeader .= $returnArray[$i]."\n";
                        }
                }       
                return 
$outAttachmentHeader;
        }
/*******************************************************************************
        Function:               send()
        Description:    sends the email
        Arguments:              none
        Returns:                true if sent
*******************************************************************************/
        
function send(){
                
//--set  mail header to blank
                
$mailHeader "";
                
//--add CC
                
if($this->mailCC != ""$mailHeader .= "CC: ".$this->mailCC."\n";
                
//--add BCC
                
if($this->mailBCC != ""$mailHeader .= "BCC: ".$this->mailBCC."\n";
                
//--add From
                
if($this->mailFrom != ""$mailHeader .= "FROM: ".$this->mailFrom."\n";

                
//---------------------------MESSAGE TYPE-------------------------------
                //--TEXT ONLY
                
if($this->mailText != "" && $this->mailHTML == "" && $this->mailAttachments == ""){
                        return 
mail($this->mailTo,$this->mailSubject,$this->mailText,$mailHeader);
                }               
                
//--HTML AND TEXT
                
else if($this->mailText != "" && $this->mailHTML != "" && $this->mailAttachments == ""){
                        
//--get random boundary for content types
                        
$bodyBoundary $this->getRandomBoundary();
                        
//--format headers
                        
$textHeader $this->formatTextHeader();
                        
$htmlHeader $this->formatHTMLHeader();
                        
//--set MIME-Version
                        
$mailHeader .= "MIME-Version: 1.0\n";
                        
//--set up main content header with boundary
                        
$mailHeader .= "Content-Type: multipart/alternative;\n";
                        
$mailHeader .= ' boundary="'.$bodyBoundary.'"';
                        
$mailHeader .= "\n\n\n";
                        
//--add body and boundaries
                        
$mailHeader .= "--".$bodyBoundary."\n";
                        
$mailHeader .= $textHeader;
                        
$mailHeader .= "--".$bodyBoundary."\n";
                        
//--add html and ending boundary
                        
$mailHeader .= $htmlHeader;
                        
$mailHeader .= "\n--".$bodyBoundary."--";
                        
//--send message
                        
return mail($this->mailTo,$this->mailSubject,"",$mailHeader);
                }
                
//--HTML AND TEXT AND ATTACHMENTS
                
else if($this->mailText != "" && $this->mailHTML != "" && $this->mailAttachments != ""){
                        
                        
//--get random boundary for attachments
                        
$attachmentBoundary $this->getRandomBoundary();
                        
//--set main header for all parts and boundary
                        
$mailHeader .= "Content-Type: multipart/mixed;\n";
                        
$mailHeader .= ' boundary="'.$attachmentBoundary.'"'."\n\n";
                        
$mailHeader .= "This is a multi-part message in MIME format.\n";
                        
$mailHeader .= "--".$attachmentBoundary."\n";
                        
                        
//--TEXT AND HTML--
                        //--get random boundary for content types
                        
$bodyBoundary $this->getRandomBoundary(1);
                        
//--format headers
                        
$textHeader $this->formatTextHeader();
                        
$htmlHeader $this->formatHTMLHeader();
                        
//--set MIME-Version
                        
$mailHeader .= "MIME-Version: 1.0\n";
                        
//--set up main content header with boundary
                        
$mailHeader .= "Content-Type: multipart/alternative;\n";
                        
$mailHeader .= ' boundary="'.$bodyBoundary.'"';
                        
$mailHeader .= "\n\n\n";
                        
//--add body and boundaries
                        
$mailHeader .= "--".$bodyBoundary."\n";
                        
$mailHeader .= $textHeader;
                        
$mailHeader .= "--".$bodyBoundary."\n";
                        
//--add html and ending boundary
                        
$mailHeader .= $htmlHeader;
                        
$mailHeader .= "\n--".$bodyBoundary."--";
                        
//--send message
                        //--END TEXT AND HTML
                        
                        //--get array of attachment filenames
                        
$attachmentArray explode(",",$this->mailAttachments);
                        
//--loop through each attachment
                        
for($i=0;$i<count($attachmentArray);$i++){
                                
//--attachment separator
                                
$mailHeader .= "\n--".$attachmentBoundary."\n";
                                
//--get attachment info
                                
$mailHeader .= $this->formatAttachmentHeader($attachmentArray[$i]);
                        }
                        
$mailHeader .= "--".$attachmentBoundary."--";
                        return 
mail($this->mailTo,$this->mailSubject,"",$mailHeader);
                }
                    
//--TEXT AND ATTACHMENTS ONLY (NO HTML)
                
else if($this->mailText != "" && $this->mailHTML == "" && $this->mailAttachments != ""){
                        
                        
//--get random boundary for attachments
                        
$attachmentBoundary $this->getRandomBoundary();
                        
//--set main header for all parts and boundary
                        
$mailHeader .= "Content-Type: multipart/mixed;\n";
                        
$mailHeader .= ' boundary="'.$attachmentBoundary.'"'."\n\n";
                        
$mailHeader .= "This is a multi-part message in MIME format.\n";
                        
$mailHeader .= "--".$attachmentBoundary."\n";
                        
                        
//--TEXT AND HTML--
                        //--get random boundary for content types
                        
$bodyBoundary $this->getRandomBoundary(1);
                        
//--format headers
                        
$textHeader $this->formatTextHeader();
                        
$htmlHeader $this->formatHTMLHeader();
                        
//--set MIME-Version
                        
$mailHeader .= "MIME-Version: 1.0\n";
                        
//--set up main content header with boundary
                        
$mailHeader .= "Content-Type: multipart/alternative;\n";
                        
$mailHeader .= ' boundary="'.$bodyBoundary.'"';
                        
$mailHeader .= "\n\n\n";
                        
//--add body and boundaries
                        
$mailHeader .= "--".$bodyBoundary."\n";
                        
$mailHeader .= $textHeader;
                        
$mailHeader .= "\n--".$bodyBoundary."--";
                        
//--send message
                        //--END TEXT AND HTML
                        
                        //--get array of attachment filenames
                        
$attachmentArray explode(",",$this->mailAttachments);
                        
//--loop through each attachment
                        
for($i=0;$i<count($attachmentArray);$i++){
                                
//--attachment separator
                                
$mailHeader .= "\n--".$attachmentBoundary."\n";
                                
//--get attachment info
                                
$mailHeader .= $this->formatAttachmentHeader($attachmentArray[$i]);
                        }
                        
$mailHeader .= "--".$attachmentBoundary."--";
                        return 
mail($this->mailTo,$this->mailSubject,"",$mailHeader);
                }
                return 
false;
        }
}
?>

Comments or questions?
PX is running PHP 5.2.17
Thanks to Miranda Productions for hosting and bandwidth.
Use of any code from PX is at your own risk.