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]