<?php 
class clsEmailMessage extends clsParsedItem
{
    var $Event = "";
    var $Item;
    var $headers = array();
    var $subject = "";
    var $body = "";
    var $TemplateParsed = FALSE;
    var $recipient = NULL;
    var $fromuser = NULL;

    function clsEmailMessage($MessageId=NULL,$Item=NULL)
    {
        $this->clsParsedItem();
        $this->tablename = GetTablePrefix()."EmailMessage";
        $this->Item = $Item;
        $this->BasePermission = "EMAIL";
        $this->id_field = "EmailMessageId";
        $this->TagPrefix = "email";
        $this->NoResourceId=1;
        if($MessageId)
            $this->LoadFromDatabase($MessageId);
    }
        
    function LoadEvent($event,$language=NULL)
    {
        global $objConfig, $objLanguages;

        if(!strlen($language))
            $language = $objLanguages->GetPrimary();
        $sql = "SELECT * FROM ".$this->tablename." WHERE EventId = $event AND LanguageId=$language";
        $rs = $this->adodbConnection->Execute($sql);    
        if($rs && !$rs->EOF)
        {
            $data = $rs->fields;
            $this->SetFromArray($data);
            $this->Clean();
            return TRUE;
        }
        else
            return FALSE;
    }
    function LoadFromDatabase($MessageId)
    {
		global $Errors;
             
        $sql = sprintf("SELECT * FROM ".$this->tablename." WHERE ".$this->IdField()." = '%s'",$MessageId);
        $result = $this->adodbConnection->Execute($sql);
        if ($result === FALSE)
        {
            $Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"",get_class($this),"LoadFromDatabase");
            return FALSE;
        }
        $data = $result->fields;
        $this->SetFromArray($data);
        return TRUE;
    }

    function EditTemplate()
    {
    }

    /* read the template, split into peices */
    function ReadTemplate()
    {
      if(!$this->TemplateParsed)
      {
          $this->headers = array();
          $lines = explode("\n",$this->Get("Template"));
          $header_end = FALSE;
          $i = 0;
          while(!$header_end && $i<count($lines))
          {
              $h = $lines[$i];
              if(strlen(trim($h))==0 || ($h=="."))
              {              
                  $header_end = TRUE;
              }
              else
              {
                  $parts = explode(":",$h,2);
                  
                  if(strtolower($parts[0])=="subject")
                  {                  
                      $this->subject = $h;
                  }
                  else
                    $this->headers[] = $h;
              }                  
              $i++;
          }
          while($i<count($lines))
          {
              $this->body .= $lines[$i++];
          }
           $this->TemplateParsed=TRUE;
      }
    }

    function ParseSection($text, $parser=null)
    {
        global $objUsers, $objTemplate;

        $res = $this->ParseTemplateText($text);
        
        /* parse email class tags */
        if(!is_object($this->fromuser))
        {
          $this->fromuser = $objUsers->GetItem($this->Get("FromUserId"));
          $this->fromuser->TagPrefix = "fromuser";
        }

        /* parse from user object */
        if(is_object($this->fromuser))
        {
          $res = $this->fromuser->ParseTemplateText($res);
        }

        /* parse recipient user object */
        if(is_object($this->recipient))
        {            
            $res = $this->recipient->ParseTemplateText($res);
        }

        //print_pre($this->Item);
        if(is_object($this->Item))
        {   
            $res = $this->Item->ParseTemplateText($res);
        }
        else
        {
        	
        	if(!is_object($objTemplate))
        	  $objTemplate = new clsTemplateList(" ");
        	$res = $objTemplate->ParseTemplateText($res);  
        }

        return $res;
    }

    function SendToGroup($GroupId)
    {
        global $objUsers;

        $users = $objUsers->Query_GroupPortalUser("GroupId=$GroupId");
        if(is_array($users))
        {
            foreach($users as $u)
            {
                $this->SendToUser($u->Get("PortalUserId"));
            }
        }
    }

    function SendToAddress($EmailAddress,$name="")
    {
        global $objUsers, $objEmailQueue,$objConfig;

        $conn = GetADODBConnection();
        //$this->recipient = $objUsers->GetUser($UserId);
        //$this->recipient->TagPrefix="touser";
        if(strlen($EmailAddress))
        {        
          $to_addr = $EmailAddress;
          $this->ReadTemplate();
        
          $subject = $this->ParseSection($this->subject);
          $body = $this->ParseSection($this->body);

          if(is_object($this->fromuser))
          {
            $FromAddr = $this->fromuser->Get("Email");
            $FromName = trim($this->fromuser->Get("FirstName")." ".$this->fromuser->Get("LastName"));
          }
          if(!strlen($FromAddr))
          {          
              $FromName = $objConfig->Get("Site_Name");
              $FromAddr = $objConfig->Get("Smtp_AdminMailFrom"); 
          }          
          $charset = "ascii-us";
          if($this->Get("MessageType")=="html")
          {
              $objEmailQueue->SendMail($FromAddr,$FromName,$to_addr,$To,$subject,"",$body,$charset,NULL,$this->headers);
          }
          else
          {
            	$body = nl2br($body);
            	$body = str_replace("<br />","\n",$body);
                $objEmailQueue->SendMail($FromAddr,$FromName,$to_addr,$To,$subject,$body,"",$charset,NULL,$this->headers);
          }
          
          $time = time();
          
          $sql = "INSERT INTO ".GetTablePrefix()."EmailLog VALUES ('', '$FromName', '$To', '$subject', $time, '')";
          $conn->Execute($sql);          
          
          return TRUE;
        }
        return FALSE;
    }


    function SendToUser($UserId)
    {
        global $objUsers, $objEmailQueue, $objConfig;

        $conn = GetADODBConnection();
        //echo "Handling Event ".$this->Get("Event")." for user $UserId <br>\n";
        $this->recipient = new clsPortalUser($UserId); // $objUsers->GetItem($UserId);
        //echo "<PRE>";print_r($this->recipient); echo "</PRE>";
        $this->recipient->TagPrefix="touser";
        if($this->recipient->Get("PortalUserId")==$UserId)
        {        
          $to_addr = $this->recipient->Get("Email");
          $To = trim($this->recipient->Get("FirstName")." ".$this->recipient->Get("LastName"));

          $this->ReadTemplate();
          
          $subject = $this->ParseSection($this->subject, $this->recipient);
          $body = $this->ParseSection($this->body);

          if(!is_object($this->fromuser))
          {
              $this->fromuser = $objUsers->GetItem($this->Get("FromUserId"));
          }
          if(is_object($this->fromuser))
          {
            $FromAddr = $this->fromuser->Get("Email");
            $FromName = trim($this->fromuser->Get("FirstName")." ".$this->fromuser->Get("LastName"));
          
            $charset = "ascii-us";
          }
          
          if(!strlen($FromAddr))
          {          
            $FromName = $objConfig->Get("Site_Name");
            $FromAddr = $objConfig->Get("Smtp_AdminMailFrom"); 
          }
          
          
            if($this->Get("MessageType")=="html")
            {
                $objEmailQueue->SendMail($FromAddr,$FromName,$to_addr,$To,$subject,"",$body,$charset,NULL,$this->headers);
            }
            else
            {
            	$body =  nl2br($body);
            	$body = str_replace("<br />","\n",$body);
                $objEmailQueue->SendMail($FromAddr,$FromName,$to_addr,$To,$subject,$body,"",$charset,NULL,$this->headers);
            }
            
            $time = time();
            
	        $sql = "INSERT INTO ".GetTablePrefix()."EmailLog VALUES ('', '$FromName', '$To ($to_addr)', '$subject', $time, '')";
	        $conn->Execute($sql);                          
            
            return TRUE;
        }
        return FALSE;
    }

    function SendAdmin()
    {
        global $objUsers, $objConfig, $objEmailQueue;

        $this->recipient = $objUsers->GetUser($this->Get("FromUserId"));
        $this->recipient->TagPrefix="touser";
        if($this->recipient->Get("PortalUserId")==$this->Get("FromUserId"))
        {  
            $to_addr = $this->recipient->Get("Email");
            $To = trim($this->recipient->Get("FirstName")." ".$this->recipient->Get("LastName"));
            $this->ReadTemplate();
        
            $subject = $this->ParseSection($this->subject);            
            $body = $this->ParseSection($this->body);                       
            $FromName = "System Event";
            $FromAddr = $objConfig->Get("Smtp_AdminMailFrom"); 
            if(strlen($FromAddr))
            {            
              $charset = "ascii-us";
              if($this->Get("MessageType")=="html")
              {
                $objEmailQueue->SendMail($FromAddr,$FromName,$to_addr,$To,$subject,"",$body,$charset,NULL,$this->headers);
              }
              else
              {
              	$body=nl2br($body); 
              	$body = str_replace("<br />","\n",$body);
                $objEmailQueue->SendMail($FromAddr,$FromName,$to_addr,$To,$subject,$body,"",$charset,NULL,$this->headers);
              }
              return TRUE;
            }
        }
        return FALSE;
    }
    
    function ParseTemplateText($text)
    {
      $html = $text;
      $search = "<inp:".$this->TagPrefix;
      $next_tag = strpos($html,"<inp:");
      //$next_tag = strpos($html,$search);
      

      while($next_tag)
      { 
      	  $closer = strpos(strtolower($html),">",$next_tag);
          $end_tag = strpos($html,"/>",$next_tag);
          if($end_tag < $closer || $closer == 0)
          {
            $tagtext = substr($html,$next_tag,($end_tag - $next_tag)+2);
            $pre = substr($html,0,$next_tag);
            $post = substr($html,$end_tag+2);
            $inner = $this->ParseElement($tagtext);
            $html = $pre.$inner.$post;
          }
          else
          {

          	$OldTagStyle = "</inp>";
          	
          	## Try to find end of TagName
          	$TagNameEnd = strpos($html, " ", $next_tag);
          	
          	## Support Old version
//          	$closer = strpos(strtolower($html),"</inp>",$next_tag);          
          	if ($TagNameEnd)
          	{   			
          		$Tag = strtolower(substr($html, $next_tag, $TagNameEnd-$next_tag));
          		$TagName = explode(":", $Tag);          		
          		if (strlen($TagName[1]))
          			$CloserTag = "</inp:".$TagName[1].">";
          	}          	
          	else
          	{
          		$CloserTag = $OldTagStyle;
          	}          	
            
    	  	$closer = strpos(strtolower($html), $CloserTag, $next_tag);
    	  	
    	  	## Try to find old tag closer
    	  	if (!$closer && ($CloserTag != $OldTagStyle))
    	  	{
				$CloserTag = $OldTagStyle;
    	  		$closer = strpos(strtolower($html), $CloserTag, $next_tag);	
    	  	}
    	  		
            $end_tag = strpos($html,">",$next_tag);
            $tagtext = substr($html,$next_tag,($end_tag - $next_tag)+1);
            $pre = substr($html,0,$next_tag);
            $inner = substr($html,$end_tag+1,$closer-($end_tag+1));
            $post = substr($html,$end_tag+1+strlen($inner) + strlen($CloserTag));
            //echo "PRE:". htmlentities($pre,ENT_NOQUOTES);
            //echo "INNER:". htmlentities($inner,ENT_NOQUOTES);
            //echo "POST:". htmlentities($post,ENT_NOQUOTES);

            $parsed = $this->ParseElement($tagtext);
            if(strlen($parsed))
            {
                $html = $pre.$this->ParseTemplateText($inner).$post;
            }
            else
                $html = $pre.$post;
          }
          $next_tag = strpos($html,$search);
      }
      return $html;
    } 
    
    function ParseElement($raw, $inner_html ="")
    {
        $tag = new clsHtmlTag($raw);
        $tag->inner_html = $inner_html;

        if($tag->parsed)
        { 
          if($tag->name=="include" || $tag->name=="perm_include" || $tag->name=="lang_include")
          {
              $output = $this->Parser->IncludeTemplate($tag);
          }
          else
          { 
            if (is_object($this->Item)) {
          		$output = $this->Item->ParseObject($tag); 
            }
            else {
            	$output = $this->ParseObject($tag); 
            }
			//echo $output."<br>";
            if(substr($output,0,9)=="Undefined")
            { 
               $output = $tag->Execute();
  //             if(substr($output,0,8)="{Unknown")
  //                 $output = $raw;
            }            return $output;
          }
        }
        else
            return "";
    }
}

