Example #1
0
 public function importLists($list)
 {
     $lists = array();
     $subs = array();
     $db = JFactory::getDbo();
     $query = $db->getQuery(true);
     $added = 0;
     foreach ($list as $obj) {
         $lists[$obj->list_name] = 0;
         $subs[$obj->email] = $obj;
         $subscriber = JTable::getInstance('Subscriber', 'NewsletterTable');
         // Add new subscribers with not existing emails
         if (!empty($obj->email)) {
             $subscriber->load(array('email' => $obj->email));
             if (!empty($subscriber->subscriber_id)) {
                 if (empty($subscriber->user_id) && !empty($obj->userId)) {
                     $subscriber->save(array('user_id' => $obj->userId));
                 }
                 $subId = $subscriber->subscriber_id;
             } else {
                 $subscriber->save(array('email' => $obj->email, 'name' => $obj->name, 'created_on' => $obj->created, 'user_id' => !empty($obj->userId) ? $obj->userId : 0, 'confirmed' => 1, 'subscription_key' => 0));
                 $subKey = SubscriberHelper::createSubscriptionKey($subscriber->subscriber_id);
                 $subscriber->save(array('subscription_key' => $subKey));
                 $added++;
             }
         }
         unset($subscriber);
     }
     return $added;
 }
Example #2
0
 public function track()
 {
     // Required data
     $subkey = JRequest::getString('uid', '');
     $newsletterId = JRequest::getInt('nid', 0);
     $action = JRequest::getString('action', '');
     $link = base64_decode(urldecode(JRequest::getVar('link', '')));
     // Optional data
     $listId = JRequest::getInt('lid', 0);
     $listId = !empty($listId) ? $listId : null;
     try {
         // Check the uid
         $subscriber = SubscriberHelper::getBySubkey($subkey);
         if (empty($subscriber->subscriber_id)) {
             throw new Exception('User is absent');
         }
         // Determine the action
         $table = JTable::getInstance('history', 'NewsletterTable');
         $actionCode = $table->getActionCode($action);
         if ($actionCode === false) {
             throw new Exception('Unknown action');
         }
         // If this is a "clicked" event we should save the link
         $text = $actionCode == NewsletterTableHistory::ACTION_CLICKED ? $link : "";
         // Track the event
         // If type of action is ACTION_OPENED then check it
         // should be only one in the DB for sid-nid
         if ($actionCode == NewsletterTableHistory::ACTION_OPENED) {
             $res = $table->load(array('subscriber_id' => (int) $subscriber->subscriber_id, 'newsletter_id' => (int) $newsletterId, 'action' => $actionCode));
             if (!empty($table->history_id)) {
                 throw new Exception('no need to track');
             }
         }
         $res = $table->save(array('subscriber_id' => (int) $subscriber->subscriber_id, 'list_id' => $listId, 'newsletter_id' => (int) $newsletterId, 'date' => date('Y-m-d H:i:s'), 'action' => $actionCode, 'text' => addslashes($link)));
         if (!$res) {
             $err = $table->getError();
             $err = $err instanceof Exception ? $err->getMessage() : $err;
             throw new Exception('Error saving data: ' . $err);
         }
     } catch (Exception $e) {
         if ($e->getMessage() != 'no need to track') {
             // For debug
             LogHelper::addDebug('Tracking failed', LogHelper::CAT_TRACKING, array('Message' => $e->getMessage(), 'Data' => JRequest::get()));
             jexit();
         } else {
             // For debug
             LogHelper::addDebug('Tracking', LogHelper::CAT_TRACKING, array('Message' => 'No need to track', 'data' => JRequest::get()));
         }
     }
     LogHelper::addDebug('Tracking', LogHelper::CAT_TRACKING, JRequest::get());
     // Redirect it!
     if (!empty($link)) {
         $this->setRedirect($link);
     }
 }
Example #3
0
 function display($tpl = null)
 {
     $uid = JRequest::getString('uid', '');
     $nid = JRequest::getString('nid', '');
     $user = JFactory::getUser();
     $subscriber = JModel::getInstance('Subscriber', 'NewsletterModelEntity');
     if (!empty($uid)) {
         $subscriber->load(array('subscription_key' => $uid));
     } elseif (!empty($user->id)) {
         $subscriber->load('-' . $user->id);
     }
     $lists = SubscriberHelper::getLists($subscriber->subscription_key);
     $this->assignRef('user', $user);
     $this->assignRef('subscriber', $subscriber->toObject());
     $this->assignRef('lists', $lists);
     $this->assign('uid', $subscriber->subscription_key);
     $this->assign('nid', $nid);
     $this->setDocument();
     parent::display();
 }
