From eb05b14438d69b435b991d927ff6278ac867d014 Mon Sep 17 00:00:00 2001 From: e107steved Date: Thu, 19 Nov 2009 20:24:21 +0000 Subject: [PATCH] Latest mailer updates - primarily use new features in newsletter and notify. Also newsletter enhancements; thanks nlstart --- e107_handlers/mail.php | 92 +--- e107_handlers/mail_manager_class.php | 9 +- e107_handlers/mailout_admin_class.php | 8 +- e107_handlers/news_class.php | 25 +- e107_handlers/notify_class.php | 151 ++++-- e107_languages/English/admin/lan_mailout.php | 8 +- e107_plugins/newsletter/admin_config.php | 458 +++++++++--------- e107_plugins/newsletter/e_mailout.php | 212 ++++++++ e107_plugins/newsletter/languages/English.php | 98 +--- .../languages/English_admin_newsletter.php | 87 ++++ e107_plugins/newsletter/newsletter_menu.php | 59 ++- e107_plugins/newsletter/newsletter_sql.php | 13 + e107_plugins/newsletter/nl_archive.php | 139 ++++++ e107_plugins/newsletter/plugin.php | 78 --- e107_plugins/newsletter/plugin.xml | 19 + 15 files changed, 939 insertions(+), 517 deletions(-) create mode 100644 e107_plugins/newsletter/e_mailout.php create mode 100644 e107_plugins/newsletter/languages/English_admin_newsletter.php create mode 100644 e107_plugins/newsletter/newsletter_sql.php create mode 100644 e107_plugins/newsletter/nl_archive.php delete mode 100644 e107_plugins/newsletter/plugin.php create mode 100644 e107_plugins/newsletter/plugin.xml diff --git a/e107_handlers/mail.php b/e107_handlers/mail.php index fb6513a87..4335282f6 100644 --- a/e107_handlers/mail.php +++ b/e107_handlers/mail.php @@ -9,9 +9,9 @@ * e107 Main * * $Source: /cvs_backup/e107_0.8/e107_handlers/mail.php,v $ - * $Revision: 1.18 $ - * $Date: 2009-11-19 10:07:32 $ - * $Author: e107coders $ + * $Revision: 1.19 $ + * $Date: 2009-11-19 20:24:21 $ + * $Author: e107steved $ */ /* @@ -155,6 +155,7 @@ class e107Email extends PHPMailer private $pause_amount = 10; // Number of emails to send before pausing/resetting (or closing if SMTPkeepAlive set) private $pause_time = 1; // Time to pause after sending a block of emails + public $legacyBody = FALSE; // TRUE enables legacy conversion of plain text body to HTML in HTML emails /** * Constructor sets up all the global options, and sensible defaults - it should be the only place the prefs are accessed @@ -450,11 +451,21 @@ class e107Email extends PHPMailer $message = "\n \n".$message; } + if ($this->legacyBody && !preg_match('/<(font|br|a|img|b)/i', $message)) // Assume html if it includes one of these tags + { // Otherwise assume its a plain text message which needs some conversion to render in HTML + $message = htmlspecialchars($message); + $message = preg_replace('%(http|ftp|https)(://\S+)%', '\1\2', $message); + $message = preg_replace('/([[:space:]()[{}])(www.[-a-zA-Z0-9@:%_\+.~#?&\/\/=]+)/i', '\\1\\2', $message); + $message = preg_replace('/([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3})/i', '\\1', $message); + $message = str_replace("\r\n","\n",$message); // Handle alternative newline characters + $message = str_replace("\n\r","\n",$message); // Handle alternative newline characters + $message = str_replace("\r","\n",$message); // Handle alternative newline characters + $message = str_replace("\n", "
\n", $message); + } $this->MsgHTML($message); // Theoretically this should do everything, including handling of inline images. } else - { - // generate the plain text part + { // generate the plain text as the sole part of the email if (defined('MAIL_DEBUG')) echo "Generating plain text email
"; if (strpos($message,'') !== FALSE) { @@ -471,75 +482,10 @@ class e107Email extends PHPMailer // TODO: strip bbcodes here $this->Body = $text; + $this->AltBody = ''; // Single part email } } - - // Legacy way of creating an HTML and a text part - as used in 0.7 - // $want_HTML= 1 uses default setting for HTML part. Set TRUE to enable, FALSE to disable - function makeBodyLegacy($message,$want_HTML = 1, $add_HTML_header = FALSE) - { - switch (varset($this->general_opts['textonly'],'off')) - { - case 'pref' : // Disable HTML as default - if ($want_HTML == 1) $want_HTML = FALSE; - break; - case 'force' : // Always disable HTML - $want_HTML = FALSE; - break; - } - - if ($want_HTML) - { - if (preg_match('/<(font|br|a|img|b)/i', $message)) - { - $Html = $message; // Assume html if it includes one of these tags - } - else - { - $Html = htmlspecialchars($message); - $Html = preg_replace('%(http|ftp|https)(://\S+)%', '\1\2', $Html); - $Html = preg_replace('/([[:space:]()[{}])(www.[-a-zA-Z0-9@:%_\+.~#?&\/\/=]+)/i', '\\1\\2', $Html); - $Html = preg_replace('/([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3})/i', '\\1', $Html); - $Html = str_replace("\r\n","\n",$Html); // Handle alternative newline characters - $Html = str_replace("\n\r","\n",$Html); // Handle alternative newline characters - $Html = str_replace("\r","\n",$Html); // Handle alternative newline characters - $Html = str_replace("\n", "
\n", $Html); - } - if ($add_HTML_header) - { - $this->Body = "\n - \n".$Html; - } - else - { - $this->Body = $Html; - } - } - - // Now generate the plain text part - always have one - if (strpos($message,"") !== FALSE) - { - $text = strstr($message,""); - } - else - { - $text = $message; - } - - $text = str_replace("
", "\n", $text); - $text = strip_tags(str_replace("
", "\n", $text)); - - if ($want_HTML) - { - $this->AltBody = $text; - $this->IsHTML = TRUE; - } - else - { - $this->Body = $text; - } - } // Add attachments - either a single one as a string, or an array @@ -859,8 +805,8 @@ function sendemail($send_to, $subject, $message, $to_name, $send_from='', $from_ if (varsettrue($mailheader_e107id)) $mail->AddCustomHeader("X-e107-id: {$mailheader_e107id}"); - //Legacy required - \n must be converted to
in HTML version of email. - $mail->makeBodyLegacy($message); // Add body, with conversion if required + $mail->legacyBody = TRUE; // Need to handle plain text email conversion to HTML + $mail->makeBody($message); // Add body, with conversion if required if($Cc) $mail->AddAddressList('cc', $Cc); diff --git a/e107_handlers/mail_manager_class.php b/e107_handlers/mail_manager_class.php index efb749873..2d6707395 100644 --- a/e107_handlers/mail_manager_class.php +++ b/e107_handlers/mail_manager_class.php @@ -9,9 +9,9 @@ * e107 Main * * $Source: /cvs_backup/e107_0.8/e107_handlers/mail_manager_class.php,v $ - * $Revision: 1.4 $ - * $Date: 2009-11-18 01:04:43 $ - * $Author: e107coders $ + * $Revision: 1.5 $ + * $Date: 2009-11-19 20:24:21 $ + * $Author: e107steved $ */ /* @@ -78,6 +78,7 @@ if (!defined('e107_INIT')) { exit; } define('MAIL_STATUS_SENT', 0); // Mail sent. Email handler happy, but may have bounced (or may be yet to bounce) define('MAIL_STATUS_BOUNCED', 1); define('MAIL_STATUS_CANCELLED', 2); +define('MAIL_STATUS_PARTIAL', 3); // A run which was abandoned - errors, out of time etc define('MAIL_STATUS_FAILED', 5); // Failure on initial send - rejected by selected email handler // This must be the numerically highest 'processing complete' code define('MAIL_STATUS_PENDING', 10); // Mail which is in the sending list (even if outside valid sending window) @@ -750,7 +751,7 @@ class e107MailManager /** * Delete an email from the DB, including (potential) recipients * @param $mailID - number for email (assumed to be integral) - * @param $actions - allows selection of whic DB to delete from + * @param $actions - allows selection of which DB to delete from * * @return FALSE on code error. Array of results on success. */ diff --git a/e107_handlers/mailout_admin_class.php b/e107_handlers/mailout_admin_class.php index e4de1589b..fc84f1c90 100644 --- a/e107_handlers/mailout_admin_class.php +++ b/e107_handlers/mailout_admin_class.php @@ -9,9 +9,9 @@ * Administration - Site Maintenance * * $Source: /cvs_backup/e107_0.8/e107_handlers/mailout_admin_class.php,v $ - * $Revision: 1.4 $ - * $Date: 2009-11-18 01:04:43 $ - * $Author: e107coders $ + * $Revision: 1.5 $ + * $Date: 2009-11-19 20:24:21 $ + * $Author: e107steved $ * */ @@ -338,6 +338,8 @@ class mailoutAdminClass extends e107MailManager return LAN_MAILOUT_213; case MAIL_STATUS_CANCELLED : return LAN_MAILOUT_218; + case MAIL_STATUS_PARTIAL : + return LAN_MAILOUT_219; case MAIL_STATUS_FAILED : return LAN_MAILOUT_212; case MAIL_STATUS_PENDING : diff --git a/e107_handlers/news_class.php b/e107_handlers/news_class.php index b9f400394..f95e2fe6d 100644 --- a/e107_handlers/news_class.php +++ b/e107_handlers/news_class.php @@ -9,9 +9,9 @@ * News handler * * $Source: /cvs_backup/e107_0.8/e107_handlers/news_class.php,v $ - * $Revision: 1.28 $ - * $Date: 2009-11-18 01:04:43 $ - * $Author: e107coders $ + * $Revision: 1.29 $ + * $Date: 2009-11-19 20:24:21 $ + * $Author: e107steved $ */ if (!defined('e107_INIT')) { exit; } @@ -113,8 +113,13 @@ class news { $data['error'] = true; return $data; } - - //XXX - Now hooks are executed only if no mysql error is found. Should it stay so? + + // Calculate short strings for admin logging - no need to clog up the log with potentially long items + $logData = $data['data']; + if (isset($logData['news_body'])) $logData['news_body'] = $tp->text_truncate($tp->toDB($logData['news_body']),300,'...'); + if (isset($logData['news_extended'])) $logData['news_extended'] = $tp->text_truncate($tp->toDB($logData['news_extended']),300,'...'); + + //XXX - Now hooks are executed only if no mysql error is found. Should it stay so? Seems sensible to me! if ($news['news_id']) { // Updating existing item @@ -123,8 +128,8 @@ class news { //$vals = "news_datestamp = '".intval($news['news_datestamp'])."', ".$author_insert." news_title='".$news['news_title']."', news_body='".$news['news_body']."', news_extended='".$news['news_extended']."', news_category='".intval($news['cat_id'])."', news_allow_comments='".intval($news['news_allow_comments'])."', news_start='".intval($news['news_start'])."', news_end='".intval($news['news_end'])."', news_class='".$tp->toDB($news['news_class'])."', news_render_type='".intval($news['news_rendertype'])."' , news_summary='".$news['news_summary']."', news_thumbnail='".$tp->toDB($news['news_thumbnail'])."', news_sticky='".intval($news['news_sticky'])."' WHERE news_id='".intval($news['news_id'])."' "; if ($sql->db_Update('news', $data)) { - e107::getAdminLog()->logArrayAll('NEWS_09', $data['data']); - + e107::getAdminLog()->logArrayAll('NEWS_09', $logData); + //manage rewrites $data['data']['news_id'] = $news['news_id']; if('error' === $this->handleRewriteSubmit('update', $data['data'], $datarw, $smessages)) @@ -185,13 +190,13 @@ class news { //$news['news_id'] = $sql ->db_Insert('news', "0, '".$news['news_title']."', '".$news['news_body']."', '".$news['news_extended']."', ".intval($news['news_datestamp']).", ".intval($news['news_author']).", '".intval($news['cat_id'])."', '".intval($news['news_allow_comments'])."', '".intval($news['news_start'])."', '".intval($news['news_end'])."', '".$tp->toDB($news['news_class'])."', '".intval($news['news_rendertype'])."', '0' , '".$news['news_summary']."', '".$tp->toDB($news['news_thumbnail'])."', '".intval($news['news_sticky'])."' ") if ($data['data']['news_id']) { - // + $data['news_id'] = $news['news_id']; $message = LAN_NEWS_6; $emessage->add(LAN_NEWS_6, E_MESSAGE_SUCCESS, $smessages); e107::getCache()->clear('news.php'); //moved down - prevent wrong mysql_insert_id - e107::getAdminLog()->logArrayAll('NEWS_08', $data['data']); + e107::getAdminLog()->logArrayAll('NEWS_08', $logData); //manage rewrites if('error' === $this->handleRewriteSubmit('insert', $data['data'], $datarw, $smessages)) @@ -201,7 +206,7 @@ class news { e107::getEvent()->trigger('newspost', $data['data']); - //XXX - triggetHook after trigger? + //XXX - triggerHook after trigger? $evdata = array('method'=>'create', 'table'=>'news', 'id'=>$data['data']['news_id'], 'plugin'=>'news', 'function'=>'submit_item'); $emessage->add($e_event->triggerHook($evdata), E_MESSAGE_INFO, $smessages); } diff --git a/e107_handlers/notify_class.php b/e107_handlers/notify_class.php index 6b091e954..cf5d5505a 100644 --- a/e107_handlers/notify_class.php +++ b/e107_handlers/notify_class.php @@ -9,9 +9,9 @@ * Forum plugin notify configuration * * $Source: /cvs_backup/e107_0.8/e107_handlers/notify_class.php,v $ -* $Revision: 1.8 $ -* $Date: 2009-11-18 01:04:43 $ -* $Author: e107coders $ +* $Revision: 1.9 $ +* $Date: 2009-11-19 20:24:21 $ +* $Author: e107steved $ * */ @@ -40,42 +40,129 @@ class notify include_lan(e_LANGUAGEDIR.e_LANGUAGE.'/lan_notify.php'); } + + + /** + * Send an email notification following an event. + * + * For up to a (hard-coded) number of recipients, the mail is sent immediately. + * Otherwise its added to the queue + * + * @param string $id - identifies event actions + * @param string $subject - subject for email + * @param string $message - email message body + * @return none + */ + // TODO: handle 'everyone except' clauses (email address filter done) function send($id, $subject, $message) { - global $sql, $tp; - e107_require_once(e_HANDLER.'mail.php'); - $subject = SITENAME.': '.$subject; - if ($this->notify_prefs['event'][$id]['class'] == e_UC_MAINADMIN) + $e107 = e107::getInstance(); + + $subject = $e107->tp->toEmail(SITENAME.': '.$subject); + $message = $e107->tp->toEmail($message); + $emailFilter = ''; + $notifyTarget = $this->notify_prefs['event'][$id]['class']; + if ($notifyTarget == '-email') { - sendemail(SITEADMINEMAIL, $tp->toEmail($subject), $tp->toEmail($message)); + $emailFilter = $this->notify_prefs['event'][$id]['email']; } - elseif (is_numeric($this -> notify_prefs['event'][$id]['class'])) + if (is_numeric($this -> notify_prefs['event'][$id]['class'])) { - if ($this->notify_prefs['event'][$id]['class'] == e_UC_ADMIN) + switch ($notifyTarget) { - $sql->db_Select('user', 'user_email', "user_admin = 1 AND user_ban = 0"); + case e_UC_MAINADMIN : + $qry = "`user_admin` = 1 AND `user_perms` = '0' AND `user_ban` = 0"; + break; + case e_UC_ADMIN : + $qry = "`user_admin` = 1 AND `user_ban` = 0"; + break; + case e_UC_MEMBER : + $qry = "`user_ban` = 0"; + break; + default : + $qry = "user_ban = 0 AND user_class REGEXP '(^|,)(".$this->notify_prefs['event'][$id]['class'].")(,|$)'"; + break; } - elseif ($this->notify_prefs['event'][$id]['class'] == e_UC_MEMBER) + $qry = 'SELECT user_id,user_name,user_email FROM `#user` WHERE '.$qry; + if (FALSE !== ($count = $e107->sql->db_Select_gen($qry))) { - $sql->db_Select('user', 'user_email', 'user_ban = 0'); - } - else - { - $sql->db_Select('user', 'user_email', "user_ban = 0 AND user_class REGEXP '(^|,)(".$this->notify_prefs['event'][$id]['class'].")(,|$)'"); - } - while ($email = $sql->db_Fetch()) - { - sendemail($email['user_email'], $tp->toEmail($subject), $tp->toEmail($message)); + if ($count <= 5) + { // Arbitrary number below which we send emails immediately + e107_require_once(e_HANDLER.'mail.php'); + while ($email = $e107->sql->db_Fetch()) + { + if ($email['user_email'] != $emailFilter) + { + sendemail($email['user_email'], $subject, $message, $email['user_name']); + } + } + } + else + { // Otherwise add to mailout queue + require(e_HANDLER.'mail_manager_class.php'); + $mailer = new e107MailManager; + + + // Start by creating the mail body + $mailData = array( + 'mail_content_status' => MAIL_STATUS_TEMP, + 'mail_create_app' => 'notify', + 'mail_title' => 'NOTIFY', + 'mail_subject' => $subject, + 'mail_sender_email' => $pref['siteadminemail'], + 'mail_sender_name' => $pref['siteadmin'], + 'mail_send_style' => 'textonly', + 'mail_body' => $message + ); + $result = $mailer->saveEmail($mailData, TRUE); + if (is_numeric($result)) + { + $mailMainID = $mailData['mail_source_id'] = $result; + } + else + { + // TODO: Handle error + return; // Probably nothing else we can do + } + $mailer->mailInitCounters($mailMainID); // Initialise counters for emails added + + // Now add email addresses to the list + while ($row = $e107->sql->db_Fetch(MYSQL_ASSOC)) + { + if ($row['user_email'] != $emailFilter) + { + $uTarget = array('mail_recipient_id' => $row['user_id'], + 'mail_recipient_name' => $row['user_name'], // Should this use realname? + 'mail_recipient_email' => $row['user_email'] + ); + $result = $mailer->mailAddNoDup($mailMainID, $uTarget, MAIL_STATUS_TEMP); + } + } + $mailer->mailUpdateCounters($mailMainID); // Update the counters + $counters = $mailer->mailRetrieveCounters($mailMainID); // Retrieve the counters + if ($counters['add'] == 0) + { + $mailer->deleteEmail($mailMainID); // Probably a fault, but precautionary - delete email + } + else + { + $mailer->activateEmail($mailMainID, FALSE); // Actually mark the email for sending + } + } + $e107->admin_log->e_log_event(10,-1,'NOTIFY',$subject,$message,FALSE,LOG_TO_ROLLING); } } - elseif ($this->notify_prefs['event'][$id]['class'] == 'email') - { - sendemail($this->notify_prefs['event'][$id]['email'], $tp->toEmail($subject), $tp->toEmail($message)); + elseif ($notifyTarget == 'email') + { // Single email address - that can always go immediately + e107_require_once(e_HANDLER.'mail.php'); + sendemail($this->notify_prefs['event'][$id]['email'], $subject, $message); } } } + + //DEPRECATED, BC, call the method only when needed, $e107->notify caught by __get() global $nt; $nt = e107::getNotify(); //TODO - find & replace $nt, $e107->notify @@ -145,16 +232,20 @@ function notify_subnews($data) function notify_newspost($data) { - global $nt; - $message = ''.$data['news_title'].'