class clsEmailMessageList extends clsItemCollection 
{
    function clsEmailMessageList()
    {
        $this->clsItemCollection();
        $this->classname = "clsEmailMessage";
        $this->SourceTable = GetTablePrefix()."EmailMessage";
        $this->PerPageVar = "Perpage_EmailEvents";
        $this->AdminSearchFields = array("Template","Description", "Module","Event"); 
    }

    function LoadLanguage($LangId=NULL)
    {
        global $objLanguages;

        if(!$LangId)
            $LangId = $objLanguages->GetPrimary();

        $sql = "SELECT * FROM ".$this->SourceTable." WHERE LanguageId=$LangId";
        $this->Clear();
        return $this->Query_Item($sql);
    }

    function &GetMessage($EventId,$LangId,$LoadFromDB=TRUE)
    {
      $found=FALSE;

      if(is_array($this->Items))
      {
        for($x=0;$x<count($this->Items);$x++)
        {
          $i =& $this->GetItemRefByIndex($x);
          if(is_object($i))
          {
            if($i->Get("EventId")==$EventId && $i->Get("LanguageId")==$LangId)
            {                
               $found=TRUE;
               break;
            }
          }
        }
      }
      if(!$found)
      {
         if($LoadFromDB)
         {            
           $n = NULL;
           $n = new $this->classname();
           $n->tablename = $this->SourceTable;
           if($n->LoadEvent($EventId,$LangId))
           {
             array_push($this->Items, $n);
             $i =& $this->Items[count($this->Items)-1];
           }
           else
               $i = FALSE;
         }
         else
           $i = FALSE;
      }
      return $i;      
    }

