/** * Send Bulk Mail via Mandrill */ protected function _mailSendMandrill() { //----------------------------------------- // Load it //----------------------------------------- $id = intval($this->request['id']); $mail = $this->DB->buildAndFetch(array('select' => '*', 'from' => 'bulk_mail', 'where' => 'mail_id=' . $id)); if (!$mail['mail_id'] or !$mail['mail_subject'] or !$mail['mail_content']) { $this->registry->output->global_message = $this->lang->words['b_nosend']; $this->_mailStart(); return; } $opts = unserialize($mail['mail_opts']); //----------------------------------------- // Work out which vars we've actually used //----------------------------------------- $usedVars = array('unsubscribe'); foreach (array_keys($this->_getVariableInformation($this->memberData)) as $k) { if (strpos($mail['mail_content'], '{' . $k . '}') !== FALSE) { $usedVars[] = $k; } } //----------------------------------------- // Build the JSON document //----------------------------------------- $pergo = 2000; $recipientsTo = array(); $recipientsMerge = array(); /* Start with a basic query */ $queryData = array('select' => 'm.*', 'from' => array('members' => 'm'), 'order' => 'm.member_id', 'limit' => array($this->request['st'], $pergo)); /* Add in filters */ $done = 0; $complete = FALSE; $_queryData = $this->_buildMembersQuery($opts['filters']); $queryData['add_join'] = $_queryData['add_join']; $queryData['where'] = implode(' AND ', $_queryData['where']); /* Write the file */ $this->DB->build($queryData); $e = $this->DB->execute(); if (!$this->DB->getTotalRows($e)) { $complete = TRUE; } while ($r = $this->DB->fetch($e)) { /* Skip any invalid emails - the chars presented here are allowed via RFC (note that _ and - are already allowed in alphanumericClean and don't need to be specified) */ if (!$r['email'] or !$r['members_display_name'] or !IPSText::checkEmailAddress($r['email']) or $r['email'] != IPSText::alphanumericalClean($r['email'], '@.+!#$%&\'*/=?^`{|}~ ')) { continue; } $recipientsTo[] = array('email' => $r['email'], 'name' => $r['members_display_name']); $vars = array(); foreach ($this->_getVariableInformation($r, 1) as $k => $v) { if (in_array($k, $usedVars)) { $vars[] = array('name' => $k, 'content' => $v); } } if (!empty($vars)) { $recipientsMerge[] = array('rcpt' => $r['email'], 'vars' => $vars); } $done++; } //----------------------------------------- // Build Content //----------------------------------------- /* Sort out member vars */ $content = $mail['mail_content']; foreach ($this->_getVariableInformation($this->memberData) as $k => $v) { $content = str_replace('{' . $k . '}', '*|' . $k . '|*', $content); } /* Sort out global vars */ $globalMergeVars = array(); foreach ($this->_getVariableInformation(NULL, 2) as $k => $v) { if (in_array($k, $usedVars)) { $globalMergeVars[] = array('name' => $k, 'content' => $v); } } /* Get the full content */ IPSText::getTextClass('email')->clearContent(); IPSText::getTextClass('email')->unsubscribe = true; if ($opts['mail_html_on']) { IPSText::getTextClass('email')->setHtmlEmail(true); IPSText::getTextClass('email')->setHtmlTemplate(str_replace("\n", "", $content)); IPSText::getTextClass('email')->setHtmlWrapper('<#content#>'); } else { if ($this->settings['email_use_html']) { IPSText::getTextClass('email')->setHtmlEmail(true); IPSText::getTextClass('email')->setHtmlTemplate($content); } else { IPSText::getTextClass('email')->setPlainTextTemplate($content, true); } } if ($opts['mail_html_on'] or $this->settings['email_use_html']) { IPSText::getTextClass('email')->buildMessage(array('UNSUBSCRIBE' => '*|unsubscribe|*'), true, true); $content = IPSText::getTextClass('email')->getHtmlContent(); } else { IPSText::getTextClass('email')->buildMessage(array('UNSUBSCRIBE' => '*|unsubscribe|*')); $content = nl2br(IPSText::getTextClass('email')->getPlainTextContent()); } //----------------------------------------- // Send to Mandrill //----------------------------------------- if (IPS_DOC_CHAR_SET != "UTF-8") { $mail['mail_subject'] = IPSText::convertCharsets($mail['mail_subject'], IPS_DOC_CHAR_SET, "UTF-8"); } require_once IPSLib::getAppDir('members') . '/sources/classes/mandrill.php'; $mandrill = new Mandrill(); $response = $mandrill->messages_send(array('message' => array('html' => $content, 'subject' => $mail['mail_subject'], 'from_email' => $this->settings['email_out'], 'from_name' => $this->settings['board_name'], 'to' => $recipientsTo, 'auto_text' => true, 'url_strip_qs' => false, 'preserve_recipients' => false, 'merge' => true, 'global_merge_vars' => $globalMergeVars, 'merge_vars' => $recipientsMerge, 'tags' => array_merge(array('ips'), array_filter($opts['mandrill_tags'], create_function('$v', 'return (bool) $v;')))), 'async' => true)); if (isset($response->status) and $response->status == 'error') { $this->registry->output->showError('mandrill_error'); } //----------------------------------------- // Save //----------------------------------------- $this->DB->update('bulk_mail', array('mail_active' => 0, 'mail_updated' => time(), 'mail_sentto' => $mail['mail_sentto'] + count($recipientsTo)), 'mail_id=' . $mail['mail_id']); if ($complete !== TRUE) { $url = "{$this->settings['base_url']}app=members&module=bulkmail§ion=bulkmail&do=mail_send_mandrill&id={$id}&countmembers={$this->request['countmembers']}&st=" . ($this->request['st'] + $pergo); if (!$this->request['st']) { $this->registry->output->multipleRedirectInit($url); $this->registry->getClass('output')->html_main .= $this->registry->getClass('output')->global_template->global_frame_wrapper(); $this->registry->getClass('output')->sendOutput(); } else { $percentage = 100 / $this->request['countmembers'] * $this->request['st']; $percentage = floor($percentage); $this->registry->output->multipleRedirectHit($url, "Processing ({$percentage}% complete)"); } return; } else { $this->registry->output->multipleRedirectFinish(); } }