Example #4
0
 /**
  * The main send of one letter to one or mode recipients.
  * The mail content generates for each user
  *
  * TODO: Need to refactor it all to:
  * sendNewsletterToSubscriber($nid, $sid, $options)
  * sentNewsletterToEmail($nid, array $emailAndName, $options)
  * sentLetterToEmail(array $letterData, array $emailAndName, $options)
  * 
  * @param  array $params newsletter_id, subscriber(object), type ('html'|'plain'), tracking(bool)
  *
  * @return object
  * @since  1.0
  */
 public function send($params = null)
 {
     // load letter to send....
     if (empty($params['newsletter_id'])) {
         $msg = 'Newsletter id is absent. There is nothing to send.';
         $this->setError($msg);
         throw new Exception($msg);
     }
     if (empty($params['subscriber'])) {
         $msg = 'Subscriber is absent. There is no one to send.';
         $this->setError($msg);
         throw new Exception($msg);
     }
     if (empty($params['tracking'])) {
         $params['tracking'] = false;
     }
     // Load newsletter...
     $letter = JModel::getInstance('Newsletter', 'NewsletterModelEntity');
     if (!$letter->load($params['newsletter_id'])) {
         $msg = 'Loading letter error or newsletter_id is not defined. Id:' . $params['newsletter_id'];
         $this->setError($msg);
         throw new Exception($msg);
     }
     // Load newsletter's SMTP profile...
     $smtpProfile = JModel::getInstance('Smtpprofile', 'NewsletterModelEntity');
     if (!$smtpProfile->load($letter->smtp_profile_id)) {
         $msg = 'Cant load SMTP profile with id: ' . $letter->smtp_profile_id;
         $this->setError($msg);
         throw new Exception($msg);
     }
     // Load mailbox profile bound to loaded SMTP profile...
     $mailboxProfile = JModel::getInstance('Mailboxprofile', 'NewsletterModelEntity');
     if (!$mailboxProfile->load($smtpProfile->mailbox_profile_id)) {
         LogHelper::addWarning('COM_NEWSLETTER_CANT_LOAD_MAILBOX_CANT_SET_SOME_HEADERS', LogHelper::CAT_MAILER, array('Mailbox profile id' => $smtpProfile->mailbox_profile_id, 'SMTP profile' => $smtpProfile->smtp_profile_name));
     }
     // Now we have newsletter, subscriber, SMTP profile and, probably, Mailbox profile.
     // So we can start to send...
     // Use the phpMailer exceptions
     $sender = new MigurMailerSender(array('exceptions' => true));
     $subscriber = $params['subscriber'];
     $type = MailHelper::filterType(!empty($params['type']) ? $params['type'] : null);
     if (!$type) {
         $msg = 'The type "' . $type . '" is not supported';
         $this->setError($msg);
         throw new Exception($msg);
     }
     // emulate user environment
     SubscriberHelper::saveRealUser();
     if (!SubscriberHelper::emulateUser(array('email' => $subscriber->email))) {
         $msg = 'The user "' . $subscriber->email . '" is absent';
         $this->setError($msg);
         throw new Exception($msg);
     }
     PlaceholderHelper::setPlaceholder('newsletter id', $letter->newsletter_id);
     // render the content of letter for each user
     $letter->content = $this->render(array('type' => $type, 'newsletter_id' => $letter->newsletter_id, 'tracking' => true));
     $letter->subject = $this->renderSubject($letter->subject);
     $letter->encoding = $letter->params->encoding;
     SubscriberHelper::restoreRealUser();
     // Result object
     $res = new StdClass();
     $res->state = false;
     $res->errors = array();
     $res->content = $letter->content;
     if ($letter->content === false) {
         return $res;
     }
     // Add custom headers
     // Set the email to bounce
     if (!empty($mailboxProfile->username)) {
         $sender->AddCustomHeader('Return-Path:' . $mailboxProfile->username);
         $sender->AddCustomHeader('Return-Receipt-To:' . $mailboxProfile->username);
         $sender->AddCustomHeader('Errors-To:' . $mailboxProfile->username);
     }
     // Add info about newsleerter and subscriber
     $sender->AddCustomHeader(MailHelper::APPLICATION_HEADER);
     $sender->AddCustomHeader(MailHelper::EMAIL_NAME_HEADER . ':' . $letter->name);
     $sender->AddCustomHeader(MailHelper::NEWSLETTER_ID_HEADER . ':' . $params['newsletter_id']);
     $sender->AddCustomHeader(MailHelper::SUBSCRIBER_ID_HEADER . ':' . $subscriber->subscriber_id);
     // Get attachments
     $atts = DownloadHelper::getByNewsletterId($params['newsletter_id']);
     if (!$smtpProfile->isJoomlaProfile()) {
         $fromName = $smtpProfile->from_name;
         $fromEmail = $smtpProfile->from_email;
         $toName = $smtpProfile->reply_to_name;
         $toEmail = $smtpProfile->reply_to_email;
     } else {
         $jConfig = new JConfig();
         $fromName = isset($letter->params->from_name) ? $letter->params->from_name : $jConfig->fromname;
         $fromEmail = isset($letter->params->from_email) ? $letter->params->from_email : $jConfig->mailfrom;
         $toName = isset($letter->params->to_name) ? $letter->params->to_name : $jConfig->fromname;
         $toEmail = isset($letter->params->to_email) ? $letter->params->to_email : $jConfig->mailfrom;
     }
     // Check if we dan determine all parameters...
     if (empty($fromName) || empty($fromEmail) || empty($toName) || empty($toEmail)) {
         LogHelper::addWarning('COM_NEWSLETTER_MAILER_CANT_DETERMINE SOME FROMTO', LogHelper::CAT_MAILER, array('From name' => $fromName, 'From email' => $fromEmail, 'Reply to name' => $toName, 'Reply to email' => $toEmail, 'SMTP profile' => $smtpProfile->smtp_profile_name, 'Newsletter' => $letter->name));
     }
     try {
         // send the unique letter to each recipient
         $sendRes = $sender->send(array('letter' => $letter->toObject(), 'attach' => $atts, 'emails' => array($subscriber), 'smtpProfile' => $smtpProfile->toObject(), 'fromName' => $fromName, 'fromEmail' => $fromEmail, 'toName' => $toName, 'toEmail' => $toEmail, 'type' => $type, 'tracking' => $params['tracking']));
         // If sending failed
         if (!$sendRes && !empty($sender->ErrorInfo)) {
             throw new Exception($sender->ErrorInfo);
         }
     } catch (Exception $e) {
         $error = JError::getError('unset');
         if (!empty($error)) {
             $msg = $error->get('message');
             $this->setError($msg);
             $res->errors[] = $msg;
         }
         $res->errors[] = $e->getMessage();
         LogHelper::addError('COM_NEWSLETTER_MAILER_SEND_ERROR', LogHelper::CAT_MAILER, array('Error' => $e->getMessage(), 'Email' => $subscriber->email, 'Mail type' => $type, 'SMTP profile' => $smtpProfile->smtp_profile_name, 'Newsletter' => $letter->name));
         return $res;
     }
     $res->state = true;
     return $res;
 }
