示例#1
0
 private function _sendForwards($event, $is_inbound)
 {
     @($ticket_id = $event->params['ticket_id']);
     @($send_worker_id = $event->params['worker_id']);
     $url_writer = DevblocksPlatform::getUrlService();
     $ticket = DAO_Ticket::get($ticket_id);
     // (Action) Forward Email To:
     // Sanitize and combine all the destination addresses
     $context_workers = CerberusContexts::getWorkers(CerberusContexts::CONTEXT_TICKET, $ticket->id);
     if (!is_array($context_workers)) {
         return;
     }
     foreach ($context_workers as $next_worker) {
         $notify_emails = $next_worker->email;
         if (empty($notify_emails)) {
             continue;
         }
     }
     // [TODO] This could be more efficient
     $messages = DAO_Message::getMessagesByTicket($ticket_id);
     $message = end($messages);
     // last message
     unset($messages);
     $headers = $message->getHeaders();
     // The whole flipping Swift section needs wrapped to catch exceptions
     try {
         $settings = DevblocksPlatform::getPluginSettingsService();
         $reply_to = $settings->get('cerberusweb.core', CerberusSettings::DEFAULT_REPLY_FROM, CerberusSettingsDefaults::DEFAULT_REPLY_FROM);
         // See if we need a group-specific reply-to
         if (!empty($ticket->team_id)) {
             @($group_from = DAO_GroupSettings::get($ticket->team_id, DAO_GroupSettings::SETTING_REPLY_FROM, ''));
             if (!empty($group_from)) {
                 $reply_to = $group_from;
             }
         }
         $sender = DAO_Address::get($message->address_id);
         $sender_email = strtolower($sender->email);
         $sender_split = explode('@', $sender_email);
         if (!is_array($sender_split) || count($sender_split) != 2) {
             return;
         }
         // If return-path is blank
         if (isset($headers['return-path']) && $headers['return-path'] == '<>') {
             return;
         }
         // Ignore bounces
         if ($sender_split[0] == "postmaster" || $sender_split[0] == "mailer-daemon") {
             return;
         }
         // Ignore autoresponses autoresponses
         if (isset($headers['auto-submitted']) && $headers['auto-submitted'] != 'no') {
             return;
         }
         // Attachments
         $attachments = $message->getAttachments();
         $mime_attachments = array();
         if (is_array($attachments)) {
             foreach ($attachments as $attachment) {
                 if (0 == strcasecmp($attachment->display_name, 'original_message.html')) {
                     continue;
                 }
                 $attachment_path = APP_STORAGE_PATH . '/attachments/';
                 // [TODO] This is highly redundant in the codebase
                 if (!file_exists($attachment_path . $attachment->filepath)) {
                     continue;
                 }
                 $attach = Swift_Attachment::fromPath($attachment_path . $attachment->filepath);
                 if (!empty($attachment->display_name)) {
                     $attach->setFilename($attachment->display_name);
                 }
                 $mime_attachments[] = $attach;
             }
         }
         // Send copies
         $mail_service = DevblocksPlatform::getMailService();
         $mailer = $mail_service->getMailer(CerberusMail::getMailerDefaults());
         $mail = $mail_service->createMessage();
         /* @var $mail Swift_Message */
         $mail->setTo(array($notify_emails));
         $mail->setFrom(array($sender->email));
         $mail->setReplyTo($reply_to);
         $mail->setReturnPath($reply_to);
         $mail->setSubject(sprintf("[RW: %s #%s]: %s", $is_inbound ? 'inbound' : 'outbound', $ticket->mask, $ticket->subject));
         $hdrs = $mail->getHeaders();
         if (null !== @($msgid = $headers['message-id'])) {
             $hdrs->addTextHeader('Message-Id', $msgid);
         }
         if (null !== @($in_reply_to = $headers['in-reply-to'])) {
             $hdrs->addTextHeader('References', $in_reply_to);
             $hdrs->addTextHeader('In-Reply-To', $in_reply_to);
         }
         $hdrs->addTextHeader('X-Mailer', 'Cerberus Helpdesk (Build ' . APP_BUILD . ')');
         $hdrs->addTextHeader('Precedence', 'List');
         $hdrs->addTextHeader('Auto-Submitted', 'auto-generated');
         $mail->setBody($message->getContent());
         // Send message attachments with watcher
         if (is_array($mime_attachments)) {
             foreach ($mime_attachments as $mime_attachment) {
                 $mail->attach($mime_attachment);
             }
         }
         $result = $mailer->send($mail);
     } catch (Exception $e) {
         if (!empty($message_id)) {
             $fields = array(DAO_MessageNote::MESSAGE_ID => $message_id, DAO_MessageNote::CREATED => time(), DAO_MessageNote::WORKER_ID => 0, DAO_MessageNote::CONTENT => 'Exception thrown while sending watcher email: ' . $e->getMessage(), DAO_MessageNote::TYPE => Model_MessageNote::TYPE_ERROR);
             DAO_MessageNote::create($fields);
         }
     }
 }
