public function report() { $data = Newsletter::get(FALSE); $html = '<table> <tr> <th>nome</th> <th>email</th> </tr>'; foreach ($data as $row) { $html .= "<tr>\n\t\t\t\t\t\t\t<td>{$row->name}</td>\n\t\t\t\t\t\t\t<td>{$row->email}</td>\n\t\t\t\t\t\t</tr>"; } $html .= '</table><script type="text/javascript"><!--window.close()--></script>'; header("Content-type: application/vnd.ms-excel"); header("Content-Disposition: attachment;Filename=relatorio_newsletter" . date('Y_m_d_-_H_i_s') . ".xls"); echo $html; }
/** * Creates a newsletter job * @param $name string Specifies the name of the newsletter, the same name may be used more than once * @param $idnews integer Newsletter id */ public function create($iIDNews, $iIDCatArt, $sName = "") { global $client, $lang, $cfg, $cfgClient, $auth; $oNewsletter = new Newsletter(); if ($oNewsletter->loadByPrimaryKey($iIDNews)) { $iIDNews = Contenido_Security::toInteger($iIDNews); $iIDCatArt = Contenido_Security::toInteger($iIDCatArt); $lang = Contenido_Security::toInteger($lang); $client = Contenido_Security::toInteger($client); $sName = Contenido_Security::escapeDB($sName, null); $oItem = parent::create(); $oItem->set("idnews", $iIDNews); $oItem->set("idclient", $client); $oItem->set("idlang", $lang); if ($sName == "") { $oItem->set("name", $oNewsletter->get("name")); } else { $oItem->set("name", $sName); } $oItem->set("type", $oNewsletter->get("type")); $oItem->set("use_cronjob", $oNewsletter->get("use_cronjob")); $oLang = new cApiLanguage($lang); $oItem->set("encoding", $oLang->get("encoding")); unset($oLang); $oItem->set("idart", $oNewsletter->get("idart")); $oItem->set("subject", $oNewsletter->get("subject")); // Precompile messages #$sPath = $cfgClient[$client]["path"]["htmlpath"]."front_content.php?changelang=".$lang."&idcatart=".$iIDCatArt."&"; $sPath = Contenido_Url::getInstance()->build(array('idcatart' => $iIDCatArt, 'client' => $client, 'lang' => $lang), true); $sPath .= strpos($sPath, '?') === false ? '?' : '&'; $sMessageText = $oNewsletter->get("message"); // Preventing double lines in mail, you may wish to disable this function on windows servers if (!getSystemProperty("newsletter", "disable-rn-replacement")) { $sMessageText = str_replace("\r\n", "\n", $sMessageText); } $oNewsletter->_replaceTag($sMessageText, false, "unsubscribe", $sPath . "unsubscribe={KEY}"); $oNewsletter->_replaceTag($sMessageText, false, "change", $sPath . "change={KEY}"); $oNewsletter->_replaceTag($sMessageText, false, "stop", $sPath . "stop={KEY}"); $oNewsletter->_replaceTag($sMessageText, false, "goon", $sPath . "goon={KEY}"); $oItem->set("message_text", $sMessageText); if ($oNewsletter->get("type") == "text") { // Text newsletter, no html message $sMessageHTML = ""; } else { // HTML newsletter, get article content $sMessageHTML = $oNewsletter->getHTMLMessage(); if ($sMessageHTML) { $oNewsletter->_replaceTag($sMessageHTML, true, "name", "MAIL_NAME"); $oNewsletter->_replaceTag($sMessageHTML, true, "number", "MAIL_NUMBER"); $oNewsletter->_replaceTag($sMessageHTML, true, "date", "MAIL_DATE"); $oNewsletter->_replaceTag($sMessageHTML, true, "time", "MAIL_TIME"); $oNewsletter->_replaceTag($sMessageHTML, true, "unsubscribe", $sPath . "unsubscribe={KEY}"); $oNewsletter->_replaceTag($sMessageHTML, true, "change", $sPath . "change={KEY}"); $oNewsletter->_replaceTag($sMessageHTML, true, "stop", $sPath . "stop={KEY}"); $oNewsletter->_replaceTag($sMessageHTML, true, "goon", $sPath . "goon={KEY}"); // Replace plugin tags by simple MAIL_ tags if (getSystemProperty("newsletter", "newsletter-recipients-plugin") == "true") { if (is_array($cfg['plugins']['recipients'])) { foreach ($cfg['plugins']['recipients'] as $sPlugin) { plugin_include("recipients", $sPlugin . "/" . $sPlugin . ".php"); if (function_exists("recipients_" . $sPlugin . "_wantedVariables")) { $aPluginVars = array(); $aPluginVars = call_user_func("recipients_" . $sPlugin . "_wantedVariables"); foreach ($aPluginVars as $sPluginVar) { $oNewsletter->_replaceTag($sMessageHTML, true, $sPluginVar, "MAIL_" . strtoupper($sPluginVar)); } } } } } } else { // There was a problem getting html message (maybe article deleted) // Cancel job generation return false; } } $oItem->set("message_html", $sMessageHTML); $oItem->set("newsfrom", $oNewsletter->get("newsfrom")); if ($oNewsletter->get("newsfromname") == "") { $oItem->set("newsfromname", $oNewsletter->get("newsfrom")); } else { $oItem->set("newsfromname", $oNewsletter->get("newsfromname")); } $oItem->set("newsdate", date("Y-m-d H:i:s"), false); //$oNewsletter->get("newsdate")); $oItem->set("dispatch", $oNewsletter->get("dispatch")); $oItem->set("dispatch_count", $oNewsletter->get("dispatch_count")); $oItem->set("dispatch_delay", $oNewsletter->get("dispatch_delay")); // Store "send to" info in serialized array (just info) $aSendInfo = array(); $aSendInfo[] = $oNewsletter->get("send_to"); switch ($oNewsletter->get("send_to")) { case "selection": $oGroups = new RecipientGroupCollection(); $oGroups->setWhere("idnewsgroup", unserialize($oNewsletter->get("send_ids")), "IN"); $oGroups->setOrder("groupname"); $oGroups->query(); #$oGroups->select("idnewsgroup IN ('" . implode("','", unserialize($oNewsletter->get("send_ids"))) . "')", "", "groupname"); while ($oGroup = $oGroups->next()) { $aSendInfo[] = $oGroup->get("groupname"); } unset($oGroup); unset($oGroups); break; case "single": if (is_numeric($oNewsletter->get("send_ids"))) { $oRcp = new Recipient($oNewsletter->get("send_ids")); if ($oRcp->get("name") == "") { $aSendInfo[] = $oRcp->get("email"); } else { $aSendInfo[] = $oRcp->get("name"); } $aSendInfo[] = $oRcp->get("email"); unset($oRcp); } break; default: } $oItem->set("send_to", serialize($aSendInfo), false); $oItem->set("created", date("Y-m-d H:i:s"), false); $oItem->set("author", $auth->auth["uid"]); $oItem->set("authorname", $auth->auth["uname"]); unset($oNewsletter); // Not needed anymore // Adds log items for all recipients and returns recipient count $oLogs = new cNewsletterLogCollection(); $iRecipientCount = $oLogs->initializeJob($oItem->get($oItem->primaryKey), $iIDNews); unset($oLogs); $oItem->set("rcpcount", $iRecipientCount); $oItem->set("sendcount", 0); $oItem->set("status", 1); // Waiting for sending; note, that status will be set to 9, if $iRecipientCount = 0 in store() method $oItem->store(); return $oItem; } else { return false; } }
public function doSaveAsNew($data, $form) { $originalID = $data['NEWSLETTER_ORIGINAL_ID']; $origNewsletter = DataObject::get_by_id("Newsletter", $originalID); $controller = Controller::curr(); try { $newNewsletter = clone $origNewsletter; //unset doesn't work, set system used fields to nulls. $newNewsletter->ID = null; $newNewsletter->Created = null; $newNewsletter->Status = null; $newNewsletter->LastEdited = null; $newNewsletter->SentDate = null; //write once without validation Newsletter::set_validation_enabled(false); //save once to get the new Newsletter created so as to add to mailing list $newNewsletter->write($showDebug = false, $forceInsert = true); $origMailinglists = $origNewsletter->MailingLists(); if ($origMailinglists && $origMailinglists->count()) { $newNewsletter->MailingLists()->addMany($origMailinglists); } Newsletter::set_validation_enabled(true); $newNewsletter->Status = 'Draft'; //custom: changing the status of to indicate we are sending //add a (1) (2) count to new newsletter names if the subject name already exists elsewhere $subjectCount = 0; $newSubject = $newNewsletter->Subject; do { if ($subjectCount > 0) { $newSubject = $newNewsletter->Subject . " ({$subjectCount})"; } $existingSubjectCount = Newsletter::get()->filter(array('Subject' => $newSubject))->count(); $subjectCount++; } while ($existingSubjectCount != 0); $newNewsletter->Subject = $newSubject; $newNewsletter->write(); } catch (ValidationException $e) { $form->sessionMessage($e->getResult()->message(), 'bad'); $responseNegotiator = new PjaxResponseNegotiator(array('CurrentForm' => function () use(&$form) { return $form->forTemplate(); }, 'default' => function () use(&$controller) { return $controller->redirectBack(); })); if ($controller->getRequest()->isAjax()) { $controller->getRequest()->addHeader('X-Pjax', 'CurrentForm'); } return $responseNegotiator->respond($controller->getRequest()); } $form->sessionMessage(_t('NewsletterAdmin.SaveAsNewMessage', 'New Newsletter created as copy of the sent newsletter'), 'good'); //create a link to the newly created object and open that instead of the old sent newsletter we had open before $link = Controller::join_links($this->gridField->Link('item'), $newNewsletter->ID ? $newNewsletter->ID : 'new'); $link = str_replace('_Sent', '', $link); return Controller::curr()->redirect($link); }
function Newsletter() { if ($this->newsletterID) { return Newsletter::get()->byID($this->newsletterID); } }
/** * Gets all active recipients as specified for the newsletter and adds for * every recipient a log item * @param integer $idnewsjob ID of corresponding newsletter dispatch job * @param integer $idnews ID of newsletter * @return integer Recipient count */ public function initializeJob($idnewsjob, $idnews) { global $cfg; $idnewsjob = Contenido_Security::toInteger($idnewsjob); $idnews = Contenido_Security::toInteger($idnews); $oNewsletter = new Newsletter(); if ($oNewsletter->loadByPrimaryKey($idnews)) { $sDestination = $oNewsletter->get("send_to"); $iIDClient = $oNewsletter->get("idclient"); $iIDLang = $oNewsletter->get("idlang"); switch ($sDestination) { case "all": $sDistinct = ""; $sFrom = ""; $sSQL = "deactivated='0' AND confirmed='1' AND idclient='" . $iIDClient . "' AND idlang='" . $iIDLang . "'"; break; case "default": $sDistinct = "distinct"; $sFrom = $cfg["tab"]["news_groups"] . " AS groups, " . $cfg["tab"]["news_groupmembers"] . " AS groupmembers "; $sSQL = "recipientcollection.idclient = '" . $iIDClient . "' AND " . "recipientcollection.idlang = '" . $iIDLang . "' AND " . "recipientcollection.deactivated = '0' AND " . "recipientcollection.confirmed = '1' AND " . "recipientcollection.idnewsrcp = groupmembers.idnewsrcp AND " . "groupmembers.idnewsgroup = groups.idnewsgroup AND " . "groups.defaultgroup = '1' AND groups.idclient = '" . $iIDClient . "' AND " . "groups.idlang = '" . $iIDLang . "'"; break; case "selection": $aGroups = unserialize($oNewsletter->get("send_ids")); if (is_array($aGroups) && count($aGroups) > 0) { $sGroups = "'" . implode("','", $aGroups) . "'"; $sDistinct = "distinct"; $sFrom = $cfg["tab"]["news_groupmembers"] . " AS groupmembers "; $sSQL = "recipientcollection.idclient = '" . $iIDClient . "' AND " . "recipientcollection.idlang = '" . $iIDLang . "' AND " . "recipientcollection.deactivated = '0' AND " . "recipientcollection.confirmed = '1' AND " . "recipientcollection.idnewsrcp = groupmembers.idnewsrcp AND " . "groupmembers.idnewsgroup IN (" . $sGroups . ")"; } else { $sDestination = "unknown"; } break; case "single": $iID = $oNewsletter->get("send_ids"); if (is_numeric($iID)) { $sDistinct = ""; $sFrom = ""; $sSQL = "idnewsrcp = '" . $iID . "'"; } else { $sDestination = "unknown"; } break; default: $sDestination = "unknown"; } unset($oNewsletter); if ($sDestination == "unknown") { return 0; } else { $oRecipients = new RecipientCollection(); $oRecipients->flexSelect($sDistinct, $sFrom, $sSQL, "", "", ""); $iRecipients = $oRecipients->count(); while ($oRecipient = $oRecipients->next()) { $this->create($idnewsjob, $oRecipient->get($oRecipient->primaryKey)); } return $iRecipients; } } else { return 0; } }
function processQueue($newsletterID, $lockFile) { set_time_limit(0); //no time limit for running process if (!empty($newsletterID)) { $newsletter = Newsletter::get()->byID($newsletterID); if (!empty($newsletter)) { //try to clean up any stuck items $this->cleanUpStalledQueue($newsletterID); // Start a transaction $conn = DB::getConn(); if ($conn->supportsTransactions()) { $conn->transactionStart(); } $queueItemsList = array(); try { //get the first X items to process $queueItems = SendRecipientQueue::get()->filter(array('NewsletterID' => $newsletterID, 'Status' => 'Scheduled'))->sort('Created ASC')->limit(self::$items_to_batch_process); //set them all to "in process" at once foreach ($queueItems as $item) { $item->Status = 'InProgress'; $queueItemsList[] = $item->write(); } // Commit transaction if ($conn->supportsTransactions()) { $conn->transactionEnd(); } } catch (Exception $e) { // Rollback if ($conn->supportsTransactions()) { $conn->transactionRollback(); } //retry the processing SS_Log::log(new Exception("newsletter send out restart because of error"), SS_Log::ERR); $this->processQueueOnShutdown($newsletterID); } //fetch the queue items from the database again (after writing in-process to them) $queueItems2 = null; if (!empty($queueItemsList)) { $queueItems2 = SendRecipientQueue::get()->filter(array('ID' => $queueItemsList)); } //do the actual mail out if (!empty($queueItems2) && $queueItems2->count() > 0) { //fetch all the recipients at once in one query $recipients = Recipient::get()->filter(array('ID' => $queueItems2->column('RecipientID'))); if ($recipients->count() > 0) { $recipientsMap = array(); foreach ($recipients as $r) { $recipientsMap[$r->ID] = $r; } //send out the mails foreach ($queueItems2 as $item) { try { $item->send($newsletter, $recipientsMap[$item->RecipientID]); } catch (Exception $e) { $item->Status = 'Failed'; $item->write(); } } } unlink($lockFile); //do more processing, in case there are more items to process, do nothing if we've reached the end $this->processQueueOnShutdown($newsletterID); //wait to avoid overloading the email server with too many emails that look like spam if (!empty(self::$throttle_batch_delay)) { sleep(self::$throttle_batch_delay); } } else { //mark the send process as complete $newsletter->SentDate = SS_Datetime::now()->getValue(); $newsletter->Status = 'Sent'; $newsletter->write(); unlink($lockFile); } } } }
/** * Duplicates the newsletter specified by $itemID * @param $itemID integer specifies the newsletter id */ public function duplicate($iItemID) { global $client, $lang, $auth; $client = Contenido_Security::toInteger($client); $lang = Contenido_Security::toInteger($lang); cInclude("includes", "functions.con.php"); $oBaseItem = new Newsletter(); $oBaseItem->loadByPrimaryKey($iItemID); $oItem = parent::create(); $oItem->set("name", $oBaseItem->get("name") . "_" . substr(md5(rand()), 0, 10)); $iIDArt = 0; if ($oBaseItem->get("type") == "html" && $oBaseItem->get("idart") > 0 && $oBaseItem->get("template_idart") > 0) { $oClientLang = new cApiClientLanguage(false, $client, $lang); if ($oClientLang->getProperty("newsletter", "html_newsletter") == "true") { $iIDArt = conCopyArticle($oBaseItem->get("idart"), $oClientLang->getProperty("newsletter", "html_newsletter_idcat"), sprintf(i18n("Newsletter: %s", $plugin_name), $oItem->get("name"))); conMakeOnline($iIDArt, $lang); // Article has to be online for sending... } unset($oClientLang); } $oItem->set("idart", $iIDArt); $oItem->set("template_idart", $oBaseItem->get("template_idart")); $oItem->set("idclient", $client); $oItem->set("idlang", $lang); $oItem->set("welcome", 0); $oItem->set("type", $oBaseItem->get("type")); $oItem->set("subject", $oBaseItem->get("subject")); $oItem->set("message", $oBaseItem->get("message")); $oItem->set("newsfrom", $oBaseItem->get("newsfrom")); $oItem->set("newsfromname", $oBaseItem->get("newsfromname")); $oItem->set("newsdate", date("Y-m-d H:i:s"), false); // But more or less deprecated $oItem->set("use_cronjob", $oBaseItem->get("use_cronjob")); $oItem->set("send_to", $oBaseItem->get("send_to")); $oItem->set("send_ids", $oBaseItem->get("send_ids")); $oItem->set("dispatch", $oBaseItem->get("dispatch")); $oItem->set("dispatch_count", $oBaseItem->get("dispatch_count")); $oItem->set("dispatch_delay", $oBaseItem->get("dispatch_delay")); $oItem->set("author", $auth->auth["uid"]); $oItem->set("created", date("Y-m-d H:i:s"), false); // Copy properties, runtime on-demand allocation of the properties object if (!is_object($this->properties)) { $this->properties = new PropertyCollection(); } $this->properties->setWhere("idclient", $client); $this->properties->setWhere("itemtype", $this->primaryKey); $this->properties->setWhere("itemid", $iItemID); $this->properties->query(); while ($oPropertyItem = $this->properties->next()) { $oItem->setProperty($oPropertyItem->get("type"), $oPropertyItem->get("name"), $oPropertyItem->get("value")); } $oItem->store(); return $oItem; }
$plugin_name = 'newsletter'; cInclude("includes", "functions.con.php"); // For conDeleteArt and conCopyArt // Initialization $oPage = new cPage(); $oClientLang = new cApiClientLanguage(false, $client, $lang); // Include plugins if (is_array($cfg['plugins']['newsletters'])) { foreach ($cfg['plugins']['newsletters'] as $plugin) { plugin_include("newsletters", $plugin . "/" . $plugin . ".php"); } } // Exec actions $oNewsletter = new Newsletter(); $oNewsletter->loadByPrimaryKey($idnewsletter); if ($oNewsletter->virgin == false && $oNewsletter->get("idclient") == $client && $oNewsletter->get("idlang") == $lang) { // Check and set values if (!is_numeric($_REQUEST["selTemplate"])) { $_REQUEST["selTemplate"] = 0; } // Saving message changes; note, that if a user doesn't have the right to save the // text message he may still have the right to change the html article. To prevent // changing the html article, give the user only read access right for the newsletter // article category - the article will be shown also, if he doesn't have any rights at all... if ($action == "news_save" && $perm->have_perm_area_action("news", $action)) { // Changing e.g. \' back to ' (magic_quotes) $sMessage = Contenido_Security::unescapeDB($_REQUEST["txtMessage"]); $oNewsletter->set("message", $sMessage); if ($oNewsletter->get("template_idart") != $_REQUEST["selTemplate"]) { if ($oNewsletter->get("idart") > 0) { // Template has been changed: Delete old article