    function CreateEmptyEditTable($IdList)
    {
        global $objSession;

        $edit_table = $objSession->GetEditTable($this->SourceTable);
        @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table");
        $query = "SELECT * FROM ".$this->SourceTable." WHERE $idfield = -1";
        $insert = "CREATE TABLE ".$edit_table." ".$query;
        if($objSession->HasSystemPermission("DEBUG.LIST"))
            echo htmlentities($insert,ENT_NOQUOTES)."<br>\n";
        $this->adodbConnection->Execute($insert);
        $this->LoadLanguage();                     
        $idvalue = -1;
        for($i=0;$i<$this->NumItems();$i++)
        {
            $e =& $this->Items[$i];
            $e->SourceTable = $edit_table;
            if(is_array($IdList))
            {
              foreach($IdList as $id)
              {                        
                  $e->UnsetIdField();
                  $e->Set("EmailMessageId",$idvalue--);
                  $e->Set("LanguageId",$id);                  
                  $e->Set("Description",admin_language("la_desc_emailevent_".$e->Get("Event"),$id));           
                  $e->Create();                  
              }
            }
            else
            {
                $e->UnsetIdField();
                $e->Set("EmailMessageId",$idvalue--);
                $e->Set("LanguageId",$IdList);
                $e->Set("Description",admin_language("la_desc_emailevent_".$e->Get("Event"),$LangId));           
                $e->Create();
            }
        }
        $this->Clear();
    }

