Beispiel #1
-1
 /**
  * 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&section=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();
     }
 }