'.$data['news_summary'].'

'.$data['data'].'

'.$data['news_extended']; - $nt->send('newspost', $data['news_title'], $message); + $message = ''.$data['news_title'].''; + if (vartrue($data['news_summary'])) $message .= '

'.$data['news_summary']; + if (vartrue($data['news_body'])) $message .= '

'.$data['news_body']; + if (vartrue($data['news_extended'])) $message.= '

'.$data['news_extended']; + e107::getNotify()->send('newspost', $data['news_title'], e107::getParser()->text_truncate(e107::getParser()->toDB($message), 400, '...')); } function notify_newsupd($data) { - global $nt; - $message = ''.$data['news_title'].'

'.$data['news_summary'].'

'.$data['data'].'

'.$data['news_extended']; - $nt->send('newsupd', NT_LAN_NU_1.': '.$data['news_title'], $message); + $message = ''.$data['news_title'].''; + if (vartrue($data['news_summary'])) $message .= '

'.$data['news_summary']; + if (vartrue($data['news_body'])) $message .= '

'.$data['news_body']; + if (vartrue($data['news_extended'])) $message.= '

'.$data['news_extended']; + e107::getNotify()->send('newsupd', NT_LAN_NU_1.': '.$data['news_title'], e107::getParser()->text_truncate(e107::getParser()->toDB($message), 400, '...')); } function notify_newsdel($data) diff --git a/e107_languages/English/admin/lan_mailout.php b/e107_languages/English/admin/lan_mailout.php index 849b16f73..5c9abb6c4 100644 --- a/e107_languages/English/admin/lan_mailout.php +++ b/e107_languages/English/admin/lan_mailout.php @@ -9,9 +9,9 @@ * Administration - Site Maintenance * * $Source: /cvs_backup/e107_0.8/e107_languages/English/admin/lan_mailout.php,v $ - * $Revision: 1.9 $ - * $Date: 2009-11-18 01:05:12 $ - * $Author: e107coders $ + * $Revision: 1.10 $ + * $Date: 2009-11-19 20:24:21 $ + * $Author: e107steved $ * */ define('LAN_MAILOUT_01','From Name'); @@ -235,7 +235,7 @@ define('LAN_MAILOUT_215', 'Saved'); define('LAN_MAILOUT_216', 'Code error'); define('LAN_MAILOUT_217', 'Held'); define('LAN_MAILOUT_218', 'Cancelled'); -define('LAN_MAILOUT_219', ''); +define('LAN_MAILOUT_219', 'Partial'); // General messages continued define('LAN_MAILOUT_220', 'Email ID --ID-- cancelled'); diff --git a/e107_plugins/newsletter/admin_config.php b/e107_plugins/newsletter/admin_config.php index 43a84f73f..3c2a46611 100644 --- a/e107_plugins/newsletter/admin_config.php +++ b/e107_plugins/newsletter/admin_config.php @@ -6,26 +6,28 @@ * Released under the terms and conditions of the * GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * - * + * Administration - Site Maintenance * * $Source: /cvs_backup/e107_0.8/e107_plugins/newsletter/admin_config.php,v $ - * $Revision: 1.11 $ - * $Date: 2009-11-18 01:05:53 $ - * $Author: e107coders $ - */ - + * $Revision: 1.12 $ + * $Date: 2009-11-19 20:24:21 $ + * $Author: e107steved $ + * +*/ require_once('../../class2.php'); -if (!getperms("P")) +if (!getperms('P')) { header('location:'.e_BASE.'index.php'); exit; } $e_sub_cat = 'newsletter'; -require_once(e_ADMIN."auth.php"); +require_once(e_ADMIN.'auth.php'); +// Include ren_help for display_help (while showing BBcodes) +require_once(e_HANDLER.'ren_help.php'); if (e_QUERY) { - list($action, $id, $key) = explode(".", e_QUERY); + list($action, $id, $key) = explode('.', e_QUERY); $key = intval($key); $id = intval($id); } @@ -46,7 +48,7 @@ else { switch ($action) { - case 'vs' : // View subscribers of a newsletter + case 'vs' : // View subscribers of a newsletter $nl -> view_subscribers($id); break; case 'remove' : // Remove subscriber @@ -54,10 +56,10 @@ else $nl -> view_subscribers($id); break; default: - $function = $action."Newsletter"; + $function = $action.'Newsletter'; if (method_exists($nl, $function)) { - $nl -> $function(); + $nl -> $function($id); } else { @@ -67,20 +69,19 @@ else } - class newsletter { + protected $e107; var $message; - - function newsletter() + public function __construct() { - global $ns, $tp; + $this->e107 = e107::getInstance(); foreach($_POST as $key => $value) { - $key = $tp->toDB($key); - if(strstr($key, "nlmailnow")) + $key = $this->e107->tp->toDB($key); + if(strpos($key, 'nlmailnow') === 0) { $this->releaseIssue($key); break; @@ -104,16 +105,15 @@ class newsletter if($this -> message) { - $ns->tablerender("", "
".$this -> message."
"); + $this->e107->ns->tablerender('', "
".$this -> message.'
'); } } function showExistingNewsletters() { - global $sql, $ns, $tp; - if(!$sql -> db_Select("newsletter", "*", "newsletter_parent='0' ORDER BY newsletter_id DESC")) + if(!$this->e107->sql->db_Select('newsletter', '*', "newsletter_parent='0' ORDER BY newsletter_id DESC")) { $text = NLLAN_05; } @@ -129,7 +129,7 @@ class newsletter "; - $nlArray = $sql -> db_getList(); + $nlArray = $this->e107->sql->db_getList(); foreach($nlArray as $data) { $text .= " @@ -138,7 +138,7 @@ class newsletter ".((substr_count($data['newsletter_subscribers'], chr(1))!= 0)?"".substr_count($data['newsletter_subscribers'], chr(1))."":substr_count($data['newsletter_subscribers'], chr(1)))." ".ADMIN_EDIT_ICON." - toJS(NLLAN_09." [ID: ".$data['newsletter_id']." ]")."') \"/> + e107->tp->toJS(NLLAN_09." [ID: ".$data['newsletter_id']." ]")."') \"/> @@ -150,10 +150,9 @@ class newsletter "; } - $ns -> tablerender(NLLAN_10, $text); + $this->e107->ns->tablerender(NLLAN_10, $text); - - if(!$sql -> db_Select("newsletter", "*", "newsletter_parent!='0' ORDER BY newsletter_id DESC")) + if(!$this->e107->sql->db_Select('newsletter', '*', "newsletter_parent!='0' ORDER BY newsletter_id DESC")) { $text = NLLAN_11; } @@ -170,7 +169,7 @@ class newsletter "; - $nlArray = $sql -> db_getList(); + $nlArray = $this->e107->sql->db_getList(); foreach($nlArray as $data) { @@ -178,10 +177,10 @@ class newsletter ".$data['newsletter_id']." ".$data['newsletter_issue']." [ ".$data['newsletter_parent']." ] ".$data['newsletter_title']." - ".($data['newsletter_flag'] ? NLLAN_16 : "toJS(NLLAN_18)."') \" />")." + ".($data['newsletter_flag'] ? NLLAN_16 : "e107->tp->toJS(NLLAN_18)."') \" />")." ".ADMIN_EDIT_ICON." - toJS(NLLAN_19." [ID: ".$data['newsletter_id']." ]")."') \"/> + e107->tp->toJS(NLLAN_19." [ID: ".$data['newsletter_id']." ]")."') \"/> @@ -193,23 +192,20 @@ class newsletter "; } - $ns -> tablerender(NLLAN_20, $text); + $this->e107->ns->tablerender(NLLAN_20, $text); } - function defineNewsletter($edit=FALSE) { - global $ns, $tp; // We've been passed a value from DB, so should be reasonably sanitised. - if($edit) { - $newsletter_title = $tp -> toFORM($edit['newsletter_title']); - $newsletter_text = $tp -> toFORM($edit['newsletter_text']); - $newsletter_footer = $tp -> toFORM($edit['newsletter_footer']); - $newsletter_header = $tp -> toFORM($edit['newsletter_header']); // Looks as if this was missed + $newsletter_title = $this->e107->tp->toFORM($edit['newsletter_title']); + $newsletter_text = $this->e107->tp->toFORM($edit['newsletter_text']); + $newsletter_footer = $this->e107->tp->toFORM($edit['newsletter_footer']); + $newsletter_header = $this->e107->tp->toFORM($edit['newsletter_header']); } $text .= "
@@ -245,29 +241,34 @@ class newsletter $caption = ($edit ? NLLAN_25 : NLLAN_26); - $ns -> tablerender($caption, $text); + $this->e107->ns->tablerender($caption, $text); } + /** + * Save entry for new newsletter in DB, using $_POST values + * + * @param int $_POST['editid'] - ID of newsletter if existing - indicates edit to be saved + * + * @return none + */ function createNewsletter() { - global $sql, $tp; - - $letter['newsletter_title'] = $tp -> toDB($_POST['newsletter_title']); - $letter['newsletter_text'] = $tp -> toDB($_POST['newsletter_text']); - $letter['newsletter_header'] = $tp -> toDB($_POST['newsletter_header']); - $letter['newsletter_footer'] = $tp -> toDB($_POST['newsletter_footer']); + $letter['newsletter_title'] = $this->e107->tp->toDB($_POST['newsletter_title']); + $letter['newsletter_text'] = $this->e107->tp->toDB($_POST['newsletter_text']); + $letter['newsletter_header'] = $this->e107->tp->toDB($_POST['newsletter_header']); + $letter['newsletter_footer'] = $this->e107->tp->toDB($_POST['newsletter_footer']); if(isset($_POST['editid'])) { - $sql -> db_Update("newsletter", "newsletter_title='{$letter['newsletter_title']}', newsletter_text='{$letter['newsletter_text']}', newsletter_header='{$letter['newsletter_header']}', newsletter_footer='{$letter['newsletter_footer']}' WHERE newsletter_id=".intval($_POST['editid'])); + $this->e107->sql -> db_Update('newsletter', "newsletter_title='{$letter['newsletter_title']}', newsletter_text='{$letter['newsletter_text']}', newsletter_header='{$letter['newsletter_header']}', newsletter_footer='{$letter['newsletter_footer']}' WHERE newsletter_id=".intval($_POST['editid'])); $this -> message = NLLAN_27; } else { $letter['newsletter_datestamp'] = time(); - $sql -> db_Insert('newsletter', $letter); + $this->e107->sql->db_Insert('newsletter', $letter); $this -> message = NLLAN_28; } } @@ -276,23 +277,21 @@ class newsletter function makeNewsletter($edit=FALSE) { - global $sql, $ns, $tp; - // Passed data is from DB if($edit) { - $newsletter_title = $tp -> toFORM($edit['newsletter_title']); - $newsletter_text = $tp -> toFORM($edit['newsletter_text']); - $newsletter_issue = $tp -> toFORM($edit['newsletter_issue']); + $newsletter_title = $this->e107->tp->toFORM($edit['newsletter_title']); + $newsletter_text = $this->e107->tp->toFORM($edit['newsletter_text']); + $newsletter_issue = $this->e107->tp->toFORM($edit['newsletter_issue']); } - if(!$sql -> db_Select("newsletter", "*", "newsletter_parent='0' ")) + if(!$this->e107->sql->db_Select('newsletter', '*', "newsletter_parent='0' ")) { - $this -> message = NLLAN_29; + $this -> message = NLLAN_05; return; } - $nlArray = $sql -> db_getList(); + $nlArray = $this->e107->sql -> db_getList(); $text .= "
@@ -322,7 +321,9 @@ class newsletter ".NLLAN_33." - + +
".display_help('helpa')." + @@ -337,141 +338,150 @@ class newsletter $caption = ($edit ? NLLAN_36 : NLLAN_37); - $ns -> tablerender($caption, $text); + $this->e107->ns->tablerender($caption, $text); } + function createIssue() { - global $sql, $tp; - $letter['newsletter_title'] = $tp -> toDB($_POST['newsletter_title']); - $letter['newsletter_text'] = $tp -> toDB($_POST['newsletter_text']); + $letter['newsletter_title'] = $this->e107->tp->toDB($_POST['newsletter_title']); + $letter['newsletter_text'] = $this->e107->tp->toDB($_POST['newsletter_text']); $letter['newsletter_parent'] = intval($_POST['newsletter_parent']); - $letter['newsletter_issue'] = $tp->toDB($_POST['newsletter_issue']); + $letter['newsletter_issue'] = $this->e107->tp->toDB($_POST['newsletter_issue']); if (isset($_POST['editid'])) { - $sql -> db_Update('newsletter', "newsletter_title='{$letter['newsletter_title']}', newsletter_text='{$letter['newsletter_text']}', newsletter_parent='".$letter['newsletter_parent']."', newsletter_issue='".$letter['newsletter_issue']."' WHERE newsletter_id=".intval($_POST['editid'])); + $this->e107->sql->db_Update('newsletter', "newsletter_title='{$letter['newsletter_title']}', newsletter_text='{$letter['newsletter_text']}', newsletter_parent='".$letter['newsletter_parent']."', newsletter_issue='".$letter['newsletter_issue']."' WHERE newsletter_id=".intval($_POST['editid'])); $this -> message = NLLAN_38; } else { $letter['newsletter_datestamp'] = time(); - $sql -> db_Insert('newsletter', $letter); + $this->e107->sql->db_Insert('newsletter', $letter); $this -> message = NLLAN_39; } } - + /** + * Actually release an issue of a newsletter + * Add the mailing to the mail queue + * + * @param int id of issue + * + * @return boolean FALSE on error + */ function releaseIssue($issue) { - global $pref, $sql, $ns, $tp, $THEMES_DIRECTORY; + global $pref; - $issue = str_replace("nlmailnow_", "", $issue); + $issue = intval(str_replace('nlmailnow_', '', $issue)); - if(!$sql -> db_Select("newsletter", "*", "newsletter_id='{$issue}' ")) + // Get details of current newsletter issue + if(!$this->e107->sql->db_Select('newsletter', '*', 'newsletter_id='.$issue)) { return FALSE; } - $newsletterInfo = $sql -> db_Fetch(); + $newsletterInfo = $this->e107->sql->db_Fetch(MYSQL_ASSOC); - if(!$sql -> db_Select("newsletter", "*", "newsletter_id='".$newsletterInfo['newsletter_parent']."' ")) + // Get parent details - has header/footer and subscriber list + if(!$this->e107->sql -> db_Select('newsletter', '*', "newsletter_id='".$newsletterInfo['newsletter_parent']."' ")) { return FALSE; } - $newsletterParentInfo = $sql -> db_Fetch(); + $newsletterParentInfo = $this->e107->sql->db_Fetch(MYSQL_ASSOC); $memberArray = explode(chr(1), $newsletterParentInfo['newsletter_subscribers']); - require(e_HANDLER."phpmailer/class.phpmailer.php"); + require(e_HANDLER.'mail_manager_class.php'); + $mailer = new e107MailManager; - $mail = new PHPMailer(); - $mail->From = $pref['siteadminemail']; - $mail->FromName = $pref['siteadmin']; - if ($pref['mailer'] == "smtp") + // Start by creating the mail body + $mailData = array( + 'mail_content_status' => MAIL_STATUS_TEMP, + 'mail_create_app' => 'newsletter', + 'mail_title' => NLLAN_01.' '.$issue, + 'mail_subject' => $newsletterParentInfo['newsletter_title'] .': '.$newsletterInfo['newsletter_title'], + 'mail_sender_email' => $pref['siteadminemail'], + 'mail_sender_name' => $pref['siteadmin'], + 'mail_send_style' => 'themehtml', + 'mail_include_images' => TRUE + ); + + + // Assemble body - we can leave a lot to to core mail sending routines + $mail_style = "
"; + $mail_style .= "
{$mailout['mail_subject']}
[ ".NLLAN_12." ".$newsletterInfo['newsletter_issue']." ]


"; + $mail_style .= "
"; + $mailData['mail_body'] = $mail_style.$newsletterParentInfo['newsletter_header']."
".$newsletterInfo['newsletter_text']."


".$newsletterParentInfo['newsletter_footer']."
"; + + $result = $mailer->saveEmail($mailData, TRUE); + if (is_numeric($result)) { - $mail->Mailer = "smtp"; - $mail->SMTPKeepAlive = (isset($pref['smtp_keepalive']) && $pref['smtp_keepalive']==1) ? TRUE : FALSE; - $mail->SMTPAuth = TRUE; - $mail->Username = $pref['smtp_username']; - $mail->Password = $pref['smtp_password']; - $mail->Host = $pref['smtp_server']; + $mailMainID = $mailData['mail_source_id'] = $result; } else { - $mail->Mailer = "mail"; + // TODO: Handle error } + - $mail->WordWrap = 50; - $mail->CharSet = 'utf-8'; - $mail->Subject = $newsletterParentInfo['newsletter_title'] . ": ".$newsletterInfo['newsletter_title']; - $mail->IsHTML(true); + $mailer->mailInitCounters($mailMainID); // Initialise counters for emails added - // ============================ Render Results and Mail it ========= - - $message_subject = stripslashes($tp -> toHTML($mail->Subject)); - $message_body = stripslashes($tp -> toHTML($mail->Subject, TRUE)); - $message_body = str_replace(""", '"', $tp -> toHTML($newsletterInfo['newsletter_text'], TRUE)); - $message_body = str_replace('src="', 'src="'.SITEURL, $message_body); - - $newsletter_header = $tp -> toHTML($newsletterParentInfo['newsletter_header'], TRUE); - $newsletter_footer = $tp -> toHTML($newsletterParentInfo['newsletter_footer'], TRUE); - - - $theme = $THEMES_DIRECTORY.$pref['sitetheme']."/"; - $mail_style = ""; - $mail_style .= "
"; - $mail_style .= "
"; - $mail_style .= "
$message_subject
[ ".NLLAN_12." ".$newsletterInfo['newsletter_issue']." ]