    function CopyFromEditTable()
    {
        global $objSession;

        $idfield = "EmailMessageId";
        $edit_table = $objSession->GetEditTable($this->SourceTable);
        $sql = "SELECT * FROM $edit_table";      
        $rs = $this->adodbConnection->Execute($sql);
        while($rs && !$rs->EOF)
        {
            $data = $rs->fields;
            $c = new $this->classname;
            $c->SetFromArray($data);
            //$c->idfield = $idfield;
            if($c->Get($idfield)<1)
            {
               $old_id = $c->Get($idfield);
               $c->Dirty();
               $c->UnsetIdField();               
               $c->Create();
            }
            else
            {
               $c->Dirty();
               $c->Update();
            }
            $rs->MoveNext();
        }
        @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table");
    }

    function PurgeEditTable()
    {
      global $objSession;

      $edit_table = $objSession->GetEditTable($this->SourceTable);
      @$this->adodbConnection->Execute("DROP TABLE IF EXISTS $edit_table");
    }
    
    function &GetEmailEventObject($EventName,$Type=0,$LangId=NULL)
    {
        global $objLanguages;

        if(!$LangId)
            $LangId = $objLanguages->GetPrimary();
        $EmailTable = $this->SourceTable;
        $EventTable = GetTablePrefix()."Events";
        $sql = "SELECT * FROM $EventTable INNER JOIN $EmailTable ON ($EventTable.EventId = $EmailTable.EventId) ";
        $sql .="WHERE Event='$EventName' AND LanguageId=$LangId AND Type=$Type";
        $result = $this->adodbConnection->Execute($sql);
        
        if ($result === FALSE)
        {
            //$Errors->AddError("error.DatabaseError",NULL,$this->adodbConnection->ErrorMsg(),"","clsEvent","GetEmailEventObject");
            return FALSE;
        }
        $data = $result->fields;
        $e = new clsEmailMessage();
        $e->SetFromArray($data);
        $e->Clean();
        return $e;
    }