Example #5
0
 /**
  * Saves all the metadata about current (logined) user.
  * It is needed to restore it after emulation of session for subscribers
  * via emulateUser method.
  *
  * @return void
  * @since 1.0
  */
 public static function saveRealUser()
 {
     $session = JFactory::getSession();
     self::$_user = $session->get('user');
     self::$_registry = $session->get('registry');
 }
Example #6
0
 /**
  * Imports the data about subscribers and lists into com_newsletter
  *
  * @param  array - the array of the objects(subscriber - list)
  *
  * @return mixed - integer/(bool)false on success/fail 
  * @since  1.0
  */
 public function importLists($list)
 {
     $lists = array();
     $subs = array();
     $db = JFactory::getDbo();
     $query = $db->getQuery(true);
     $added = 0;
     foreach ($list as $obj) {
         $lists[$obj->list_name] = 0;
         $subs[$obj->email] = $obj;
         // Add new subscribers with not existing emails
         if (!empty($obj->email)) {
             $query = $db->getQuery(true);
             $query->select('subscriber_id, email');
             $query->from('#__newsletter_subscribers');
             $query->where('email = "' . addslashes(stripslashes($obj->email)) . '"');
             $db->setQuery($query);
             $res = $db->loadObject();
             if (!empty($res)) {
                 $subId = $res->subscriber_id;
             } else {
                 $db->setQuery('INSERT IGNORE INTO `#__newsletter_subscribers` ' . 'SET email = "' . addslashes(stripslashes($obj->email)) . '", ' . 'name = "' . addslashes(stripslashes($obj->name)) . '", ' . 'created_on = "' . addslashes(stripslashes($obj->created)) . '", ' . 'user_id = 0, ' . 'confirmed = 1, ' . 'subscription_key = 0');
                 $db->query();
                 $subId = $db->insertId();
                 SubscriberHelper::setSubscriptionKey($subId);
                 $added++;
             }
         }
         // Create non-exist list.
         if (!empty($obj->list_name)) {
             $query = $db->getQuery(true);
             $query->select('list_id, name');
             $query->from('#__newsletter_lists');
             $query->where('name = "' . addslashes(stripslashes($obj->list_name)) . '"');
             $db->setQuery($query);
             $res = $db->loadObject();
             if (!empty($res)) {
                 $listId = $res->list_id;
             } else {
                 $db->setQuery('INSERT IGNORE INTO `#__newsletter_lists` ' . 'SET name = "' . addslashes(stripslashes($obj->list_name)) . '", ' . 'created_on = "' . date('Y-m-d H:i:s') . '"');
                 $db->query();
                 $listId = $db->insertId();
             }
         }
         // Join user only if the $subId and $listId are present.
         if (!empty($subId) && !empty($listId)) {
             $query = $db->getQuery(true);
             $query->select('list_id, subscriber_id');
             $query->from('#__newsletter_sub_list');
             $query->where('list_id = ' . $listId);
             $query->where('subscriber_id = ' . $subId);
             $db->setQuery($query);
             $res = $db->loadObject();
             if (empty($res)) {
                 $query = 'INSERT IGNORE INTO `#__newsletter_sub_list` ' . 'SET list_id = ' . $listId . ', ' . 'subscriber_id = ' . $subId;
                 $db->setQuery($query);
                 $db->query();
             }
         }
     }
     return $added;
 }
