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; }
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); } }
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(); }
/** * 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; }
/** * 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'); }
/** * 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; }
/** * 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); }
/** * 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); }