"; - $mail_style .= "
"; - $message_body = $mail_style.$newsletter_header."
".$message_body."


".$newsletter_footer."
"; - - $message_body = str_replace("\n", "
", $message_body); - - $mail->Body = $tp->toHTML($message_body, TRUE,'no_replace, emotes_off'); - $mail->AltBody = strip_tags(str_replace("
", "\n", $message_body)); - - $sent_counter = 0; + // Now add email addresses to the list foreach($memberArray as $memberID) { - if($memberID) + if ($memberID = intval($memberID)) { - if($sql -> db_Select("user", "user_name, user_email", "user_id='$memberID' ")) + if($this->e107->sql->db_Select('user', 'user_name,user_email,user_loginname,user_lastvisit', 'user_id='.$memberID)) { - $row = $sql -> db_Fetch(); - $mname = $row['user_name']; - $memail = $row['user_email']; - } - - $mail->AddAddress($memail, $mname); - - echo "".NLLAN_54." ".$mname." ( ".$memail." )
"; - - $mail->Send(); - $sent_counter ++; - - $mail->ClearAddresses(); - if ($pref['mailer'] == "smtp") { - $mail->SmtpClose(); + $row = $this->e107->sql->db_Fetch(MYSQL_ASSOC); + $uTarget = array('mail_recipient_id' => $memberID, + 'mail_recipient_name' => $row['user_name'], // Should this use realname? + 'mail_recipient_email' => $row['user_email'], + 'mail_target_info' => array( + 'USERID' => $memberID, + 'DISPLAYNAME' => $row['user_name'], + 'USERNAME' => $row['user_loginname'], + 'USERLASTVISIT' => $row['user_lastvisit'] + ) + ); // Probably overkill, but some user data in case we want to substitute } + $result = $mailer->mailAddNoDup($mailMainID, $uTarget, MAIL_STATUS_TEMP); + //echo ''.NLLAN_54.' '.$uTarget['mail_recipient_name'].' ( '.$uTarget['mail_recipient_email'].' )
'; } } - $sql -> db_Update("newsletter", "newsletter_flag='1' WHERE newsletter_id='$issue' "); - $this -> message = NLLAN_40.$sent_counter.NLLAN_41; + $mailer->mailUpdateCounters($mailMainID); // Update the counters + $counters = $mailer->mailRetrieveCounters($mailMainID); // Retrieve the counters + if ($counters['add'] == 0) + { + $mailer->deleteEmail($mailMainID); // No subscribers - delete email + $this->message = NLLAN_41; + } + else + { + $mailer->activateEmail($mailMainID, FALSE); // Actually mark the email for sending + $this->message = str_replace('--COUNT--', $counters['add'],NLLAN_40); + } + $this->e107->sql->db_Update('newsletter', "newsletter_flag='1' WHERE newsletter_id=".$issue); } - function editNewsletter() + /** + * Edit a newsletter + * + * @param $id int ID of newsletter to edit + * @return none + */ + function editNewsletter($id) { - global $id, $sql; - - if($sql -> db_Select("newsletter", "*", "newsletter_id='{$id}' ")) + if($this->e107->sql->db_Select("newsletter", "*", "newsletter_id='{$id}'")) { - $foo = $sql -> db_Fetch(); + $foo = $this->e107->sql->db_Fetch(); if(!$foo['newsletter_parent']) { $this -> defineNewsletter($foo); @@ -484,36 +494,41 @@ class newsletter } - + /** + * Delete a newsletter + * + * @return none + */ function deleteNewsletter() { - global $sql; $tmp = each($_POST['delete']); - if(strstr($tmp['key'], "newsletter")) + if(strpos($tmp['key'], 'newsletter') === 0) { - $id = str_replace("newsletter_", "", $tmp['key']); - $sql -> db_Delete("newsletter", "newsletter_id='{$id}' "); + $id = intval(str_replace('newsletter_', '', $tmp['key'])); + $this->e107->sql->db_Delete('newsletter', "newsletter_id='{$id}'"); $this -> message = NLLAN_42; } else { - $id = str_replace("issue_", "", $tmp['key']); - $sql -> db_Delete("newsletter", "newsletter_id='{$id}' "); + $id = intval(str_replace('issue_', '', $tmp['key'])); + $this->e107->sql->db_Delete('newsletter', "newsletter_id='{$id}' "); $this -> message = NLLAN_43; } } + /** + * Generate and display admin menu + * + * @return none + */ function show_options($action) { - global $sql; if ($action == "") { $action = "main"; } - // ##### Display options --------------------------------------------------------------------------------------------------------- - $var['main']['text'] = NLLAN_44; $var['main']['link'] = e_SELF; @@ -528,97 +543,107 @@ class newsletter - - function view_subscribers($p_id) - { - global $ns; - - $nl_sql = new db; - if(!$nl_sql -> db_Select('newsletter', '*', 'newsletter_id='.$p_id)) + function view_subscribers($p_id) { - // Check if newsletter id is available - $vs_text .= "

