mirror of
https://github.com/e107inc/e107.git
synced 2025-01-17 20:58:30 +01:00
262 lines
7.5 KiB
PHP
262 lines
7.5 KiB
PHP
<?php
|
|
/*
|
|
* e107 website system
|
|
*
|
|
* Copyright (C) 2008-2013 e107 Inc (e107.org)
|
|
* Released under the terms and conditions of the
|
|
* GNU General Public License (http://www.gnu.org/licenses/gpl.txt)
|
|
*
|
|
* Newsletter plugin - mailout function
|
|
*
|
|
*
|
|
*/
|
|
|
|
|
|
/**
|
|
* e107 Newsletter plugin
|
|
*
|
|
* @package e107_plugins
|
|
* @subpackage newsletter
|
|
* @version $Id$;
|
|
*/
|
|
|
|
if (!defined('e107_INIT')) { exit; }
|
|
|
|
|
|
e107::includeLan(e_PLUGIN.'/newsletter/languages/English_admin_newsletter.php');
|
|
|
|
/*
|
|
Class for newsletter mailout function
|
|
|
|
Allows admins to send mail to those subscribed to one or more newsletters
|
|
*/
|
|
// These variables determine the circumstances under which this class is loaded (only used during loading, and may be overwritten later)
|
|
$mailerIncludeWithDefault = TRUE; // Mandatory - if false, show only when mailout for this specific plugin is enabled
|
|
$mailerExcludeDefault = FALSE; // Mandatory - if TRUE, when this plugin's mailout is active, the default (core) isn't loaded
|
|
|
|
class newsletter_mailout
|
|
{
|
|
protected $mailCount = 0;
|
|
protected $mailRead = 0;
|
|
//public $mailerSource = 'newsletter'; // Plugin name (core mailer is special case) Must be directory for this file
|
|
public $mailerName =LAN_PLUGIN_NEWSLETTER_NAME; // Text to identify the source of selector (displayed on left of admin page)
|
|
public $mailerEnabled = TRUE; // Mandatory - set to FALSE to disable this plugin (e.g. due to permissions restrictions)
|
|
private $selectorActive = FALSE; // Set TRUE if we've got a valid selector to start returning entries
|
|
private $targets = array(); // Used to store potential recipients
|
|
private $ourDB;
|
|
|
|
|
|
// Constructor
|
|
public function __construct()
|
|
{
|
|
// BAD FOR PERFORMANCE
|
|
//$this->e107 = e107::getInstance();
|
|
//$this->adminHandler = e107::getRegistry('_mailout_admin'); // Get the mailer admin object - we want to use some of its functions
|
|
}
|
|
|
|
|
|
/**
|
|
* Return data representing the user's selection criteria as entered in the $_POST array.
|
|
*
|
|
* This is stored in the DB with a saved email. (Just return an empty string or array if this is undesirable)
|
|
* The returned value is passed back to selectInit() and showSelect when needed.
|
|
*
|
|
* @return string Selection data - comma-separated list of category IDs
|
|
*/
|
|
public function returnSelectors()
|
|
{
|
|
$res = array();
|
|
if (is_array($_POST['nl_category_sel']))
|
|
{
|
|
foreach ($_POST['nl_category_sel'] as $k => $v)
|
|
{
|
|
$res[] = intval($v);
|
|
}
|
|
}
|
|
return implode(',',$res);
|
|
}
|
|
|
|
|
|
/**
|
|
* Called to initialise data selection routine.
|
|
* Needs to save any queries or other information into internal variables, do initial DB queries as appropriate.
|
|
* Could in principle read all addresses and buffer them for later routines, if this is more convenient
|
|
*
|
|
* @param string $selectVals - array of selection criteria as returned by returnSelectors()
|
|
*
|
|
* @return integer Return number of records available (or 1 if unknown) on success, FALSE on failure
|
|
*/
|
|
public function selectInit($selectVals = FALSE)
|
|
{
|
|
$sql = e107::getDb();
|
|
|
|
|
|
if (($selectVals === FALSE) || ($selectVals == ''))
|
|
{
|
|
return 0; // No valid selector - so no valid records
|
|
}
|
|
|
|
$qry = "SELECT newsletter_id,newsletter_subscribers FROM `#newsletter` WHERE (`newsletter_parent`=0) AND (`newsletter_id` IN ({$selectVals}))";
|
|
// echo "Selector {$selectVals} query: ".$qry.'<br />';
|
|
if (!($sql->gen($qry))) return FALSE;
|
|
$this->selectorActive = TRUE;
|
|
$this->mail_count = 1; // We have no idea of how many subscribers without reading all relevant DB records
|
|
$this->mail_read = 0;
|
|
$this->ourDB = new db(); // We'll need our own database object
|
|
return $this->mail_count;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Return an email address to add to the recipients list. Return FALSE if no more addresses to add
|
|
*
|
|
* @return array|boolean FALSE if no more addresses available; else an array:
|
|
* 'mail_recipient_id' - non-zero if a registered user, zero if a non-registered user. (Always non-zero from this class)
|
|
* 'mail_recipient_name' - user name
|
|
* 'mail_recipient_email' - email address to use
|
|
* 'mail_target_info' - array of info which might be substituted into email, usually using the codes defined by the editor.
|
|
* Array key is the code within '|...|', value is the string for substitution
|
|
*/
|
|
public function selectAdd()
|
|
{
|
|
|
|
$sql = e107::getDb();
|
|
|
|
|
|
if (!$this->selectorActive) return FALSE;
|
|
|
|
while ($this->selectorActive)
|
|
{
|
|
if (count($this->targets) == 0)
|
|
{ // Read in and process another newletter mailing list
|
|
if (!($row = $sql->fetch()))
|
|
{
|
|
$this->selectorActive = FALSE;
|
|
return FALSE; // Run out of DB records
|
|
}
|
|
$this->targets = explode(chr(1), $row['newsletter_subscribers']);
|
|
unset($row);
|
|
}
|
|
foreach ($this->targets as $k => $v)
|
|
{
|
|
if ($uid = intval(trim($v)))
|
|
{ // Got a user ID here - look them up and add their data
|
|
if ($this->ourDB->select('user', 'user_name,user_email,user_lastvisit', '`user_id`='.$uid))
|
|
{
|
|
$row = $this->ourDB->fetch();
|
|
$ret = array('mail_recipient_id' => $uid,
|
|
'mail_recipient_name' => $row['user_name'], // Should this use realname?
|
|
'mail_recipient_email' => $row['user_email'],
|
|
'mail_target_info' => array(
|
|
'USERID' => $uid,
|
|
'DISPLAYNAME' => $row['user_name'],
|
|
'SIGNUP_LINK' => $row['user_sess'],
|
|
'USERNAME' => $row['user_loginname'],
|
|
'USERLASTVISIT' => $row['user_lastvisit']
|
|
)
|
|
);
|
|
$this->mail_read++;
|
|
unset($this->targets[$k]);
|
|
return $ret;
|
|
}
|
|
}
|
|
unset($this->targets[$k]);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Called once all email addresses read, to do any housekeeping needed
|
|
* @return none
|
|
*/
|
|
public function select_close()
|
|
{
|
|
// Nothing to do here
|
|
}
|
|
|
|
|
|
/**
|
|
* Called to show current selection criteria, and optionally allow edit
|
|
*
|
|
* @param boolean $allow_edit is TRUE to allow user to change the selection; FALSE to just display current settings
|
|
* @param string $selectVals is the current selection information - in the same format as returned by returnSelectors()
|
|
*
|
|
* @return array Returns array which is displayed in a table cell
|
|
*/
|
|
public function showSelect($allow_edit = FALSE, $selectVals = FALSE)
|
|
{
|
|
$sql = e107::getDb();
|
|
$frm = e107::getForm();
|
|
$var = array();
|
|
|
|
$selects = array_flip(explode(',', $selectVals));
|
|
|
|
if ($sql->select('newsletter', 'newsletter_id, newsletter_title', '`newsletter_parent`=0'))
|
|
{
|
|
$c=0;
|
|
while ($row = $sql->fetch())
|
|
{
|
|
$checked = (isset($selects[$row['newsletter_id']])) ? " checked='checked'" : '';
|
|
|
|
if ($allow_edit)
|
|
{
|
|
$var[$c]['caption'] = $row['newsletter_title'];
|
|
$var[$c]['html'] = $frm->checkbox('nl_category_sel[]',$row['newsletter_id'] ,$checked);
|
|
}
|
|
elseif($checked)
|
|
{
|
|
$var[$c]['caption'] = $row['newsletter_title'];
|
|
$var[$c]['html'] = NLLAN_49;
|
|
}
|
|
$c++;
|
|
}
|
|
|
|
return $var;
|
|
}
|
|
elseif($allow_edit == true)
|
|
{
|
|
|
|
$var[0]['caption'] = "No newsletters found";
|
|
$var[0]['html'] = '';
|
|
|
|
return $var;
|
|
}
|
|
else
|
|
{
|
|
return false; // Return Nothing to avoid confusion.
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* Manage Bounces.
|
|
*/
|
|
public function bounce($data)
|
|
{
|
|
e107::getLog()->add('Newsletter Bounce', $data, E_LOG_INFORMATIVE, 'BOUNCE');
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Manage Sent.
|
|
*/
|
|
public function sent($data) // trigerred when email sent from queue.
|
|
{
|
|
// if($data['status'] == 1) // Successfully sent
|
|
// {
|
|
// e107::getLog()->add('Newsletter Sent', $data, E_LOG_INFORMATIVE, 'SENT');
|
|
// }
|
|
// else // Failed
|
|
// {
|
|
// e107::getLog()->add('Newsletter Sent', $data, E_LOG_FATAL, 'SENT');
|
|
// }
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|