    function ReadImportTable($TableName,$Overwite=FALSE, $MaxInserts=100,$Offset=0)
    {    	 
    	$eml = new clsEmailMessageList();    	   	    	    	
        $this->Clear();
        $Inserts = 0;
        $sql = "SELECT * FROM $TableName LIMIT $Offset,$MaxInserts";        
        $this->Query_Item($sql);
        if($this->NumItems()>0)
        {
        	foreach($this->Items as $i)
        	{        		
        		$e = $eml->GetMessage($i->Get("EventId"),$i->Get("LanguageId"));
        		if(is_object($e))
        		{
        			if($Overwrite)
        			{
        				$e->Set("MessageType",$i->Get("MessageType"));
        				$e->Set("Template",$i->Get("Template"));
        				$e->Update();
        			}
        		}
        		else
        		{
        			$i->Create();
        		}
        		$Inserts++;
        	}
        }
        $Offset = $Offset + $Inserts;
        return $Offset;
    }    
}

function EventEnabled($e)
{
    global $objConfig;

    $var = "Email_".$e."_Enabled";

    return ($objConfig->Get($var)=="1");
}

class clsEmailQueue  
{
    var $SourceTable;
    var $MessagesAtOnce;
    var $MessagesSent=0;
	var $LogLevel = 0;
	
    function clsEmailQueue($SourceTable=NULL,$MessagesAtOnce=NULL)
    {
        global $objConfig;

        if($SourceTable)
        {        
          $this->SourceTable=$SourceTable;
        }
        else
            $this->SourceTable = GetTablePrefix()."EmailQueue";
        if(!$MessagesAtOnce)
            $MessagesAtOnce = (int)$objConfig->Get("Email_MaxSend");
        if($MessagesAtOnce<1)
            $MessagesAtOnce=1;
        $this->MessagesAtOnce = $MessagesAtOnce;
        $this->LogLevel = (int)$objConfig->Get("Smtp_LogLevel");
    }
    
    function WriteToMailLog($text)
    {
      global $pathtoroot,$admin;
      //echo htmlentities($text)."<br>\n";
      if($this->LogLevel>0)
      {
      	 $Logfile = $pathtoroot.$admin."/email/log.txt";
      	 if(is_writable($Logfile))
      	 {
      	   $fp = fopen($Logfile,"a");
      	   if($fp)
      	   {
      	     fputs($fp,$text."\n");
      	     fclose($fp);	
      	   }
      	 }
      }	
    }
    
    function AllowSockets()
    {
		$minver = explode(".", "4.3.0");
  		$curver = explode(".", phpversion());
  		if (($curver[0] < $minver[0])
     		|| (($curver[0] == $minver[0])
        		&& ($curver[1] < $minver[1]))
    		|| (($curver[0] == $minver[0]) && ($curver[1] == $minver[1])
       			&& ($curver[2][0] < $minver[2][0])))
       		return false;
   		else
       		return true;
	}     	