Example #7
0
 /**
  * Render and send the letter to the selected emails
  *
  * @return void
  * @since  1.0
  */
 public function sendPreview()
 {
     $emails = JRequest::getVar('emails', array());
     $newsletterId = JRequest::getVar('newsletter_id');
     $type = JRequest::getVar('type');
     if (empty($type) || empty($newsletterId)) {
         NewsletterHelper::jsonError(JText::_('COM_NEWSLETTER_RUQUIRED_MISSING'));
     }
     if (empty($emails)) {
         NewsletterHelper::jsonError(JText::_('COM_NEWSLETTER_ADD_EMAILS'));
     }
     $data = array('newsletter_id' => $newsletterId, 'type' => $type, 'tracking' => true);
     foreach ($emails as $email) {
         $data['subscribers'][] = SubscriberHelper::getByEmail($email[1]);
     }
     $mailer = new MigurMailer();
     if (!$mailer->sendToList($data)) {
         $errors = $mailer->getErrors();
         LogHelper::addDebug('Sending of preview was failed.', LogHelper::CAT_MAILER, array('Errors' => $errors, 'Emails' => $emails));
         NewsletterHelper::jsonError($errors, $emails);
     }
     LogHelper::addDebug('Preview was sent successfully.', LogHelper::CAT_MAILER, array('Emails' => $emails));
     NewsletterHelper::jsonMessage('ok', $emails);
 }
