* @copyright 2009 Deon George * @link http://osb.leenooks.net * * @link http://www.agileco.com/ * @copyright 2004-2008 Agileco, LLC. * @license http://www.agileco.com/agilebill/license1-4.txt * @author Tony Landis * @package AgileBill * @subpackage Module:Mail */ /** * The main AgileBill Mail Template Class * * include_once(PATH_MODULES.'email_template/email_template.inc.php'); * $my = new email_template; * $my->send('newsletter_subscribe','4d1800b401f5d340f022688de0ac2687','f1714072da3c05a220ac3b60a3a57d88','2','3'); * * @package AgileBill * @subpackage Module:Mail */ class email_template extends OSB_module { /** * Send or Queue template based email * * Prefixing the template with "admin->" will result in the mail being * sent to the admin only. * * @param string $template_name Name of template to use * @param int $acct Account ID or email address */ public function send($template_name,$acct,$sql1,$sql2,$sql3,$queue=true) { global $VAR,$C_debug,$C_list; $db = &DB(); # Send to admin only? $admin_only = false; if (preg_match('/^admin->/',$template_name)) { $admin_only = true; $template_name = preg_replace('/^admin->/','',$template_name); } $template = $db->Execute(sqlselect($db,'email_template','*',array('name'=>$template_name))); # If the template is not active, return. if (! $template || $template->fields['active'] != '1') return; # Setup our Email $E = array(); # Email Priority $E['priority'] = $template->fields['priority']; # Get the setup_email settings if (empty($template->fields['setup_email_id'])) $setup_email_id = DEFAULT_SETUP_EMAIL; else $setup_email_id = $template->fields['setup_email_id']; $setup_email = $db->Execute(sqlSelect($db,'setup_email','*',array('id'=>$setup_email_id))); # Queue the email if ($queue && $C_list->is_installed('email_queue') && $setup_email->fields['queue']) { # Set sql vars if (is_array($sql1)) $sql1 = serialize($sql1); if (is_array($sql2)) $sql2 = serialize($sql2); if (is_array($sql3)) $sql3 = serialize($sql3); if (is_array($VAR)) $var = serialize($VAR); # If this was an admin only email, we need to rewrite the template name again. if ($admin_only) $sql_template = sprintf('admin->%s',$template->fields['name']); else $sql_template = $template->fields['name']; # Check that this email is not already in the queue $duplicates = $db->Execute(sqlSelect($db,'email_queue','id', array('status'=>0,'account_id'=>$acct,'email_template'=>$sql_template,'sql1'=>$sql1,'sql2'=>$sql2,'sql3'=>$sql3) )); if ($duplicates != false && $duplicates->RecordCount() > 0) return; # Queue this Email $db->Execute(sqlInsert($db,'email_queue',array( 'date_orig'=>time(), 'date_last'=>time(), 'status'=>0, 'account_id'=>$acct, 'email_template'=>$sql_template, 'sql1'=>$sql1, 'sql2'=>$sql2, 'sql3'=>$sql3, 'var'=>$var) )); return; } # Is this an SMTP connection if ($setup_email->fields['type'] == 1) { $E['server'] = $setup_email->fields['server']; $E['account'] = $setup_email->fields['username']; $E['password'] = $setup_email->fields['password']; } $E['from_name'] = $setup_email->fields['from_name']; $E['from_email'] = $setup_email->fields['from_email']; if ($setup_email->fields['cc_list']) $E['cc_list'] = explode(',',$setup_email->fields['cc_list']); if ($setup_email->fields['bcc_list']) $E['bcc_list'] = explode(',',$setup_email->fields['bcc_list']); # Get the account settings $account = $db->Execute($q=sqlSelect($db,'account','*',sprintf('(email=::%s:: OR id=::%s::)',$acct,$acct))); if (! $account) { $C_debug->error(__FILE__,__METHOD__,sprintf('%s %s',$db->ErrorMsg(),$q)); return false; } if ($admin_only) { $E['to_email'] = $setup_email->fields['from_email']; $E['to_name'] = $setup_email->fields['from_name']; $ab_account = true; } else { if ($account->RecordCount() > 0) { $E['to_email'] = $account->fields['email']; $E['to_name'] = sprintf('%s %s',$account->fields['first_name'],$account->fields['last_name']); $ab_account = true; } else { $E['to_email'] = $acct; $E['to_name'] = $acct; $ab_account = false; } } # Get the template translation for the specified account for text/htm if ($ab_account && $account->fields['language_id']) $language_id = $account->fields['language_id']; else $language_id = DEFAULT_LANGUAGE; $email_template_translate = $db->Execute(sqlSelect($db,'email_template_translate','*',array('language_id'=>$language_id,'email_template_id'=>$template->fields['id']))); # If there is no translation, get the default translation for this email if (! $email_template_translate || ! $email_template_translate->RecordCount()) $email_template_translate = $db->Execute(sqlSelect($db,'email_template_translate','*',array('language_id'=>DEFAULT_LANGUAGE,'email_template_id'=>$template->fields['id']))); # Unable to locate translation? if (! $email_template_translate || ! $email_template_translate->RecordCount()) { global $C_debug; $C_debug->error(__FILE__,__METHOD__, sprintf('Unable to locate translation for Email Template %s and Language %s OR %s',$template->fields['name'],$language_id,DEFAULT_LANGUAGE)); return; } # Set the subject: $E['subject'] = $email_template_translate->fields['subject']; # Determine whether to send HTML or not... if ($ab_account && $account->fields['email_type'] == 1) { if (! empty($email_template_translate->fields['message_html'])) { $E['body_html'] = $email_template_translate->fields['message_html']; $E['html'] = '1'; } else { $E['body_html'] = false; $E['html'] = '0'; } } else { $E['html'] = '0'; } $E['body_text'] = $email_template_translate->fields['message_text']; # Get the date-time include_once(PATH_CORE.'list.inc.php'); $cl = new CORE_list; $date = $cl->date_time(time()); # Url formatting. if ($admin_only) { $site_url = URL.'admin.php'; $site_ssl_url = SSL_URL.'admin.php'; } else { $site_url = URL; $site_ssl_url = SSL_URL; } # Get the replace vars from the email template: $replace = array( '%site_name%' => $E['from_name'], '%site_email%' => $E['from_email'], '%url%' => $site_url, '%date%' => $date, '%ssl_url%' => $site_ssl_url); # Include the replace vars from the $VAR variable: foreach ($VAR as $key => $value) { $re_this = sprintf('%%var_%s%%',$key); $replace[$re_this] = $value; } # Get the replace vars from the account $replace['%acct_id%'] = $acct; if ($ab_account) foreach ($account->fields as $key => $value) { $re_this = sprintf('%%acct_%s%%',$key); $replace[$re_this] = $value; } # Get the SQL1/2/3 Query/Arrays foreach (array(1,2,3) as $i) if ($template->fields['sql_'.$i] && $sql1 && ! is_array($sql1)) { # Set our DB prefix $sql = str_replace('%DB_PREFIX%',AGILE_DB_PREFIX,$template->fields['sql_'.$i]); # Set the SQL $sql = str_replace('%SQL1%',$db->qstr($sql1),$sql); if ($sql2 && ! is_array($sql2)) $sql = str_replace('%SQL2%',$db->qstr($sql2),$sql); if ($sql3 && ! is_array($sql3)) $sql = str_replace('%SQL3%',$db->qstr($sql3),$sql); $sql .= sprintf(' AND site_id=%s',DEFAULT_SITE); $SQL = $db->Execute($sql); if (! $SQL) { # Return the error message global $C_debug; $C_debug->error(__FILE__,__METHOD__,sprintf('%s %s',$db->ErrorMsg(),$sql)); } elseif ($SQL->RecordCount() > 0) { # Get the replace vars from the sql results: foreach ($SQL->fields as $key => $value) { $re_this = sprintf('%%sql%s_%s%%',$i,$key); $replace[$re_this] = $value; } } } if (is_array($sql1)) { echo '
1a.HOW DID I GET HERE??? (WHAT SHOULD THIS DO??)';debug_print_backtrace();die();
			while(list($key,$value) = each($sql1))
				$replace[$key] = $value;

		} elseif ($sql1 && ! $template->fields['sql_1']) {
			$replace['%sql1%'] = $sql1;
		}

		if (is_array($sql2)) {
			echo '
2a.HOW DID I GET HERE??? (WHAT SHOULD THIS DO??)';debug_print_backtrace();die();
			while(list($key,$value) = each($sql2))
				$replace[$key] = $value;

		} elseif ($sql2 && ! $template->fields['sql_2']) {
			$replace['%sql2%'] = $sql2;
		}

		if (is_array($sql3)) {
			echo '
3a.HOW DID I GET HERE??? (WHAT SHOULD THIS DO??)';debug_print_backtrace();die();
			while(list($key,$value) = each($sql3))
				$replace[$key] = $value;

		} elseif ($sql3 && ! $template->fields['sql_3']) {
			$replace['%sql3%'] = $sql3;
		}

		foreach (array('subject','body_text','body_html') as $i)
			if (! empty($E[$i])) {
				# Replace the $replace vars in the body and subject
				foreach ($replace as $key => $value)
					$E[$i] = str_replace($key,$value,$E[$i]);

				# Remove any unparsed vars from the body text and html:
				if (preg_match('/%/',$E[$i]))
					$E[$i] = preg_replace('/%[a-zA-Z0-9_]{1,}%/','',$E[$i]);
			}

		# Set any attachments (not currently supported)
		$E['attatchments'] = '';

		# Email log?
		if ($C_list->is_installed('email_log')) {
			include_once(PATH_MODULES.'email_log/email_log.inc.php');
			$log = new email_log;

			$log->add($acct,$E['subject'],$E['body_text'],$E['to_email'],false,$E['priority']);
		}

		# Call the mail class
		require_once(PATH_CORE.'email.inc.php');
		$email = new CORE_email;

		if ($setup_email->fields['type'] == 1)
			return $email->SMTP_Mail($E);
		else
			return $email->PHP_Mail($E);
	}
}
?>