/** * @param Newsletter $newsletter * @param Mailinglists $recipient * @param Boolean $fakeRecipient */ function __construct($newsletter, $recipient, $fakeRecipient = false) { $this->newsletter = $newsletter; $this->mailinglists = $newsletter->MailingLists(); $this->recipient = $recipient; $this->fakeRecipient = $fakeRecipient; parent::__construct($this->newsletter->SendFrom, $this->recipient->Email); $this->populateTemplate(new ArrayData(array('UnsubscribeLink' => $this->UnsubscribeLink(), 'SiteConfig' => DataObject::get_one('SiteConfig'), 'AbsoluteBaseURL' => Director::absoluteBaseURLWithAuth()))); $this->body = $newsletter->getContentBody(); $this->subject = $newsletter->Subject; $this->ss_template = $newsletter->RenderTemplate; if ($this->body && $this->newsletter) { $text = $this->body->forTemplate(); //Recipient Fields ShortCode parsing $bodyViewer = new SSViewer_FromString($text); $text = $bodyViewer->process($this->templateData()); // Install link tracking by replacing existing links with "newsletterlink" and hash-based reference. if ($this->config()->link_tracking_enabled && !$this->fakeRecipient && preg_match_all("/<a\\s[^>]*href=\"([^\"]*)\"[^>]*>(.*)<\\/a>/siU", $text, $matches)) { if (isset($matches[1]) && ($links = $matches[1])) { $titles = isset($matches[2]) ? $matches[2] : array(); $id = (int) $this->newsletter->ID; $replacements = array(); $current = array(); // workaround as we want to match the longest urls (/foo/bar/baz) before /foo/ array_unique($links); $sorted = array_combine($links, array_map('strlen', $links)); arsort($sorted); foreach ($sorted as $link => $length) { $SQL_link = Convert::raw2sql($link); $tracked = DataObject::get_one('Newsletter_TrackedLink', "\"NewsletterID\" = '" . $id . "' AND \"Original\" = '" . $SQL_link . "'"); if (!$tracked) { // make one. $tracked = new Newsletter_TrackedLink(); $tracked->Original = $link; $tracked->NewsletterID = $id; $tracked->write(); } // replace the link $replacements[$link] = $tracked->Link(); // track that this link is still active $current[] = $tracked->ID; } // replace the strings $text = str_ireplace(array_keys($replacements), array_values($replacements), $text); } } // replace the body $output = new HTMLText(); $output->setValue($text); $this->body = $output; } }
/** * Adds users to the queue for sending out a newsletter. * Processed all users that are CURRENTLY in the mailing lists associated with this MailingList and adds them * to the queue. * * @param $id The ID of the Newsletter DataObject to send */ public function enqueue(Newsletter $newsletter) { $lists = $newsletter->MailingLists(); $queueCount = 0; foreach ($lists as $list) { foreach ($list->Recipients()->column('ID') as $recipientID) { //duplicate filtering $existingQueue = SendRecipientQueue::get()->filter(array('RecipientID' => $recipientID, 'NewsletterID' => $newsletter->ID, 'Status' => array('Scheduled', 'InProgress'))); if ($existingQueue->exists()) { continue; } $queueItem = SendRecipientQueue::create(); $queueItem->NewsletterID = $newsletter->ID; $queueItem->RecipientID = $recipientID; $queueItem->write(); $queueCount++; } } return $queueCount; }