/**
  * @see Form::save()
  */
 public function save()
 {
     parent::save();
     NewsletterUtil::sendUserValidationEmail($this->user);
     $this->saved();
     //resetting variables
     $this->username = '';
     $this->user = null;
     WCF::getTPL()->assign('success', true);
 }
 /**
  * @see Action::execute()
  */
 public function execute()
 {
     parent::execute();
     $subscriber = new NewsletterSubscriber($this->subscriberID);
     if ($subscriber->userID) {
         $user = new User($subscriber->userID);
         NewsletterUtil::sendUserValidationEmail($user);
     } else {
         NewsletterUtil::sendGuestValidationEmail($subscriber);
     }
     $this->executed();
     HeaderUtil::redirect('index.php?page=NewsletterSubscriberList&success=success&packageID=' . PACKAGE_ID . SID_ARG_2ND_NOT_ENCODED);
     exit;
 }
 /**
  * @see EventListener::execute()
  */
 public function execute($eventObj, $className, $eventName)
 {
     if (!isset($eventObj->activeOptions['acceptNewsletter'])) {
         return;
     }
     $optionGeneral = $eventObj->activeOptions['acceptNewsletter'];
     $optionEmail = $eventObj->activeOptions['acceptNewsletterAsEmail'];
     $optionPM = $eventObj->activeOptions['acceptNewsletterAsPM'];
     $sql = 'SELECT COUNT(userID) AS count
     		FROM wcf' . WCF_N . '_' . $this->subscriberTable . '
     		WHERE userID = ' . intval(WCF::getUser()->userID);
     $existCount = WCF::getDB()->getFirstRow($sql);
     $sql = 'SELECT COUNT(userID) AS count
     		FROM wcf' . WCF_N . '_' . $this->activationTable . '
     		WHERE userID = ' . intval(WCF::getUser()->userID);
     $activationCount = WCF::getDB()->getFirstRow($sql);
     if ($optionGeneral['optionValue'] && !$existCount['count'] && ($optionEmail['optionValue'] || $optionPM['optionValue']) && !$activationCount['count']) {
         NewsletterUtil::sendUserValidationEmail();
     } elseif (!$optionGeneral['optionValue']) {
         $editor = WCF::getUser()->getEditor();
         $options = array('acceptNewsletter' => 0);
         $editor->updateOptions($options);
         $this->deleteSubscriber();
     } elseif ($optionGeneral['optionValue'] && $existCount['count'] && !$optionEmail['optionValue'] && !$optionPM['optionValue']) {
         $editor = WCF::getUser()->getEditor();
         $options = array('acceptNewsletter' => 0);
         $editor->updateOptions($options);
         $this->deleteSubscriber();
     } elseif ($optionGeneral['optionValue'] && !$existCount['count'] && !$optionEmail['optionValue'] && !$optionPM['optionValue']) {
         $editor = WCF::getUser()->getEditor();
         $options = array('acceptNewsletter' => 0);
         $editor->updateOptions($options);
         $this->deleteSubscriber();
     } else {
     }
     WCF::getCache()->clear(WCF_DIR . 'cache/', 'cache.newsletter-subscriber-' . PACKAGE_ID . '.php', true);
 }
 /**
  * Sends the newsletters.
  */
 protected function sendNewsletters()
 {
     $templateName = 'newsletterMail';
     //Sends mail to all subscribers.
     foreach ($this->outstandingNewsletters as $id => $newsletter) {
         $text = $newsletter['text'];
         //workaround to make sure that the template is found
         $templatePaths = array(WCF_DIR . 'templates/', WCF_DIR . 'acp/templates/');
         WCF::getTPL()->setTemplatePaths($templatePaths);
         $newsletterObj = new ViewableNewsletter($id);
         $emailText = $newsletterObj->getFormattedMessage();
         WCF::getTPL()->assign(array('subject' => $newsletter['subject'], 'text' => $emailText));
         $content = WCF::getTPL()->fetch($templateName);
         $i = 0;
         usleep(1);
         //sending one mail per subscriber
         //is longer, but safer
         foreach ($this->subscribersList as $subscriber) {
             //sleep 2 seconds after 10 sent mails
             if (fmod($i, 10) == 0) {
                 usleep(2000000);
             }
             $unsubscribeToken = '';
             if (!isset($this->unsubscribeTokens[$subscriber['subscriberID']])) {
                 $unsubscribeToken = StringUtil::getRandomID();
                 $sql = 'INSERT INTO wcf' . WCF_N . '_' . $this->unsubscriptionTable . '
             			(subscriberID, token)
             		VALUES
             			(' . intval($subscriber['subscriberID']) . ", '" . escapeString($unsubscribeToken) . "')";
                 WCF::getDB()->sendQuery($sql);
             } else {
                 $unsubscribeToken = $this->unsubscribeTokens[$subscriber['subscriberID']]['token'];
             }
             $recipient = null;
             if ($subscriber['userID']) {
                 $recipient = new User($subscriber['userID']);
                 // check for non receiving groups
                 if (!NewsletterUtil::canReceiveNewsletters($recipient)) {
                     continue;
                 }
             }
             // {$username} stands for the username of the specific subscriber
             if (is_null($recipient) || $recipient->getUserOption('acceptNewsletterAsEmail')) {
                 $tmpContent = str_replace('{$username}', $subscriber['username'], $content);
                 $tmpContent = str_replace('subscriberID', $subscriber['subscriberID'], $tmpContent);
                 $tmpContent = str_replace('token', $unsubscribeToken, $tmpContent);
                 $email = $subscriber['email'];
                 $mail = new Mail($email, $newsletter['subject'], $tmpContent, MESSAGE_NEWSLETTERSYSTEM_GENERAL_FROM);
                 //$mail->addBCC(MAIL_ADMIN_ADDRESS); would result in x mails
                 $mail->setContentType('text/html');
                 $mail->send();
             }
             if (!is_null($recipient) && $recipient->getUserOption('acceptNewsletterAsPM')) {
                 $recipientArray = array();
                 $recipientArray[] = array('userID' => $subscriber['userID'], 'username' => $subscriber['username']);
                 $admin = new User(MESSAGE_NEWSLETTERSYSTEM_GENERAL_ADMIN);
                 $options = array('enableSmilies' => $newsletter['enableSmilies'], 'enableHtml' => $newsletter['enableHtml'], 'enableBBCodes' => $newsletter['enableBBCodes']);
                 $tmpText = str_replace('{$username}', $subscriber['username'], $text);
                 $pm = PMEditor::create(false, $recipientArray, array(), $newsletter['subject'], $tmpText, $admin->userID, $admin->username, $options);
             }
             $i++;
         }
     }
     WCF::getCache()->clearResource('newsletter-subscriber-' . PACKAGE_ID);
 }