public function unsubscribeAction()
 {
     $this->enableLayout();
     $newsletter = new Newsletter("person");
     // replace "crm" with the class name you have used for your class above (mailing list)
     $unsubscribeMethod = null;
     $success = false;
     if ($this->getParam("email")) {
         $unsubscribeMethod = "email";
         $success = $newsletter->unsubscribeByEmail($this->getParam("email"));
     }
     if ($this->getParam("token")) {
         $unsubscribeMethod = "token";
         $success = $newsletter->unsubscribeByToken($this->getParam("token"));
     }
     $this->view->success = $success;
     $this->view->unsubscribeMethod = $unsubscribeMethod;
 }
Example #2
0
 public function sendTestAction()
 {
     $document = Document\Newsletter::getById($this->getParam("id"));
     $addressSourceAdapterName = $this->getParam("addressAdapterName");
     $adapterParams = json_decode($this->getParam("adapterParams"), true);
     $adapterClass = "\\Pimcore\\Document\\Newsletter\\AddressSourceAdapter\\" . ucfirst($addressSourceAdapterName);
     /**
      * @var $addressAdapter \Pimcore\Document\Newsletter\AddressSourceAdapterInterface
      */
     $addressAdapter = new $adapterClass($adapterParams);
     $sendingContainer = $addressAdapter->getParamsForTestSending($this->getParam("testMailAddress"));
     $mail = \Pimcore\Tool\Newsletter::prepareMail($document);
     \Pimcore\Tool\Newsletter::sendNewsletterDocumentBasedMail($mail, $sendingContainer);
     $this->_helper->json(["success" => true]);
 }
 public function sendTestAction()
 {
     $letter = Newsletter\Config::getByName($this->getParam("name"));
     $className = "\\Pimcore\\Model\\Object\\" . ucfirst($letter->getClass());
     $object = $className::getByEmail($letter->getTestEmailAddress(), 1);
     if (!$object) {
         $objectList = $className . "\\Listing";
         $list = new $objectList();
         if ($letter->getObjectFilterSQL()) {
             $list->setCondition($letter->getObjectFilterSQL());
         }
         $list->setOrderKey("RAND()", false);
         $list->setLimit(1);
         $list->setOffset(0);
         $object = current($list->load());
         if (!$object) {
             throw new \Exception("no valid user data available, can't send email");
         }
     }
     Tool\Newsletter::sendMail($letter, $object, $letter->getTestEmailAddress());
     $this->_helper->json(array("success" => true));
 }
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $newsletter = Model\Tool\Newsletter\Config::getByName($input->getArgument("id"));
     if ($newsletter) {
         $pidFile = $newsletter->getPidFile();
         if (file_exists($pidFile)) {
             \Logger::alert("Cannot send newsletters because there's already one active sending process");
             exit;
         }
         $elementsPerLoop = 10;
         $objectList = "\\Pimcore\\Model\\Object\\" . ucfirst($newsletter->getClass()) . "\\Listing";
         $list = new $objectList();
         $conditions = array("(newsletterActive = 1 AND newsletterConfirmed = 1)");
         if ($newsletter->getObjectFilterSQL()) {
             $conditions[] = $newsletter->getObjectFilterSQL();
         }
         if ($newsletter->getPersonas()) {
             $class = Model\Object\ClassDefinition::getByName($newsletter->getClass());
             if ($class && $class->getFieldDefinition("persona")) {
                 $personas = array();
                 $p = explode(",", $newsletter->getPersonas());
                 if ($class->getFieldDefinition("persona") instanceof \Pimcore\Model\Object\ClassDefinition\Data\Persona) {
                     foreach ($p as $value) {
                         if (!empty($value)) {
                             $personas[] = $list->quote($value);
                         }
                     }
                     $conditions[] = "persona IN (" . implode(",", $personas) . ")";
                 } else {
                     if ($class->getFieldDefinition("persona") instanceof \Pimcore\Model\Object\ClassDefinition\Data\Personamultiselect) {
                         $personasCondition = array();
                         foreach ($p as $value) {
                             $personasCondition[] = "persona LIKE " . $list->quote("%," . $value . ",%");
                         }
                         $conditions[] = "(" . implode(" OR ", $personasCondition) . ")";
                     }
                 }
             }
         }
         $list->setCondition(implode(" AND ", $conditions));
         $list->setOrderKey("email");
         $list->setOrder("ASC");
         $elementsTotal = $list->getTotalCount();
         $count = 0;
         $pidContents = array("start" => time(), "lastUpdate" => time(), "newsletter" => $newsletter->getName(), "total" => $elementsTotal, "current" => $count);
         $this->writePid($pidFile, $pidContents);
         for ($i = 0; $i < ceil($elementsTotal / $elementsPerLoop); $i++) {
             $list->setLimit($elementsPerLoop);
             $list->setOffset($i * $elementsPerLoop);
             $objects = $list->load();
             foreach ($objects as $object) {
                 try {
                     $count++;
                     \Logger::info("Sending newsletter " . $count . " / " . $elementsTotal . " [" . $newsletter->getName() . "]");
                     \Pimcore\Tool\Newsletter::sendMail($newsletter, $object, null, $input->getArgument("hostUrl"));
                     $note = new Model\Element\Note();
                     $note->setElement($object);
                     $note->setDate(time());
                     $note->setType("newsletter");
                     $note->setTitle("sent newsletter: '" . $newsletter->getName() . "'");
                     $note->setUser(0);
                     $note->setData(array());
                     $note->save();
                     \Logger::info("Sent newsletter to: " . $this->obfuscateEmail($object->getEmail()) . " [" . $newsletter->getName() . "]");
                 } catch (\Exception $e) {
                     \Logger::err($e);
                 }
             }
             // check if pid exists
             if (!file_exists($pidFile)) {
                 \Logger::alert("Newsletter PID not found, cancel sending process");
                 exit;
             }
             // update pid
             $pidContents["lastUpdate"] = time();
             $pidContents["current"] = $count;
             $this->writePid($pidFile, $pidContents);
             \Pimcore::collectGarbage();
         }
         // remove pid
         @unlink($pidFile);
     } else {
         \Logger::emerg("Newsletter '" . $input->getArgument("id") . "' doesn't exist");
     }
 }
 $list->setCondition(implode(" AND ", $conditions));
 $list->setOrderKey("email");
 $list->setOrder("ASC");
 $elementsTotal = $list->getTotalCount();
 $count = 0;
 $pidContents = array("start" => time(), "lastUpdate" => time(), "newsletter" => $newsletter->getName(), "total" => $elementsTotal, "current" => $count);
 writePid($pidFile, $pidContents);
 for ($i = 0; $i < ceil($elementsTotal / $elementsPerLoop); $i++) {
     $list->setLimit($elementsPerLoop);
     $list->setOffset($i * $elementsPerLoop);
     $objects = $list->load();
     foreach ($objects as $object) {
         try {
             $count++;
             \Logger::info("Sending newsletter " . $count . " / " . $elementsTotal . " [" . $newsletter->getName() . "]");
             \Pimcore\Tool\Newsletter::sendMail($newsletter, $object, null, $argv[2]);
             $note = new Model\Element\Note();
             $note->setElement($object);
             $note->setDate(time());
             $note->setType("newsletter");
             $note->setTitle("sent newsletter: '" . $newsletter->getName() . "'");
             $note->setUser(0);
             $note->setData(array());
             $note->save();
             \Logger::info("Sent newsletter to: " . obfuscateEmail($object->getEmail()) . " [" . $newsletter->getName() . "]");
         } catch (\Exception $e) {
             \Logger::err($e);
         }
     }
     // check if pid exists
     if (!file_exists($pidFile)) {
 protected function doSendMailInSingleMode(Model\Document\Newsletter $document, AddressSourceAdapterInterface $addressAdapter, $sendingId)
 {
     $totalCount = $addressAdapter->getTotalRecordCount();
     //calculate page size based on total item count - with min page size 3 and max page size 10
     $fifth = $totalCount / 5;
     $limit = $fifth > 10 ? 10 : ($fifth < 3 ? 3 : intval($fifth));
     $offset = 0;
     $hasElements = true;
     while ($hasElements) {
         $tmpStore = Model\Tool\TmpStore::get($sendingId);
         $data = $tmpStore->getData();
         Logger::info("Sending newsletter " . $hasElements . " / " . $totalCount . " [" . $document->getId() . "]");
         $data['progress'] = round($offset / $totalCount * 100, 2);
         $tmpStore->setData($data);
         $tmpStore->update();
         $sendingParamContainers = $addressAdapter->getParamsForSingleSending($limit, $offset);
         foreach ($sendingParamContainers as $sendingParamContainer) {
             $mail = \Pimcore\Tool\Newsletter::prepareMail($document, $sendingParamContainer);
             \Pimcore\Tool\Newsletter::sendNewsletterDocumentBasedMail($mail, $sendingParamContainer);
             if (empty($tmpStore)) {
                 Logger::warn("Sending configuration for sending ID {$sendingId} was deleted. Cancelling sending process.");
                 exit;
             }
         }
         $offset += $limit;
         $hasElements = count($sendingParamContainers);
         \Pimcore::collectGarbage();
     }
 }