    function DeliverMail($To,$From,$Subject,$Msg,$headers, $ForceSend=0)
    {
        global $MessagesSent,$objConfig;

        if(($this->MessagesSent >$this->MessagesAtOnce) && !$ForceSend)
        {
            $this->EnqueueMail($To,$From,$Subject,$Msg,$headers);
            return TRUE;
        }
        else
        {
            
            $this->MessagesSent++;
            
            $time = time();
            $conn = GetADODBConnection();
            
/*            $sql = "INSERT INTO ".GetTablePrefix()."EmailLog VALUES ('', '".htmlspecialchars($From)."', '".htmlspecialchars($To)."', '$Subject', $time, '')";
            $conn->Execute($sql);*/
            /* ensure headers are using \r\n instead of \n */
            //$headers = str_replace("\r\n","\n",$headers);
            //$headers = str_replace("\n","\r\n",$headers);
            
            $headers = "Date: ".date("r")."\n".$headers;
            $headers = "Return-Path: ".$objConfig->Get("Smtp_AdminMailFrom")."\n".$headers;
            //$Msg = str_replace("\r\n","\n",$Msg);
            //$Msg = str_replace("\n","\r\n",$Msg);
            
            //echo "<PRE>"; print_r(htmlentities($headers)); echo "</PRE>";
            //echo "<PRE>"; print_r(htmlentities($Msg)); echo "</PRE>";
            $ver = phpversion();
            if(substr($Subject,0,9)=="Subject: ")
              $Subject = substr($Subject,9); 
            if(!strlen($objConfig->Get("Smtp_Server")) || !$this->AllowSockets())
            {
                return mail($To,trim($Subject),$Msg, $headers);
            }
 
            $headers = "Subject: ".trim($Subject)."\r\n".$headers;
         
            $send_params['recipients']	= array($To);						// The recipients (can be multiple)
            $send_params['headers']		= explode("\r\n",$headers);
            $send_params['from']		= $From;							// This is used as in the MAIL FROM: cmd                                                                                                
            																// It should end up as the Return-Path: header
            $send_params['body']		= $Msg;								// The body of the email

            $params['host'] = $objConfig->Get("Smtp_Server");				// The smtp server host/ip
                      
            $params['port'] = 25;						// The smtp server port
            $params['helo'] = 'INPORTAL';			// What to use when sending the helo command. Typically, your domain/hostname
            if($objConfig->Get("Smtp_Authenticate"))  // Whether to use basic authentication or not
            {
            	$params['auth'] = TRUE;
            	$params['user'] = $objConfig->Get("Smtp_User");
            	$params['pass'] = $objConfig->get("Smtp_Pass");
            }
            else
            	$params['auth'] = FALSE;						
	    	$this->LogLevel=0;               
            $SmtpServer = new smtp($params);
            if($this->LogLevel>0)
            {
			  $SmtpServer->debug=1;
			  foreach($params as $key=>$value)
			  {
			  	$this->WriteToMailLog($key."=".$value);
			  }
            }
            else
            	$SmtpServer->debug = 0;
            $connected = $SmtpServer->connect();
            
            
            
            if($connected)
            {
              if($this->LogLevel>1)
              {
                $this->WriteToMailLog("Connected to ".$params['host']);	
              }
              $res = $SmtpServer->send($send_params);
            }
            $SmtpServer->disconnect();
            if($this->LogLevel>1)
            {
            	foreach($SmtpServer->buffer as $l)
            	{
            		$this->WriteToMailLog($l);
            	}
            }
            if($this->LogLevel>0)
            {
              if(count($SmtpServer->errors)>0)
              {
              	foreach($SmtpServer->errors as $e)
              	{
              		$this->WriteToMailLog($e);
              	}
              }
              else 
             	$this->WriteToMailLog("Message to $From Delivered Successfully");
            }
            unset($SmtpServer);
              return $res;
        }
    }

    function EnqueueMail($To,$From,$Subject,$Msg,$headers)
    {
        global $objSession;

        $ado = GetADODBConnection();
        $To = mysql_escape_string($To);
        $From = mysql_escape_string($From);
        $Msg = mysql_escape_string($Msg);        
        $headers = mysql_escape_string($headers);
        $Subject = mysql_escape_string($Subject);
        $sql = "INSERT INTO ".$this->SourceTable." (toaddr,fromaddr,subject,message,headers) VALUES ('$To','$From','$Subject','$Msg','$headers')";
        $ado->Execute($sql);
    }

