/** * Show a preview or the final version of an email * For this method we don't use extbase parameters system to have an URL as short as possible */ public function showAction() { // Override settings to NOT embed images inlines (doesn't make sense for web display) global $TYPO3_CONF_VARS; $theConf = unserialize($TYPO3_CONF_VARS['EXT']['extConf']['newsletter']); $theConf['attach_images'] = false; $TYPO3_CONF_VARS['EXT']['extConf']['newsletter'] = serialize($theConf); $newsletter = null; $email = null; $isPreview = empty($_GET['c']); // If we don't have an authentification code, we are in preview mode // If it's a preview, an email which was not sent yet, we will simulate it the best we can if ($isPreview) { // Create a fake newsletter and configure it with given parameters $newsletter = $this->objectManager->create('Tx_Newsletter_Domain_Model_Newsletter'); $newsletter->setPid(@$_GET['pid']); $newsletter->setUidRecipientList(@$_GET['uidRecipientList']); if ($newsletter) { // Find the recipient $recipientList = $newsletter->getRecipientList(); $recipientList->init(); while ($record = $recipientList->getRecipient()) { // Got him if ($record['email'] == $_GET['email']) { // Build a fake email $email = $this->objectManager->create('Tx_Newsletter_Domain_Model_Email'); $email->setRecipientAddress($record['email']); $email->setRecipientData($record); } } } } else { $email = $this->emailRepository->findByAuthcode($_GET['c']); if ($email) { $newsletter = $email->getNewsletter(); // Here we need to ensure that we have real newsletter instance because of type hinting on Tx_Newsletter_Tools::getConfiguredMailer() if ($newsletter instanceof Tx_Extbase_Persistence_LazyLoadingProxy) { $newsletter = $newsletter->_loadRealInstance(); } } } // If we found everything needed, we can render the email $content = null; if ($newsletter && $email) { // Override some configuration // so we can customise the preview according to selected settings via JS, // and we can also prevent fake statistics when admin 'view' a sent email if (isset($_GET['plainConverter'])) { $newsletter->setPlainConverter($_GET['plainConverter']); } if (isset($_GET['injectOpenSpy'])) { $newsletter->setInjectOpenSpy($_GET['injectOpenSpy']); } if (isset($_GET['injectLinksSpy'])) { $newsletter->setInjectLinksSpy($_GET['injectLinksSpy']); } $mailer = Tx_Newsletter_Tools::getConfiguredMailer($newsletter, @$_GET['L']); $mailer->prepare($email, $isPreview); if (@$_GET['plain']) { $content = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head><body><pre>'; $content .= $mailer->getPlain(); $content .= '</pre></body></html>'; } else { $content = $mailer->getHtml(); } } $this->view->assign('content', $content); }
/** * Method that accually runs the spool * * @global \TYPO3\CMS\Core\Database\DatabaseConnection $TYPO3_DB * @param resource SQL-resultset from a select from tx_newsletter_domain_model_email * @return void */ private static function runSpool($rs) { global $TYPO3_DB; $emailSentCount = 0; $mailers = array(); $objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('Tx_Extbase_Object_ObjectManager'); $newsletterRepository = $objectManager->get('Tx_Newsletter_Domain_Repository_NewsletterRepository'); $emailRepository = $objectManager->get('Tx_Newsletter_Domain_Repository_EmailRepository'); $oldNewsletterUid = null; while (list($newsletterUid, $emailUid) = $TYPO3_DB->sql_fetch_row($rs)) { /* For the page, this way we can support multiple pages in one spool session */ if ($newsletterUid != $oldNewsletterUid) { $oldNewsletterUid = $newsletterUid; $mailers = array(); $newsletter = $newsletterRepository->findByUid($newsletterUid); } // Define the language of email $email = $emailRepository->findByUid($emailUid); $recipientData = $email->getRecipientData(); $L = $recipientData['L']; // Was a language with this page defined, if not create one if (!is_object($mailers[$L])) { $mailers[$L] =& Tx_Newsletter_Tools::getConfiguredMailer($newsletter, $L); } // Mark it as started sending $email->setBeginTime(new DateTime()); $emailRepository->updateNow($email); // Send the email $mailers[$L]->send($email); // Mark it as sent already $email->setEndTime(new DateTime()); $emailRepository->updateNow($email); $emailSentCount++; } // Log numbers to syslog Tx_Newsletter_Tools::log("Sent {$emailSentCount} emails"); }