ID: 11021
Updated by: hholzgra
Reported By: [EMAIL PROTECTED]
Old-Status: Open
Status: Duplicate
Bug Type: Mail related
Operating system: 
PHP Version: 4.0.5
Assigned To: hholzgra
Comments:

see #11165

Previous Comments:
---------------------------------------------------------------------------

[2001-05-22 12:21:37] [EMAIL PROTECTED]
I work with apache 1.3.19, with php 4.0.5 downloaded here

I can't send any linked files with mail() when they are over about 2 ko...


no error log


apache crash :
Ce programme va être arrété car il a effectué une opération non conforme (this program 
will be stopped because it made a non-conform error)
APACHE a causé une défaillance de page dans
 le module MSVCRT.DLL à 0167:78004c96.

APACHE a causé une défaillance de page dans
 le module PHP4TS.DLL à 0167:00bee5ea.

APACHE a causé une défaillance de page dans
 le module PHP4TS.DLL à 0167:00c1d86d.


the code :
*****************************************************
*****************************************************

class Email 
{ 
    //---Global Variables 
    var $mailTo                = "";                        // array of To addresses 
    var $mailFrom            = "";                        // from address 
    var $mailSubject        = "";                        // email subject 
    var $mailText            = "";                        // plain text message 
    var $mailAttachments    = "";                        // array of attachments 

/*#########################Fonction rajoutée , le constructeur###################*/
function EMail($mailTo, $mailFrom, $mailSubject, $mailText, $mailAttachments) {
        $this->mailTo = $mailTo;
        $this->mailFrom = $mailFrom;
        $this->mailSubject = $mailSubject;
        $this->mailText = $mailText;
        $this->mailAttachments = $mailAttachments;
}




/******************************************************************************* 
    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:        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:        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";
                        case ".pdf":    return "application/pdf";
                        case ".doc":    return "application/msword";
                        case ".ai":             return "application/postscript"; 
            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-asciin"; 
        $outTextHeader .= "Content-Transfer-Encoding: 7bitnn"; 
        $outTextHeader .= $this->mailText."n"; 
        return $outTextHeader; 
    } 
/******************************************************************************* 
    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: 7bitn"; 
            $outAttachmentHeader .= "Content-Disposition: attachment;n";    //--other: 
inline 
            $outAttachmentHeader .= ' filename="'.basename($inFileLocation).'"'."nn"; 
            $textFile = fopen($inFileLocation,"rb"); 
            //--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: base64n"; 
            $outAttachmentHeader .= "Content-Disposition: attachment;n";    //--other: 
inline 
            $outAttachmentHeader .= ' filename="'.basename($inFileLocation).'"'."nn"; 

                        $fd = fopen($inFileLocation, "rb");
                        $contents = fread($fd, filesize($inFileLocation));
                        $encoded = chunk_split(base64_encode($contents));
            //--close file         
            fclose($fd);
                        $outAttachmentHeader .= $encoded . "n";
        }
        return $outAttachmentHeader; 
    } 
/******************************************************************************* 
    Function:        send() 
    Description:    sends the email 
    Arguments:        none 
    Returns:        true if sent 
*******************************************************************************/ 
    function send(){ 
        //--set  mail header to blank 
        $mailHeader = ""; 
        //--add From 
        if($this->mailFrom != "") $mailHeader .= "FROM: ".$this->mailFrom."n"; 

        //---------------------------MESSAGE TYPE------------------------------- 
        //--TEXT ONLY 
        if($this->mailAttachments == ""){ 
            return mail($this->mailTo,$this->mailSubject,$this->mailText,$mailHeader); 

        }         
            //--TEXT AND ATTACHMENTS
                else { 
             
            //--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.'"'."nn"; 
            $mailHeader .= "This is a multi-part message in MIME format.n"; 
            $mailHeader .= "--".$attachmentBoundary."n"; 
             
            //--TEXT -- 
            //--get random boundary for content types 
            $bodyBoundary = $this->getRandomBoundary(1); 
            //--format headers 
            $textHeader = $this->formatTextHeader(); 
            //--set MIME-Version 
            $mailHeader .= "MIME-Version: 1.0n"; 
            //--set up main content header with boundary 
            $mailHeader .= "Content-Type: multipart/alternative;n"; 
            $mailHeader .= ' boundary="'.$bodyBoundary.'"'; 
            $mailHeader .= "nnn"; 
            //--add body and boundaries 
            $mailHeader .= "--".$bodyBoundary."n"; 
            $mailHeader .= $textHeader; 
            $mailHeader .= "--".$bodyBoundary."n"; 
            $mailHeader .= "n--".$bodyBoundary."--"; 
            //--send message 
            //--END TEXT 
             
            //--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; 
    } 
} 
$monmail = new EMail("[EMAIL PROTECTED]", "[EMAIL PROTECTED]", "Trying to link files", 
"Here is the body", "C:php4.gif");
$monmail->send();

*****************************************************
*****************************************************


---------------------------------------------------------------------------

The remainder of the comments for this report are too long.  To view the rest of the 
comments, please view the bug report online.


ATTENTION! Do NOT reply to this email!
To reply, use the web interface found at http://bugs.php.net/?id=11021&edit=2


-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to