<?php
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
/*********************************************************************************
 * The contents of this file are subject to the SugarCRM Public License Version
 * 1.1.3 ("License"); You may not use this file except in compliance with the
 * License. You may obtain a copy of the License at http://www.sugarcrm.com/SPL
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * All copies of the Covered Code must include on each user interface screen:
 *    (i) the "Powered by SugarCRM" logo and
 *    (ii) the SugarCRM copyright notice
 * in the same form as they appear in the distribution.  See full license for
 * requirements.
 *
 * The Original Code is: SugarCRM Open Source
 * The Initial Developer of the Original Code is SugarCRM, Inc.
 * Portions created by SugarCRM are Copyright (C) 2004-2006 SugarCRM, Inc.;
 * All Rights Reserved.
 * Contributor(s): ______________________________________.
 ********************************************************************************/
require_once('data/SugarBean.php');

class EmailMan extends SugarBean{
	var $id;
	var $deleted;
	var $date_created;
	var $date_modified;
	var $module;
	var $module_id;
	var $marketing_id;
	var $campaign_id;
	var $user_id;
	var $list_id;
	var $invalid_email;
	var $from_name;
	var $from_email;
	var $in_queue;
	var $in_queue_date;
	var $template_id;
	var $send_date_time;
	var $table_name = "emailman";
	var $object_name = "EmailMan";
	var $module_dir = "EmailMan";
	var $send_attempts;
	var $related_id;
	var $related_type;
	var $test=false;
	var $notes_array = array();
	
	function toString(){
		return "EmailMan:\nid = $this->id ,user_id= $this->user_id module = $this->module , related_id = $this->related_id , related_type = $this->related_type ,list_id = $this->list_id, send_date_time= $this->send_date_time\n";
	}

    // This is used to retrieve related fields from form posts.
	var $additional_column_fields = array();

	function EmailMan() {
		parent::SugarBean();



		
	}

	var $new_schema = true;
	function create_list_query($order_by, $where, $show_deleted = 0){

		if ( ( $this->db->dbType == 'mysql' ) or ( $this->db->dbType == 'oci8' ) )
		{
			
		$query = "SELECT $this->table_name.* ,
					campaigns.name as campaign_name, 
					email_marketing.name as message_name,
					(CASE related_type 
						WHEN 'Contacts' THEN CONCAT(CONCAT(contacts.first_name, '&nbsp;' ), contacts.last_name) 
						WHEN 'Leads' THEN CONCAT(CONCAT(leads.first_name, '&nbsp;' ), leads.last_name) 
						WHEN 'Users' THEN CONCAT(CONCAT(users.first_name, ' ' ), users.last_name) 
						WHEN 'Prospects' THEN CONCAT(CONCAT(prospects.first_name, '&nbsp;' ), prospects.last_name)
					END) recipient_name,";
		}
	    if($this->db->dbType == 'mssql')
		{
				$query = "SELECT $this->table_name.* ,
					campaigns.name as campaign_name, 
					email_marketing.name as message_name,
					(CASE related_type 
						WHEN 'Contacts' THEN contacts.first_name + '&nbsp;' + contacts.last_name 
						WHEN 'Leads' THEN  leads.first_name + '&nbsp;' + leads.last_name 
						WHEN 'Users' THEN  users.first_name + ' ' + users.last_name 
						WHEN 'Prospects' THEN prospects.first_name + '&nbsp;' + prospects.last_name
					END) recipient_name,";
		}

					$query .= " (CASE related_type 
						WHEN 'Contacts' THEN contacts.email1 
						WHEN 'Leads' THEN leads.email1 
						WHEN 'Users' THEN users.email1 
						WHEN 'Prospects' THEN prospects.email1
					END) recipient_email