".NLLAN_56."

-
"; - $ns -> tablerender(NLLAN_58, $vs_text); - return; - } - else - { - $vs_text .= " - - - - - - - - "; - -// $nl_sql -> db_Select("newsletter", "*", "newsletter_id=".$p_id); Already done - if($nl_row = $nl_sql-> db_Fetch()) + $nl_sql = new db; + $_nl_sanatized = ''; + if(!$nl_sql -> db_Select('newsletter', '*', 'newsletter_id='.$p_id)) + { // Check if newsletter id is available + $vs_text .= "

".NLLAN_56."

+
"; + $ns -> tablerender(NLLAN_58, $vs_text); + return; + } + else { - $subscribers_list = explode(chr(1), trim($nl_row['newsletter_subscribers'])); - $subscribers_total_count = count($subscribers_list) - 1; // Get a null entry as well - } - if ($subscribers_total_count<1) - { - header("location:".e_SELF); - exit; - } - // Loop through each user in the array subscribers_list - foreach ($subscribers_list as $val) - { - $val=trim($val); - if ($val) + $vs_text .= " + +
".NLLAN_55."".NLLAN_59."".NLLAN_60."".NLLAN_61."
+ + + + + + "; + if($nl_row = $nl_sql-> db_Fetch()) { - $nl_sql -> db_Select("user", "*", "user_id=".$val); - if($nl_row = $nl_sql-> db_Fetch()) + $subscribers_list = explode(chr(1), trim($nl_row['newsletter_subscribers'])); + sort($subscriber_list); + $subscribers_total_count = count($subscribers_list) - 1; // Get a null entry as well + } + if ($subscribers_total_count<1) + { + header("location:".e_SELF); + exit; + } + // Loop through each user in the array subscribers_list & sanatize + $_last_subscriber = ''; + foreach ($subscribers_list as $val) + { + $val=trim($val); + if ($val) { - $vs_text .= " - - - - - "; + if ($val != $_last_subscriber) + { + $nl_sql -> db_Select("user", "*", "user_id=".$val); + if($nl_row = $nl_sql-> db_Fetch()) + { + $vs_text .= " + + + + + "; + $_last_subscriber = $val; + } + } + else + { // Duplicate user id found in the subscribers_list array! + newsletter::remove_subscribers($p_id, $val); // removes all entries for this user id + $newsletterArray[$p_id]['newsletter_subscribers'] = chr(1).$val; // keep this single value in the list + $nl_sql -> db_Update("newsletter", "newsletter_subscribers='".$newsletterArray[$p_id]['newsletter_subscribers']."' WHERE newsletter_id='".intval($p_id)."'"); + $subscribers_total_count --; + $_nl_sanatized = 1; + } } } } - } - $vs_text .= " - - - - -
".NLLAN_55."".NLLAN_59."".NLLAN_60."".NLLAN_61."
{$val} - ".$nl_row['user_name']." - ".$nl_row['user_email']." - ".ADMIN_DELETE_ICON." - ".(($nl_row['user_ban'] > 0) ? NLLAN_62 : "")." -
{$val} + ".$nl_row['user_name']." + ".$nl_row['user_email']." + ".ADMIN_DELETE_ICON." + ".(($nl_row['user_ban'] > 0) ? NLLAN_62 : "")." +
".NLLAN_63.": ".$subscribers_total_count."