Example #8
0
 /**
  * The method to bind subscriber to J! user.
  * To test <b>?option=com_newsletter&task=subscribe.subscribe&newsletter-name=index.php
  * @return void
  * @since  1.0
  */
 public function subscribe()
 {
     // Initialise variables.
     $app = JFactory::getApplication();
     $user = JFactory::getUser();
     $db = JFactory::getDbo();
     // Get variables from request
     $name = JRequest::getString('newsletter-name', null);
     $email = JRequest::getString('newsletter-email', null);
     $html = (int) JRequest::getInt('newsletter-html', null);
     $listsIds = DataHelper::toArrayOfInts(JRequest::getVar('newsletter-lists', array()));
     $fbenabled = JRequest::getInt('fbenabled', array());
     //$sendto = JRequest::getVar('sendto');
     // Check token, d_i_e on error.
     JRequest::checkToken() or jexit('Invalid Token');
     if (empty($name) || empty($email) || !in_array($html, array(0, 1)) || empty($listsIds)) {
         jexit('One or more parameters is missing');
     }
     $comParams = JComponentHelper::getComponent('com_newsletter')->params;
     $isNew = false;
     // Let's check if we can create user as confirmed
     $confirmed = $comParams->get('users_autoconfirm') == '1';
     // try to get user data from FB
     $fbAppId = $comParams->get('fbappid');
     $fbSecret = $comParams->get('fbsecret');
     if (!empty($fbAppId) && !empty($fbSecret) && !empty($fbenabled)) {
         $me = SubscriberHelper::getFbMe($fbAppId, $fbSecret);
         if (!empty($me->email) && $me->email == $email) {
             $confirmed = true;
         }
     }
     // If it is a user's email
     $emailsAreEqual = false;
     if (!empty($user->id) && $user->email == $email) {
         $confirmed = true;
         $emailsAreEqual = true;
     }
     // Get from db
     $subscriber = JModel::getInstance('Subscriber', 'NewsletterModelEntity');
     $subscriber->load(array('email' => $email));
     // If subscriber does not exist then create it
     if (!$subscriber->getId()) {
         $subscriber->create(array('name' => $name, 'email' => $email, 'state' => '1', 'html' => $html, 'user_id' => $emailsAreEqual ? $user->id : 0, 'confirmed' => $confirmed));
     } else {
         // Update subscriber
         if ($confirmed == true) {
             // Confirm subscriber and
             // ALL ITS ASSIGNINGS TO LISTS
             $subscriber->confirm();
         }
         if ($emailsAreEqual) {
             // If user is authorized
             $subscriber->user_id = $user->id;
             $subscriber->save();
         }
     }
     // Add subscribers to lists, ignore if already in db
     $assignedListsIds = array();
     foreach ($listsIds as $list) {
         if (!$subscriber->isInList($list)) {
             $subscriber->assignToList($list);
             $assignedListsIds[] = $list;
         }
     }
     // Get lists we assigned
     $listManager = JModel::getInstance('Lists', 'NewsletterModel');
     $lists = $listManager->getItemsByIds($assignedListsIds);
     // Add to history all subscriptions
     foreach ($lists as $list) {
         $history = JTable::getInstance('history', 'NewsletterTable');
         $history->save(array('subscriber_id' => $subscriber->getId(), 'list_id' => $list->list_id, 'newsletter_id' => NULL, 'action' => NewsletterTableHistory::ACTION_SIGNEDUP, 'date' => date('Y-m-d H:i:s'), 'text' => addslashes($list->name)));
         unset($history);
     }
     // Triggering the automailing process.
     $amManager = new NewsletterAutomailingManager();
     $amManager->processSubscription(array('subscriberId' => $subscriber->subscriber_id));
     // If subscriber is confirmed then no need to send emails.
     $message = JText::sprintf('Thank you %s for subscribing to our Newsletter!', $name);
     if (!$subscriber->isConfirmed()) {
         // Let's send newsletters
         $mailer = new MigurMailer();
         foreach ($lists as $list) {
             try {
                 $newsletter = JModel::getInstance('Newsletter', 'NewsletterModelEntity');
                 $newsletter->loadAsWelcoming($list->send_at_reg);
                 PlaceholderHelper::setPlaceholder('listname', $list->name);
                 $res = $mailer->send(array('type' => $newsletter->isFallback() ? 'plain' : $subscriber->getType(), 'subscriber' => $subscriber->toObject(), 'newsletter_id' => $newsletter->newsletter_id, 'tracking' => true));
                 if ($res->state) {
                     $message = JText::sprintf('Thank you %s for subscribing to our Newsletter! You will need to confirm your subscription. There should be an email in your inbox in a few minutes!', $name);
                     LogHelper::addMessage('COM_NEWSLETTER_WELLCOMING_NEWSLETTER_SENT_SUCCESSFULLY', LogHelper::CAT_SUBSCRIPTION, array('Email' => $subscriber->email, 'Newsletter' => $newsletter->name));
                 } else {
                     throw new Exception(json_encode($res->errors));
                 }
             } catch (Exception $e) {
                 LogHelper::addError('COM_NEWSLETTER_WELCOMING_SEND_FAILED', LogHelper::CAT_SUBSCRIPTION, array('Error' => $e->getMessage(), 'Email' => $subscriber->email, 'Newsletter' => $newsletter->name));
             }
         }
     }
     jexit($message);
 }