    function SendMailQeue()
    {
        global $objConfig, $objSession, $TotalMessagesSent;

        $ado = GetADODBConnection();
        $MaxAllowed = $this->MessagesAtOnce;
        
        $del_sql = array();

        $NumToSend = $MaxAllowed - $this->MessagesSent;
        $sql = "SELECT * FROM ".$this->SourceTable." ORDER BY queued ASC LIMIT $NumToSend";
        $rs = $ado->Execute($sql);

        while($rs && !$rs->EOF)
        {
            $data = $rs->fields;
			$this->DeliverMail($data["toaddr"],$data["fromaddr"],$data["Subject"],$data["headers"],$data["message"],1);            
            
            $del_sql[] = "DELETE FROM ".$this->SourceTable." WHERE queued=".$data["queued"];
            $rs->MoveNext();
        }

        $numdel = count($del_sql);
        for($i=0;$i<$numdel;$i++)
        {
            $sql = $del_sql[$i];
            if(strlen($sql))
            $ado->Execute($sql);
            if($objSession->HasSystemPermission("DEBUG.ITEM"))
                echo htmlentities($sql,ENT_NOQUOTES)."<br>\n";
        }
    }
    
   function SendMail($From, $FromName, $ToAddr, $ToName, $Subject, $Text, $Html, $charset, 
                     $FileName="",$FileLoc="",$QueueOnly=0,$extra_headers = array())
   {
   		$HasFile = FALSE;
   		$HasFile = (strlen($FileName)>0);
   		$OB="----=_OuterBoundary_000";
		$boundary = "-----=".md5( uniqid (rand()));
		$f = "\"$FromName\" <".$From.">";		
		$headers = "From: $f\n";
		$headers .= "MIME-Version: 1.0\n";
        
		if($HasFile)
		{  			
		  //Messages start with text/html alternatives in OB
		   $headers.="Content-Type: multipart/mixed;\n\tboundary=\"".$OB."\"\n\n";
           $msg.="--".$OB."\n";
           $msg.="Content-Type: multipart/alternative; boundary=\"$boundary\"\n\n";		
		}
		else
			$headers .= "Content-Type: multipart/alternative; boundary=\"$boundary\"";
        if(is_array($extra_headers))
        {
            for($i=0;$i<count($extra_headers);$i++);
            {
                $headers .= $extra_headers[$i]."\n";
            }
        }	   	
    
    $msg .="This is a multi-part message in MIME format.\n\n";
    
		$msg .= "--" . $boundary . "\n";
		$msg .= "Content-Type: text/plain; charset=\"$charset\"\r\n";
		$msg .= "Content-Transfer-Encoding: 8bit\r\n";
		$msg .= stripslashes($Text);
		$msg .= "\r\n\r\n";
		if(strlen($Html)>0)
		{
		  $msg .= "--" . $boundary . "\n";
		  $msg .= "Content-Type: text/html; charset=\"iso-8859-1\"\n";
		  $msg .= "Content-Transfer-Encoding:	8bit\r\n\r\n";			
		  $msg .= stripslashes($Html);			
		  $msg .= "\r\n\r\n";		  
		}
		$msg .= "--" . $boundary . "--\n";
        if($HasFile)
        {           	   
           if(!strlen($FileLoc))
              $FileLoc = $FileName;
           $FileName = basename($FileName);
 		   $msg .= "\n--".$OB."\n";
           $msg.="Content-Type: application/octetstream;\n\tname=\"".$FileName."\"\r\n";
           $msg.="Content-Transfer-Encoding: base64\n";
           $msg.="Content-Disposition: attachment;\n\tfilename=\"".$FileName."\"\r\n\r\n";

           //file goes here
           $fd=fopen ($FileLoc, "r");
           if($fd)
           {
             $FileContent=fread($fd,filesize($FileLoc));
             fclose ($fd);
           }
           $FileContent=chunk_split(base64_encode($FileContent));
           $msg.=$FileContent;
		   $msg .= "--".$OB."\n";                  
        }	        
		                      
		if(strlen($ToName)>0)
		{
          $To = "\"$ToName\" <$ToAddr>";
		}
		else
		  $To = "<".$ToAddr.">";
		//$headers.="To: $To\r\n";  
        if($this->MessagesSent>$this->MessagesAtOnce || $QueueOnly==1)
        {
            $this->EnqueueMail($To,$f,$Subject,$msg,$headers);
        }
        else
        {
            $this->DeliverMail($To,$f,$Subject,$msg,$headers);
        }
   }

}
?>