- "; - $ns -> tablerender(NLLAN_65.' '.$p_id, $vs_text); - } - + $vs_text .= " + + ".NLLAN_63.": ".$subscribers_total_count." + +
+ + "; + if ($_nl_sanatized == 1) + { + $vs_text .= "
".NLLAN_66."
"; + } + $this->e107->ns->tablerender(NLLAN_65.' '.$p_id, $vs_text); + } + + function remove_subscribers($p_id, $p_key) { - global $sql; - $sql -> db_Select("newsletter", "*", "newsletter_id=".$p_id); - if($nl_row = $sql-> db_Fetch()) + $this->e107->sql -> db_Select('newsletter', '*', 'newsletter_id='.intval($p_id)); + if($nl_row = $this->e107->sql-> db_Fetch(MYSQL_ASSOC)) { $subscribers_list = array_flip(explode(chr(1), $nl_row['newsletter_subscribers'])); unset($subscribers_list[$p_key]); $new_subscriber_list = implode(chr(1), array_keys($subscribers_list)); - $sql -> db_Update("newsletter", "newsletter_subscribers='{$new_subscriber_list}' WHERE newsletter_id=".$p_id); + $this->e107->sql->db_Update('newsletter', "newsletter_subscribers='{$new_subscriber_list}' WHERE newsletter_id='".$p_id."'"); } } } - - -require_once(e_ADMIN."footer.php"); - +require_once(e_ADMIN.'footer.php'); function admin_config_adminmenu() { @@ -626,5 +651,4 @@ function admin_config_adminmenu() global $action; $nl->show_options($action); } - ?> \ No newline at end of file diff --git a/e107_plugins/newsletter/e_mailout.php b/e107_plugins/newsletter/e_mailout.php new file mode 100644 index 000000000..676db0579 --- /dev/null +++ b/e107_plugins/newsletter/e_mailout.php @@ -0,0 +1,212 @@ +e107 = e107::getInstance(); + if ($mailerAdminHandler == NULL) + { + global $mailAdmin; + $mailerAdminHandler = $mailAdmin; + } + $this->adminHandler = $mailerAdminHandler; + } + + + /** + * 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(); + 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) + { + 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.'
'; + if (!($this->e107->sql->db_Select_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() + { + if (!$this->selectorActive) return FALSE; + + while ($this->selectorActive) + { + if (count($this->targets) == 0) + { // Read in and process another newletter mailing list + if (!($row = $this->e107->sql->db_Fetch(MYSQL_ASSOC))) + { + $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->db_Select('user', 'user_name,user_email,user_lastvisit', '`user_id`='.$uid)) + { + $row = $this->ourDB->db_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 string Returns HTML which is displayed in a table cell. Typically we return a complete table + */ + public function showSelect($allow_edit = FALSE, $selectVals = FALSE) + { + $ret = ""; + $selects = array_flip(explode(',', $selectVals)); + + if ($this->e107->sql->db_Select('newsletter', 'newsletter_id, newsletter_title', '`newsletter_parent`=0')) + { + while ($row = $this->e107->sql->db_Fetch(MYSQL_ASSOC)) + { + $checked = (isset($selects[$row['newsletter_id']])) ? " checked='checked'" : ''; + if ($allow_edit) + { + $ret .= ""; + } + elseif($checked) + { + $ret .= ""; + } + } + } + else + { + $ret .= "'; + } + return $ret.'
+ ".$row['newsletter_title']."
".NLLAN_49." + ".$row['newsletter_title']."
".NLLAN_50.'
'; + } +} + + + +?> \ No newline at end of file diff --git a/e107_plugins/newsletter/languages/English.php b/e107_plugins/newsletter/languages/English.php index aea371c27..560ae2c07 100644 --- a/e107_plugins/newsletter/languages/English.php +++ b/e107_plugins/newsletter/languages/English.php @@ -6,87 +6,29 @@ * Released under the terms and conditions of the * GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * - * + * Plugin - newsfeeds * * $Source: /cvs_backup/e107_0.8/e107_plugins/newsletter/languages/English.php,v $ - * $Revision: 1.4 $ - * $Date: 2009-11-18 01:05:53 $ - * $Author: e107coders $ - */ + * $Revision: 1.5 $ + * $Date: 2009-11-19 20:24:21 $ + * $Author: e107steved $ + * +*/ -define("NLLAN_MENU_CAPTION", "Newsletter"); +define('NLLAN_MENU_CAPTION', 'Newsletter'); -define("NLLAN_01", "Newsletter"); -define("NLLAN_02", "Provides a quick and easy way to configure and send newsletters"); -define("NLLAN_03", "Configure Newsletters"); -define("NLLAN_04", "The newsletter plugin has been successfully installed. To configure, return to your main admin page and click on 'Newsletter' in the plugin section."); -define("NLLAN_05", "No newsletters defined yet"); +define('NLLAN_48', 'you are subscribed to this newsletter - if you wish to unsubscribe please click the button below.'); +define('NLLAN_49', 'Are you sure you want to un-subscribe from this newsletter?'); +define('NLLAN_50', 'Click button to subscribe ( your subscription address is'); +define('NLLAN_51', 'Unsubscribe'); +define('NLLAN_52', 'Subscribe'); +define('NLLAN_53', 'Are you sure you want to subscribe to this newsletter?'); -define("NLLAN_06", "Name"); -define("NLLAN_07", "Subscribers"); -define("NLLAN_08", "Options"); -define("NLLAN_09", "Are you sure you want to delete this newsletter?"); -define("NLLAN_10", "Existing Newsletters"); +define('NLLAN_67', 'Archive overview'); +define('NLLAN_68', 'Invalid parameter defined'); +define('NLLAN_69', 'No sent newsletters available.'); +define('NLLAN_70', 'Selected newsletter does not exist'); +define('NLLAN_71', 'Back'); +define('NLLAN_72', 'View archive'); -define("NLLAN_11", "No newsletter issues yet"); -define("NLLAN_12", "Issue"); -define("NLLAN_13", "[ Parent ID ] Subject/Title"); -define("NLLAN_14", "Mailed?"); -define("NLLAN_15", "Options"); -define("NLLAN_16", "yes"); -define("NLLAN_17", "Not sent out - click to send"); -define("NLLAN_18", "Are you sure you want to mail this issue to subscribers?"); -define("NLLAN_19", "Are you sure you want to delete this newsletter issue?"); -define("NLLAN_20", "Existing Issues"); -define("NLLAN_21", "Title"); -define("NLLAN_22", "Description"); -define("NLLAN_23", "Header"); -define("NLLAN_24", "Footer"); -define("NLLAN_25", "Update Newsletter"); -define("NLLAN_26", "Create Newsletter"); -define("NLLAN_27", "Newsletter updated in database."); -define("NLLAN_28", "Newsletter defined and saved in database."); -define("NLLAN_29", "No newsletters defined yet."); -define("NLLAN_30", "Newsletter"); -define("NLLAN_31", "Subject / Title"); -define("NLLAN_32", "Issue Number"); -define("NLLAN_33", "Text"); -define("NLLAN_34", "Update Mailing"); -define("NLLAN_35", "Create Mailing"); -define("NLLAN_36", "Update Newsletter Issue"); -define("NLLAN_37", "Create Newsletter Issue"); -define("NLLAN_38", "Newsletter updated in database."); -define("NLLAN_39", "Newsletter issue saved in database - to send out, click the 'Release Issue' button in the Options menu."); -define("NLLAN_40", "Mailout completed - issue sent to "); - -define("NLLAN_41", " subscriber(s)."); -define("NLLAN_42", "Newsletter deleted."); -define("NLLAN_43", "Newsletter issue deleted."); - -define("NLLAN_44", "Newsletter Front Page"); -define("NLLAN_45", "Create Newsletter"); -define("NLLAN_46", "Create mailing"); -define("NLLAN_47", "Newsletter Options"); - -define("NLLAN_48", "you are subscribed to this newsletter - if you wish to unsubscribe please click the button below."); -define("NLLAN_49", "Are you sure you want to un-subscribe from this newsletter?"); -define("NLLAN_50", "Click button to subscribe ( your subscription address is"); -define("NLLAN_51", "Unsubscribe"); -define("NLLAN_52", "Subscribe"); -define("NLLAN_53", "Are you sure you want to subscribe to this newsletter?"); - -define("NLLAN_54", "Sending"); - -define("NLLAN_55", "ID"); -define("NLLAN_56", "Newsletter ID not available"); -define("NLLAN_57", "Return to previous page"); -define("NLLAN_58", "Error"); -define("NLLAN_59", "Name"); -define("NLLAN_60", "Email"); -define("NLLAN_61", "Actions"); -define("NLLAN_62", "User is banned! (or not fully signed up)"); -define("NLLAN_63", "Total subscribers"); -define("NLLAN_64", "Return to Newsletter frontpage"); -define("NLLAN_65", "Subscribers overview newsletter ID"); - -?> \ No newline at end of file +?> diff --git a/e107_plugins/newsletter/languages/English_admin_newsletter.php b/e107_plugins/newsletter/languages/English_admin_newsletter.php new file mode 100644 index 000000000..70124a0de --- /dev/null +++ b/e107_plugins/newsletter/languages/English_admin_newsletter.php @@ -0,0 +1,87 @@ + diff --git a/e107_plugins/newsletter/newsletter_menu.php b/e107_plugins/newsletter/newsletter_menu.php index 657a30b31..8636ae4be 100644 --- a/e107_plugins/newsletter/newsletter_menu.php +++ b/e107_plugins/newsletter/newsletter_menu.php @@ -6,40 +6,56 @@ * Released under the terms and conditions of the * GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * - * + * Administration - Site Maintenance * * $Source: /cvs_backup/e107_0.8/e107_plugins/newsletter/newsletter_menu.php,v $ - * $Revision: 1.3 $ - * $Date: 2009-11-18 01:05:53 $ - * $Author: e107coders $ - */ + * $Revision: 1.4 $ + * $Date: 2009-11-19 20:24:21 $ + * $Author: e107steved $ + * +*/ if (!defined('e107_INIT')) { exit; } - -if(!USER || !$sql -> db_Select("newsletter", "*", "newsletter_parent='0' ")) +if (!$e107->isInstalled('newsletter')) { - // no newsletters defined yet // + return; +} + +if(!USER || !$sql -> db_Select('newsletter', '*', "newsletter_parent='0'")) +{ // no newsletters defined yet return FALSE; } $newsletterArray = $sql -> db_getList(); $requery = false; +include_lan(e_PLUGIN.'newsletter/languages/'.e_LANGUAGE.'.php'); foreach($_POST as $key => $value) { - if(strstr($key, "nlUnsubscribe_")) + if(strpos($key, 'nlUnsubscribe_') === 0) { - $subid = str_replace("nlUnsubscribe_", "", $key); + $subid = str_replace('nlUnsubscribe_', '', $key); $newsletterArray[$subid]['newsletter_subscribers'] = str_replace(chr(1).USERID, "", $newsletterArray[$subid]['newsletter_subscribers']); - $sql -> db_Update("newsletter", "newsletter_subscribers='".$newsletterArray[$subid]['newsletter_subscribers']."' WHERE newsletter_id='".intval($subid)."' "); + $sql -> db_Update('newsletter', "newsletter_subscribers='".$newsletterArray[$subid]['newsletter_subscribers']."' WHERE newsletter_id='".intval($subid)."' "); $requery = true; } - else if(strstr($key, "nlSubscribe_")) + else if(strpos($key, 'nlSubscribe_') === 0) { $subid = str_replace("nlSubscribe_", "", $key); - $newsletterArray[$subid]['newsletter_subscribers'] .= chr(1).USERID; - $sql -> db_Update("newsletter", "newsletter_subscribers='".$newsletterArray[$subid]['newsletter_subscribers']."' WHERE newsletter_id='".intval($subid)."' "); - $requery = true; + $nl_subscriber_array = $newsletterArray[$subid]['newsletter_subscribers']; + if (!array_key_exists(USERID, $nl_subscriber_array)) + { // prevent double entry of same user id + $newsletterArray[$subid]['newsletter_subscribers'] .= chr(1).USERID; + $subscribers_list = array_flip(explode(chr(1), $newsletterArray[$subid]['newsletter_subscribers'])); + sort($subscribers_list); + $new_subscriber_list = implode(chr(1), array_keys($subscribers_list)); + if (substr($new_subscriber_list, 0, 1) == '0') + { // remove the possible zero caused by function array_flip + $new_subscriber_list = substr($new_subscriber_list, 1); + } + $sql -> db_Update('newsletter', "newsletter_subscribers='".$new_subscriber_list."' WHERE newsletter_id='".intval($subid)."' "); + $requery = true; + } } } @@ -47,13 +63,13 @@ global $tp; if($requery) { - if($sql -> db_Select("newsletter", "*", "newsletter_parent='0' ")) + if($sql -> db_Select('newsletter', '*', "newsletter_parent='0' ")) { $newsletterArray = $sql -> db_getList(); } } -$text = ""; +$text = ''; foreach($newsletterArray as $nl) { $text .= "
@@ -72,10 +88,15 @@ foreach($newsletterArray as $nl) } else { - $text .= NLLAN_50." ".USEREMAIL." ) ...

+ $text .= NLLAN_50." ".USEREMAIL." )

toJS(NLLAN_53)."') \" /> "; } + $nl_count = $sql -> db_Count('newsletter', "(*)", "WHERE newsletter_parent='".$nl['newsletter_id']."' AND newsletter_flag='1'"); + if($nl_count > 0 && USER) + { // display issued newsletters + $text .= "
".NLLAN_72."

"; + } $text .= "

@@ -83,6 +104,4 @@ foreach($newsletterArray as $nl) } $ns -> tablerender(NLLAN_MENU_CAPTION, $text); - - ?> \ No newline at end of file diff --git a/e107_plugins/newsletter/newsletter_sql.php b/e107_plugins/newsletter/newsletter_sql.php new file mode 100644 index 000000000..e23a16de1 --- /dev/null +++ b/e107_plugins/newsletter/newsletter_sql.php @@ -0,0 +1,13 @@ +CREATE TABLE newsletter ( + newsletter_id int(10) unsigned NOT NULL auto_increment, + newsletter_datestamp int(10) unsigned NOT NULL, + newsletter_title varchar(200) NOT NULL, + newsletter_text text NOT NULL, + newsletter_header text NOT NULL, + newsletter_footer text NOT NULL, + newsletter_subscribers text NOT NULL, + newsletter_parent int(11) NOT NULL, + newsletter_flag tinyint(4) NOT NULL, + newsletter_issue varchar(100) NOT NULL, + PRIMARY KEY (newsletter_id) +) TYPE=MyISAM; \ No newline at end of file diff --git a/e107_plugins/newsletter/nl_archive.php b/e107_plugins/newsletter/nl_archive.php new file mode 100644 index 000000000..9c6627088 --- /dev/null +++ b/e107_plugins/newsletter/nl_archive.php @@ -0,0 +1,139 @@ +isInstalled('newsletter') || !ADMIN) +{ + header('Location: '.e_BASE.'index.php'); + exit(); +} +include_lan(e_PLUGIN.'newsletter/languages/'.e_LANGUAGE.'.php'); +require_once(HEADERF); + +$action_parent_id = 0; +$action_nl_id = 0; +if(e_QUERY) +{ + $tmp = explode('.', e_QUERY); + $action = $tmp[0]; + $action_parent_id = varset(intval($tmp[1], 0)); + $action_nl_id = varset(intval($tmp[2], 0)); + unset($tmp); +} + +$page_size = 10; // Might become a preference setting later on +$text .= "
"; + +if (($action <> 'show' && $action <> 'showp') || ($action_parent_id == 0)) +{ // Action 'show' displays initial page, 'showp' displays following pages + $text .= NLLAN_68; // Invalid parameter defined +} +else +{ + if(!isset($_POST['limit_start'])) + { + $limit_start = 0; + } + else + { + $limit_start = $_POST['limit_start']; + } + $nl_count = $e107->sql->db_Count('newsletter', '(*)', "WHERE newsletter_parent='".$action_parent_id."' AND newsletter_flag='1'"); + if ($nl_count > 0) + { + // Retrieve parent info + $e107->sql->db_Select('newsletter', "*", "newsletter_id='".$action_parent_id."'"); + if ($row = $e107->sql->db_Fetch()) + { + $parent_newsletter_title = $tp->toHTML($row['newsletter_title'],true); + $parent_newsletter_text = $tp->toHTML($row['newsletter_text'],true); + $parent_newsletter_header = $tp->toHTML($row['newsletter_header'],true); + $parent_newsletter_footer = $tp->toHTML($row['newsletter_footer'],true); + } + if ($action_nl_id == '' || $action_nl_id == 0) //Show list of sent newsletters + { + // Display parent name + $text .= "{$parent_newsletter_title}
+
{$parent_newsletter_text}


