Classe E-Mail

<?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->setTo("myEmail@yo.com");
        $mail->send();

                        
    Changelog:
    Date        Name            Description
    ----------- -----------     ------------------------------------------------
    10/21/1999    R.Chambers        created
*******************************************************************************/
/*******************************************************************************
    Issues:
        no error reporting
        can only send HTML with TEXT
        can only send attachements with HTML and TEXT
*******************************************************************************/
/*******************************************************************************
    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);
        }
        return 
false;
    }
}
?>