示例#2
0
 function doBulkUpdate($filter, $do, $ids = array())
 {
     @set_time_limit(600);
     // [TODO] Temp!
     $change_fields = array();
     $custom_fields = array();
     // Make sure we have actions
     if (empty($do)) {
         return;
     }
     // Make sure we have checked items if we want a checked list
     if (0 == strcasecmp($filter, "checks") && empty($ids)) {
         return;
     }
     if (is_array($do)) {
         foreach ($do as $k => $v) {
             switch ($k) {
                 case 'status':
                     switch (strtolower($v)) {
                         case 'open':
                             $change_fields[DAO_CrmOpportunity::IS_CLOSED] = 0;
                             $change_fields[DAO_CrmOpportunity::IS_WON] = 0;
                             $change_fields[DAO_CrmOpportunity::CLOSED_DATE] = 0;
                             break;
                         case 'won':
                             $change_fields[DAO_CrmOpportunity::IS_CLOSED] = 1;
                             $change_fields[DAO_CrmOpportunity::IS_WON] = 1;
                             $change_fields[DAO_CrmOpportunity::CLOSED_DATE] = time();
                             break;
                         case 'lost':
                             $change_fields[DAO_CrmOpportunity::IS_CLOSED] = 1;
                             $change_fields[DAO_CrmOpportunity::IS_WON] = 0;
                             $change_fields[DAO_CrmOpportunity::CLOSED_DATE] = time();
                             break;
                     }
                     break;
                 case 'closed_date':
                     $change_fields[DAO_CrmOpportunity::CLOSED_DATE] = intval($v);
                     break;
                 case 'worker_id':
                     $change_fields[DAO_CrmOpportunity::WORKER_ID] = intval($v);
                     break;
                 default:
                     // Custom fields
                     if (substr($k, 0, 3) == "cf_") {
                         $custom_fields[substr($k, 3)] = $v;
                     }
             }
         }
     }
     $pg = 0;
     if (empty($ids)) {
         do {
             list($objects, $null) = DAO_CrmOpportunity::search(array(), $this->params, 100, $pg++, SearchFields_CrmOpportunity::ID, true, false);
             $ids = array_merge($ids, array_keys($objects));
         } while (!empty($objects));
     }
     // Broadcast?
     if (isset($do['broadcast'])) {
         $tpl_builder = DevblocksPlatform::getTemplateBuilder();
         $params = $do['broadcast'];
         if (!isset($params['worker_id']) || empty($params['worker_id']) || !isset($params['subject']) || empty($params['subject']) || !isset($params['message']) || empty($params['message'])) {
             break;
         }
         $is_queued = isset($params['is_queued']) && $params['is_queued'] ? true : false;
         if (is_array($ids)) {
             foreach ($ids as $opp_id) {
                 try {
                     CerberusContexts::getContext(CerberusContexts::CONTEXT_OPPORTUNITY, $opp_id, $tpl_labels, $tpl_tokens);
                     $subject = $tpl_builder->build($params['subject'], $tpl_tokens);
                     $body = $tpl_builder->build($params['message'], $tpl_tokens);
                     $fields = array(DAO_MailQueue::TYPE => Model_MailQueue::TYPE_COMPOSE, DAO_MailQueue::TICKET_ID => 0, DAO_MailQueue::WORKER_ID => $params['worker_id'], DAO_MailQueue::UPDATED => time(), DAO_MailQueue::HINT_TO => $tpl_tokens['email_address'], DAO_MailQueue::SUBJECT => $subject, DAO_MailQueue::BODY => $body, DAO_MailQueue::PARAMS_JSON => json_encode(array('to' => $tpl_tokens['email_address'], 'group_id' => $params['group_id'])));
                     if ($is_queued) {
                         $fields[DAO_MailQueue::IS_QUEUED] = 1;
                     }
                     $draft_id = DAO_MailQueue::create($fields);
                 } catch (Exception $e) {
                     // [TODO] ...
                 }
             }
         }
     }
     $batch_total = count($ids);
     for ($x = 0; $x <= $batch_total; $x += 100) {
         $batch_ids = array_slice($ids, $x, 100);
         DAO_CrmOpportunity::update($batch_ids, $change_fields);
         // Custom Fields
         self::_doBulkSetCustomFields(CrmCustomFieldSource_Opportunity::ID, $custom_fields, $batch_ids);
         unset($batch_ids);
     }
     unset($ids);
 }