+ "; + + // Display list of sent newsletters titles + if ($action == 'showp') + { // This should only be done when action is 'showp' + $limit_start = $limit_start + $page_size; + } + $e107->sql->db_Select('newsletter', '*', "newsletter_parent='".$action_parent_id."' AND newsletter_flag='1' ORDER BY newsletter_datestamp DESC LIMIT ".$limit_start.",".$page_size); + while ($row = $e107->sql->db_Fetch()) + { + $ga = new convert(); + $newsletter_datestamp = $ga->convert_date($row['newsletter_datestamp'], 'long'); + $text .= " + + + + "; + } + $text .= "
+ ".$row['newsletter_issue']." + + ".$tp->toHTML($row['newsletter_title'],true)." + + ".$newsletter_datestamp." +
"; + if($limit_start + $page_size < $nl_count) + { + $text .= "
+
+
"; + } + } + else // Show requested newsletter + { + $e107->sql->db_Select('newsletter', '*', "newsletter_parent='".$action_parent_id."' AND newsletter_id='".$action_nl_id."' AND newsletter_flag='1'"); + if ($row = $e107->sql->db_Fetch()) + { + // Display parent header + $text .= "$parent_newsletter_title
+
$parent_newsletter_text


+ $parent_newsletter_header

"; + // Display newsletter text + $ga = new convert(); + $newsletter_datestamp = $ga->convert_date($row['newsletter_datestamp'], "long"); + $text .= $newsletter_datestamp."
". + $tp->toHTML($row['newsletter_title'],true)."
+
".$tp->toHTML($row['newsletter_text'],true)."


"; + // Display parent footer + $text .= "$parent_newsletter_footer
"; + // Display back to newsletter overview button + $text .= "
"; + } + else + { + $text .= NLLAN_70; //Selected newsletter does not exist + } + } + } + else + { + $text .= NLLAN_69; // No send newsletters available for selected parent + } +} + +$text .= "
"; + +$ns -> tablerender(NLLAN_67, $text); +require_once(FOOTERF); +?> \ No newline at end of file diff --git a/e107_plugins/newsletter/plugin.php b/e107_plugins/newsletter/plugin.php deleted file mode 100644 index 854fbe628..000000000 --- a/e107_plugins/newsletter/plugin.php +++ /dev/null @@ -1,78 +0,0 @@ - \ No newline at end of file diff --git a/e107_plugins/newsletter/plugin.xml b/e107_plugins/newsletter/plugin.xml new file mode 100644 index 000000000..876b3b408 --- /dev/null +++ b/e107_plugins/newsletter/plugin.xml @@ -0,0 +1,19 @@ + + + + + + + + NLLAN_02 + newsletter + Copyright e107 Inc e107.org, Licensed under GPL (http://www.gnu.org/licenses/gpl.txt) + content + + + + + NLLAN_03 + + + \ No newline at end of file