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]