					FROM $this->table_name
					LEFT JOIN users ON users.id = $this->table_name.related_id and $this->table_name.related_type ='Users'
					LEFT JOIN contacts ON contacts.id = $this->table_name.related_id and $this->table_name.related_type ='Contacts'
					LEFT JOIN leads ON leads.id = $this->table_name.related_id and $this->table_name.related_type ='Leads'
					LEFT JOIN prospects ON prospects.id = $this->table_name.related_id and $this->table_name.related_type ='Prospects'
					LEFT JOIN prospect_lists ON prospect_lists.id = $this->table_name.list_id
					LEFT JOIN campaigns ON campaigns.id = $this->table_name.campaign_id 
					LEFT JOIN email_marketing ON email_marketing.id = $this->table_name.marketing_id ";

		$where_auto = " $this->table_name.deleted=0";

        if($where != "")
			$query .= "where $where AND ".$where_auto;
		else
			$query .= "where ".$where_auto;

		if($order_by != ""){
			$query .= " ORDER BY $order_by";
		}else
			$query .= " ORDER BY $this->table_name.send_date_time";
		return $query;
	}

    function get_list_view_data()
    {   global $locale;
        $temp_array = parent::get_list_view_array();
        
            $query="select first_name, last_name from ". strtolower($temp_array['RELATED_TYPE']) ." where id ='".$temp_array['RELATED_ID']."'";

        $result=$this->db->query($query);
        $row=$this->db->fetchByAssoc($result);
        
        if ($row) {
            $full_name = $locale->getLocaleFormattedName($row['first_name'], $row['last_name'], '');
            $temp_array['RECIPIENT_NAME']=$full_name;   
        }

        
        return $temp_array;
    }


	function set_as_sent($email_address,$success=true, $delete= true,$email_id=null, $email_type=null,$activity_type=null,$no_log=false){
					
		//no_log is true when this process encounters an emailaddress from the suppression list.
		if ($no_log) {
			$this->table_name = 'emailman';
			$query = 'DELETE FROM '. $this->table_name . " WHERE id = $this->id";
			$this->db->query($query);
		} else {
		
			global $timedate;
			
			$this->send_attempts++;
			if($delete || $this->send_attempts > 5){
	
				//create new campaign log record.
				require_once('modules/CampaignLog/CampaignLog.php');
				$campaign_log = new CampaignLog();
				$campaign_log->campaign_id=$this->campaign_id;
				$campaign_log->target_tracker_key=$this->target_tracker_key;
				$campaign_log->target_id= $this->related_id;
				$campaign_log->target_type=$this->related_type;
                $campaign_log->marketing_id=$this->marketing_id;

				if (!$this->test) {
					$campaign_log->more_information=$email_address;
				}
				if (!empty($activity_type)) {
					$campaign_log->activity_type=$activity_type;
				} else {
					$campaign_log->activity_type='send error';
				}
				$campaign_log->activity_date=$timedate->to_display_date_time(gmdate("Y-m-d H:i:s"));
				$campaign_log->list_id=$this->list_id;
				if ($success) {
					$campaign_log->related_id= $email_id;
					$campaign_log->related_type=$email_type;
                    $campaign_log->save();
				}

						
				if(!$success){
					$campaign_log = new CampaignLog();
					$campaign_log->campaign_id=$this->campaign_id;
					$campaign_log->target_tracker_key=$this->target_tracker_key;
					$campaign_log->target_id= $this->related_id;
					$campaign_log->target_type=$this->related_type;
					if (!$this->test) {
						$campaign_log->more_information=$email_address;
					}
					if (!empty($activity_type)) {
						$campaign_log->activity_type=$activity_type;
					} else {
						$campaign_log->activity_type='send error';
					}
					$campaign_log->activity_date=$timedate->to_display_date_time(gmdate("Y-m-d H:i:s"));
					$campaign_log->list_id=$this->list_id;
					$campaign_log->save();
				}
				$this->table_name = 'emailman';
				$query = 'DELETE FROM '. $this->table_name . " WHERE id = $this->id"; 
				$this->db->query($query);
			}else{
				//try to send the email again at a later date. currently this timeperiod is set to one day.
				$query = 'UPDATE ' . $this->table_name . " SET in_queue='1', send_attempts='$this->send_attempts', in_queue_date='". gmdate('Y-m-d H:i:s') ."' WHERE id = '$this->id'";
				$this->db->query($query);
			}
		}
	}


    /**
     * Function finds the reference email for the campaign. Since a campaign can have multiple email templates
     * the reference email has same id as the marketing id. 
     * this function will create an email if one does not exist. also the function will load these relationships leads, contacts
     * users and targets
     * 
     * @param varchar marketing_id message id
     * @param string $subject email subject
     * @param string $body_text Email Body Text
     * @param string $body_html Email Body HTML
     * @param string $campaign_name Campaign Name
     * @param string from_address Email address of the sender, usually email address of the configured inbox.
     * @param string sender_id If of the user sending the campaign.
     * @param array  macro_nv array of name value pair, one row for each replacable macro in email template text.
     * @return 
     */
    function create_ref_email($marketing_id,$subject,$body_text,$body_html,$campagin_name,$from_address,$sender_id,$notes,$macro_nv,$newmessage) {
       
       global $mod_Strings;
       $upd_ref_email=false;
       if ($newmessage or empty($this->ref_email->id)) {   
           $this->ref_email = new Email();
           $this->ref_email->retrieve($marketing_id);
           
           //the reference email should be updated when user swithces from test mode to regular mode,and, for every run in test mode, and is user
           //switches back to test mode.
           //this is to account for changes to email template. 
           $upd_ref_email=(!empty($this->ref_email->id) and $this->ref_email->parent_type=='test' and $this->ref_email->parent_id=='test'); 
          //following condition is for switching back to test mode.
           if (!$upd_ref_email) $upd_ref_email=($this->test and !empty($this->ref_email->id) and empty($this->ref_email->parent_type) and empty($this->ref_email->parent_id));
           if (empty($this->ref_email->id) or $upd_ref_email) {
                //create email record.
                $this->ref_email->id=$marketing_id;  
               
                if ($upd_ref_email==false) {
                    $this->ref_email->new_with_id=true;
                }
    



                $this->ref_email->to_addrs= '';
                $this->ref_email->to_addrs_ids = '';
                $this->ref_email->to_addrs_names = '';
                $this->ref_email->to_addrs_emails ='';
                $this->ref_email->type= 'campaign';
                $this->ref_email->deleted = '0';
                $this->ref_email->name = $campagin_name.': '.$subject ;
                $this->ref_email->description_html = $body_html;
                $this->ref_email->description = $body_text;
                $this->ref_email->from_addr = $from_address;
                $this->ref_email->assigned_user_id = $sender_id;
                if ($this->test) {
                    $this->ref_email->parent_type = 'test';
                    $this->ref_email->parent_id =  'test';
                } else {
                    $this->ref_email->parent_type = '';
                    $this->ref_email->parent_id =  '';                
                }
            
                $this->ref_email->date_start =date('Y-m-d');
                $this->ref_email->time_start =date('H:i:s');
                $this->ref_email->status='sent';
                $retId = $this->ref_email->save();
                
                if (count($notes) > 0 ) {
                    if (!class_exists('Note')) require_once('modules/Notes/Note.php');
                    if (!class_exists('UploadFile')) require_once('include/upload_file.php');         
               
                }
                
                foreach($notes as $note) {
                    if($note->object_name == 'Note') {
                        if (! empty($note->file->temp_file_location) && is_file($note->file->temp_file_location)) {
                            $file_location = $note->file->temp_file_location;
                            $filename = $note->file->original_file_name;
                            $mime_type = $note->file->mime_type;
                        } else {
                            $file_location = rawurldecode(UploadFile::get_file_path($note->filename,$note->id));
                            $filename = $note->id.$note->filename;
                            $mime_type = $note->file_mime_type;
                        }
                    } elseif($note->object_name == 'DocumentRevision') { // from Documents
                        $filename = $note->id.$note->filename;
                        $file_location = getcwd().'/cache/upload/'.$filename;
                        $mime_type = $note->file_mime_type;
                    }
        
                    $noteAudit = new Note();
                    $noteAudit->parent_id = $retId;
                    $noteAudit->parent_type = $this->ref_email->module_dir;
                    $noteAudit->description = "[".$note->filename."] ".$mod_strings['LBL_ATTACHMENT_AUDIT'];
                    $noteAudit->filename=$filename;
                    $noteAudit->file_mime_type=$mime_type;
                    $noteAudit_id=$noteAudit->save();
    
                    UploadFile::duplicate_file($note->id, $noteAudit_id, $filename);                
                }       
            }
            
            //load relationships.
            $this->ref_email->load_relationship('users');
            $this->ref_email->load_relationship('prospects');
            $this->ref_email->load_relationship('contacts');
            $this->ref_email->load_relationship('leads');
       }
       
       if (!empty($this->related_id ) && !empty($this->related_type)) {
            
            //save relationships.
            switch ($this->related_type)  {
                case 'Users':
                    $rel_name="users";
                    break;
                    
                case 'Prospects':
                    $rel_name="prospects";
                    break;
        
                case 'Contacts':
                    $rel_name="contacts";
                    break;
        
                case 'Leads':   
                    $rel_name="leads";
                    break;
            }
            
            //required for one email per campaign per marketing message.
            $this->ref_email->$rel_name->add($this->related_id,array('campaign_data'=>serialize($macro_nv)));
       }
       return $this->ref_email->id;
    }

   /**
    * The function creates a copy of email send to each target.
    */
    function create_indiv_email($module,$mail) {
    
        $email = new Email();



        $email->to_addrs= $module->first_name . ' ' . $module->last_name . '&lt;'.$module->email1.'&gt;';
        $email->to_addrs_ids = $module->id .';';
        $email->to_addrs_names = $module->first_name . ' ' . $module->last_name . ';';
        $email->to_addrs_emails = $module->email1 . ';';
        $email->type= 'archived';
        $email->deleted = '0';
        $email->name = $this->current_campaign->name.': '.$mail->Subject ;
        if ($email->ContentType == "text/plain") {            
            $email->description = $mail->Body;
            $email->description_html =null;
        } else {
            $email->description_html = $mail->Body;
            $email->description = $mail->AltBody;        
        }
        $email->from_addr = $mail->From;
        $email->assigned_user_id = $this->user_id;
        $email->parent_type = $this->related_type;
        $email->parent_id = $this->related_id ;
    
        $email->date_start =date('Y-m-d');
        $email->time_start =date('H:i:s');
        $email->status='sent';
        $retId = $email->save();
        
        foreach($this->notes_array as $note) {
            if(!class_exists('Note')) {
                require_once('modules/Notes/Note.php');
            }
            // create "audit" email without duping off the file to save on disk space
            $noteAudit = new Note();
            $noteAudit->parent_id = $retId;
            $noteAudit->parent_type = $email->module_dir;
            $noteAudit->description = "[".$note->filename."] ".$mod_strings['LBL_ATTACHMENT_AUDIT'];
            $noteAudit->save();
        }
   
        if (!empty($this->related_id ) && !empty($this->related_type)) {
                
                //save relationships.
                switch ($this->related_type)  {
                    case 'Users':
                        $rel_name="users";
                        break;
                        
                    case 'Prospects':
                        $rel_name="prospects";
                        break;

                    case 'Contacts':
                        $rel_name="contacts";
                        break;

                    case 'Leads':   
                        $rel_name="leads";
                        break;
                }
                
                if (!empty($rel_name)) {
                    $email->load_relationship($rel_name);
                    $email->$rel_name->add($this->related_id);
                }
        }
        return $email->id;
    }
    
	function sendEmail($mail,$save_emails=1,$testmode=false){
	    $this->test=$testmode;
	    	
		global $beanList, $beanFiles, $sugar_config;
		global $mod_strings;
		$mod_strings = return_module_language( $sugar_config['default_language'], 'EmailMan');

		//get tracking entities locations.
		if (!isset($this->tracking_url)) {
			if (!class_exists('Administration')) {
				require_once('modules/Administration/Administration.php');
			}
			$admin=new Administration();
			$admin->retrieveSettings('massemailer'); //retrieve all admin settings.
		    if (isset($admin->settings['massemailer_tracking_entities_location_type']) and $admin->settings['massemailer_tracking_entities_location_type']=='2'  and isset($admin->settings['massemailer_tracking_entities_location']) ) {
				$this->tracking_url=$admin->settings['massemailer_tracking_entities_location'];
		    } else {
				$this->tracking_url=$sugar_config['site_url'];
		    }
		} 
		if(!isset($beanList[$this->related_type])){
			return false;
		}
		$class = $beanList[$this->related_type];
		if (!class_exists($class)) {
			require_once($beanFiles[$class]);
		}

		if (!class_exists('Email')) {
			require_once('modules/Emails/Email.php');
		}

		$module = new $class();
		$module->retrieve($this->related_id);
		if ((!isset($module->email_opt_out) || $module->email_opt_out != 'on') && (!isset($module->invalid_email) || $module->invalid_email != 1)){
			$lower_email_address=strtolower($module->email1);
			//test against indivdual address.
			if (isset($this->restricted_addresses) and isset($this->restricted_addresses[$lower_email_address])) {
				$this->set_as_sent($lower_email_address,true, true,null,null,null,true);
				return true;	
			} 
			//test against restricted domains
			$at_pos=strrpos($lower_email_address,'@');
			if ($at_pos !== false) {
				foreach ($this->restricted_domains as $domain=>$value) {
					$pos=strrpos($lower_email_address,$domain);
					if ($pos !== false && $pos > $at_pos) {
						//found						
						$this->set_as_sent($lower_email_address,true, true,null,null,null,true);
						return true;	
					}
				}
			}
			//test for duplicate email address.

			if (!empty($module->email1) and !empty($this->campaign_id)) {
                $dup_query="select id from campaign_log where more_information='".$module->email1."' and marketing_id='".$this->marketing_id."'";
				$dup=$this->db->query($dup_query);
				$dup_row=$this->db->fetchByAssoc($dup);
				if (!empty($dup_row)) {
					//email address was processed //silent delete this entry.
					$this->set_as_sent($module->email1,true, true,null,null,null,true);
					return true;	
				}
			}

			$start = microtime();
			$this->target_tracker_key=create_guid();

			//fetch email marketing.			
			if (empty($this->current_emailmarketing) or !isset($this->current_emailmarketing)) {
				if (!class_exists('EmailMarketing')) {
					require_once('modules/EmailMarketing/EmailMarketing.php');
				}
				
				$this->current_emailmarketing=new EmailMarketing();
                
			} 
			if (empty($this->current_emailmarketing->id) or $this->current_emailmarketing->id !== $this->marketing_id) {
				$this->current_emailmarketing->retrieve($this->marketing_id);

                $this->newmessage = true;
			}
			//fetch email template associate with the marketing message.
			if (empty($this->current_emailtemplate) or $this->current_emailtemplate->id !== $this->current_emailmarketing->template_id) {
				if (!class_exists('EmailTemplate')) {
					require_once('modules/EmailTemplates/EmailTemplate.php');
				}
				$this->current_emailtemplate= new EmailTemplate();
				
				$this->current_emailtemplate->retrieve($this->current_emailmarketing->template_id);

				//escape email template contents.
				$this->current_emailtemplate->subject=from_html($this->current_emailtemplate->subject);
				$this->current_emailtemplate->body_html=from_html($this->current_emailtemplate->body_html);
				$this->current_emailtemplate->body=from_html($this->current_emailtemplate->body);
				

				$q = "SELECT * FROM notes WHERE parent_id = '".$this->current_emailtemplate->id."' AND deleted = 0";
				$r = $this->db->query($q);

				// cn: bug 4684 - initialize the notes array, else old data is still around for the next round
				$this->notes_array = array();

				while($a = $this->db->fetchByAssoc($r)) {
					$noteTemplate = new Note();
					$noteTemplate->retrieve($a['id']);
					$this->notes_array[] = $noteTemplate;
				}

			}

			//fetch mailbox details..
			if (empty($this->current_mailbox)) {
				if (!class_exists('InboundEmail')) {
					require_once('modules/InboundEmail/InboundEmail.php');
				}
				$this->current_mailbox= new InboundEmail();
			} 
			if (empty($this->current_mailbox->id) or $this->current_mailbox->id !== $this->current_emailmarketing->inbound_email_id) {
				$this->current_mailbox->retrieve($this->current_emailmarketing->inbound_email_id);
				//extract the email address.
				$this->mailbox_from_addr=$this->current_mailbox->get_stored_options('from_addr','nobody@example.com',null);
			}
			
			//fetch campaign  details..
			if (empty($this->current_campaign)) {
				if (!class_exists('Campaign')) {
					require_once('modules/Campaigns/Campaign.php');
				}
				$this->current_campaign= new Campaign();
			} 
			if (empty($this->current_campaign->id) or $this->current_campaign->id !== $this->current_emailmarketing->campaign_id) {
				$this->current_campaign->retrieve($this->current_emailmarketing->campaign_id);

				//load defined tracked_urls
				$this->current_campaign->load_relationship('tracked_urls'); 
				$query_array=$this->current_campaign->tracked_urls->getQuery(true);
				$query_array['select']="SELECT tracker_name, tracker_key, id, is_optout ";
				$result=$this->current_campaign->db->query(implode(' ',$query_array));

				$this->has_optout_links=false;
				while (($row=$this->current_campaign->db->fetchByAssoc($result)) != null) {
					$this->tracker_urls['{'.$row['tracker_name'].'}']=$row;				
					//has the user defined opt-out links for the campaign.
					if ($row['is_optout']==1) {
						$this->has_optout_links=true;
					}	
				}
			}



            //BEGIN:this code will trigger for only campaigns pending before upgrade to 4.2.0.
            //will be removed for the next release.
			$btracker=true;
			$tracker_url = $this->tracking_url . '/campaign_tracker.php?track=' . $this->current_campaign->tracker_key.'&identifier='.$this->target_tracker_key;
			$tracker_text = $this->current_campaign->tracker_text;
			if(empty($tracker_text)) {
				$btracker=false;
			}
			//END
			
			$mail->ClearAllRecipients();
			$mail->ClearReplyTos();
			$mail->Sender	= $this->mailbox_from_addr;
			$mail->From     = $this->mailbox_from_addr;
			$mail->FromName = $this->current_emailmarketing->from_name;
            $mail->AddReplyTo($this->mailbox_from_addr, $this->current_emailmarketing->from_name);
			//parse and replace bean variables.
            $macro_nv=array();
			$template_data=  $this->current_emailtemplate->parse_email_template(array('subject'=>$this->current_emailtemplate->subject,
																					  'body_html'=>$this->current_emailtemplate->body_html,
																					  'body'=>$this->current_emailtemplate->body,
																					  )
																					  ,'Contacts', $module
                                                                                      ,$macro_nv);
                                                                                      
            //add email address to this list.
            $macro_nv['sugar_to_email_address']=$module->email1;
                                                                                      
            //parse and replace urls.
			//this is new style of adding tracked urls to a campaign.
			$tracker_url_template= $this->tracking_url . '/campaign_trackerv2.php?track=%s'.'&identifier='.$this->target_tracker_key;
			$removeme_url_template=$this->tracking_url . '/removeme.php?identifier='.$this->target_tracker_key;
			$template_data=  $this->current_emailtemplate->parse_tracker_urls($template_data,$tracker_url_template,$this->tracker_urls,$removeme_url_template);
			$mail->AddAddress($module->email1, $module->first_name . ' ' . $module->last_name);
			
			
            if($this->test){
                $mail->Subject =  $mod_strings['LBL_PREPEND_TEST'] . $template_data['subject'];
            }else{
                $mail->Subject =  $template_data['subject'];    
            }
			
            //check if this template is meant to be used as "text only"
            $text_only = false;
            if(isset($this->current_emailtemplate->text_only) && $this->current_emailtemplate->text_only){$text_only =true;}
            //if this template is textonly, then just send text body.  Do not add tracker, opt out, 
            //or perform other processing as it will not show up in text only email
            if($text_only){
                $this->description_html = '';
                $mail->IsHTML(false);
                $mail->Body = $template_data['body'];

            }else{
                $mail->Body = wordwrap($template_data['body_html'], 900);                
                //BEGIN:this code will trigger for only campaigns pending before upgrade to 4.2.0.
                //will be removed for the next release.
                if ($btracker) {
                    $mail->Body .= "<br><br><a href='". $tracker_url ."'>" . $tracker_text . "</a><br><br>";
                } else {
                    if (!empty($tracker_url)) {
                        $mail->Body = str_replace('TRACKER_URL_START', "<a href='" . $tracker_url ."'>", $mail->Body);
                        $mail->Body = str_replace('TRACKER_URL_END', "</a>", $mail->Body);
                        $mail->AltBody = str_replace('TRACKER_URL_START', "<a href='" . $tracker_url ."'>", $mail->AltBody);
                        $mail->AltBody = str_replace('TRACKER_URL_END', "</a>", $mail->AltBody);
                    } 
                }
                //END
                
                //do not add the default remove me link if the campaign has a trackerurl of the opotout link
                if ($this->has_optout_links==false) {
                    $mail->Body .= "<br><font size='2'>{$mod_strings['TXT_REMOVE_ME']}<a href='". $this->tracking_url . "/removeme.php?identifier={$this->target_tracker_key}'>{$mod_strings['TXT_REMOVE_ME_CLICK']}</a></font>";
                }
                //add image reference to track opening of html emails.
                $mail->Body .= "<br><IMG HEIGHT=1 WIDTH=1 src={$this->tracking_url}/image.php?identifier={$this->target_tracker_key}>";
    
                $mail->AltBody = $template_data['body'];
                if ($btracker) {
                    $mail->AltBody .="\n". $tracker_url;
                }
                if ($this->has_optout_links==false) {
                    $mail->AltBody .="\n\n\n{$mod_strings['TXT_REMOVE_ME_ALT']} ". $this->tracking_url . "/removeme.php?identifier=$this->target_tracker_key";
                }
    
            }
			
			// cn: bug 4684, handle attachments in email templates.
			$mail->handleAttachments($this->notes_array);
			$mail->prepForOutbound();
			
	    	$success = $mail->Send();
			if($success ){
                $email_id=null;
                if ($save_emails==1) {
                    $email_id=$this->create_indiv_email($module,$mail);
                } else {
                    //find/create reference email record. all campaign targets reveiving this message will be linked with this message.
                    $email_id=$this->create_ref_email($this->marketing_id,
                                            $this->current_emailtemplate->subject,
                                            $this->current_emailtemplate->body,
                                            $this->current_emailtemplate->body_html,
                                            $this->current_campaign->name,
                                            $this->mailbox_from_addr,
                                            $this->user_id,
                                            $this->notes_array,
                                            $macro_nv,
                                            $this->newmessage
                     );
                    $this->newmessage = false;
                }
            }

			if ($success) {
				$this->set_as_sent($module->email1,$success, $success,$email_id,'Emails','targeted');
			} else {            if(!empty($layout_def['parent_id'])) { 
                if (isset($layout_def['fields'][strtoupper($layout_def['parent_id'])])) {
                    $parent.="&parent_id=".$layout_def['fields'][strtoupper($layout_def['parent_id'])];
                }
            }        
            if(!empty($layout_def['parent_module'])) { 
                if (isset($layout_def['fields'][strtoupper($layout_def['parent_module'])])) {
                    $parent.="&parent_module=".$layout_def['fields'][strtoupper($layout_def['parent_module'])];
                }
            }        
                
				//log send error.
				$this->set_as_sent($module->email1,$success, $success);			
			}
		}else{
			$mail->ErrorInfo .= "\nRecipient Email Opt Out";
			$success = false;
            $this->target_tracker_key=create_guid();
			if (isset($module->email_opt_out) && $module->email_opt_out == 'on') {
				$this->set_as_sent($module->email1,$success, true,null,null,'removed');				
			} else {
				if (isset($module->invalid_email) && $module->invalid_email == 1) {
					$this->set_as_sent($module->email1,$success, true,null,null,'invalid email');				
				} else {
					$this->set_as_sent($module->email1,$success, true);									
				}			
			}
		}
		return $success;
	}
}
?>
