Esempio n. 1
0
 /**
  * Method used to send emails directly from the sender to the
  * recipient. This will not re-write the sender's email address
  * to issue-xxxx@ or whatever.
  *
  * @param   integer $issue_id The issue ID
  * @param   string $from The sender of this message
  * @param   string $to The primary recipient of this message
  * @param   string $cc The extra recipients of this message
  * @param   string $subject The subject of this message
  * @param   string $body The message body
  * @param   string $message_id The message-id
  * @param   integer $sender_usr_id The ID of the user sending this message.
  * @param   array $attachment An array with attachment information.
  * @return  void
  */
 public function sendDirectEmail($issue_id, $from, $to, $cc, $subject, $body, $attachment, $message_id, $sender_usr_id = false)
 {
     $prj_id = Issue::getProjectID($issue_id);
     $subject = Mail_Helper::formatSubject($issue_id, $subject);
     $recipients = self::getRecipientsCC($cc);
     $recipients[] = $to;
     // send the emails now, one at a time
     foreach ($recipients as $recipient) {
         $mail = new Mail_Helper();
         if (!empty($issue_id)) {
             // add the warning message to the current message' body, if needed
             $fixed_body = Mail_Helper::addWarningMessage($issue_id, $recipient, $body, array());
             $mail->setHeaders(array('Message-Id' => $message_id));
             // skip users who don't have access to this issue (but allow non-users and users without access to this project) to get emails
             $recipient_usr_id = User::getUserIDByEmail(Mail_Helper::getEmailAddress($recipient), true);
             if (!empty($recipient_usr_id) && (!Issue::canAccess($issue_id, $recipient_usr_id) && User::getRoleByUser($recipient_usr_id, $prj_id) != null) || empty($recipient_usr_id) && Issue::isPrivate($issue_id)) {
                 continue;
             }
         } else {
             $fixed_body = $body;
         }
         if (User::getRoleByUser(User::getUserIDByEmail(Mail_Helper::getEmailAddress($from)), Issue::getProjectID($issue_id)) == User::getRoleID('Customer')) {
             $type = 'customer_email';
         } else {
             $type = 'other_email';
         }
         if ($attachment && !empty($attachment['name'][0])) {
             $mail->addAttachment($attachment['name'][0], file_get_contents($attachment['tmp_name'][0]), $attachment['type'][0]);
         }
         $mail->setTextBody($fixed_body);
         $mail->send($from, $recipient, $subject, true, $issue_id, $type, $sender_usr_id);
     }
 }
 /**
  * Method used to forward the new email to the list of subscribers.
  *
  * @param   integer $user_id The user ID of the person performing this action
  * @param   integer $issue_id The issue ID
  * @param   array $message An array containing the email
  * @param   boolean $internal_only Whether the email should only be redirected to internal users or not
  * @param   boolean $assignee_only Whether the email should only be sent to the assignee
  * @param   boolean $type The type of email this is
  * @param   integer $sup_id the ID of this email
  * @return  void
  */
 public static function notifyNewEmail($usr_id, $issue_id, $message, $internal_only = false, $assignee_only = false, $type = '', $sup_id = false)
 {
     $prj_id = Issue::getProjectID($issue_id);
     $full_message = $message['full_email'];
     $sender = $message['from'];
     $sender_email = strtolower(Mail_Helper::getEmailAddress($sender));
     // get ID of whoever is sending this.
     $sender_usr_id = User::getUserIDByEmail($sender_email, true);
     if (empty($sender_usr_id)) {
         $sender_usr_id = false;
     }
     // automatically subscribe this sender to email notifications on this issue
     $subscribed_emails = self::getSubscribedEmails($issue_id, 'emails');
     $subscribed_emails = Misc::lowercase($subscribed_emails);
     if (!self::isIssueRoutingSender($issue_id, $sender) && !self::isBounceMessage($sender_email) && !in_array($sender_email, $subscribed_emails) && Workflow::shouldAutoAddToNotificationList($prj_id)) {
         $actions = array('emails');
         self::subscribeEmail($usr_id, $issue_id, $sender_email, $actions);
     }
     // get the subscribers
     $emails = array();
     $users = self::getUsersByIssue($issue_id, 'emails');
     foreach ($users as $user) {
         if (empty($user['sub_usr_id'])) {
             if ($internal_only == false) {
                 $email = $user['sub_email'];
             }
         } else {
             // if we are only supposed to send email to internal users, check if the role is lower than standard user
             if ($internal_only == true && User::getRoleByUser($user['sub_usr_id'], Issue::getProjectID($issue_id)) < User::ROLE_USER) {
                 continue;
             }
             // check if we are only supposed to send email to the assignees
             if ($internal_only == true && $assignee_only == true) {
                 $assignee_usr_ids = Issue::getAssignedUserIDs($issue_id);
                 if (!in_array($user['sub_usr_id'], $assignee_usr_ids)) {
                     continue;
                 }
             }
             $email = User::getFromHeader($user['sub_usr_id']);
         }
         if (empty($email)) {
             continue;
         }
         // don't send the email to the same person who sent it unless they want it
         if ($sender_usr_id != false) {
             $prefs = Prefs::get($sender_usr_id);
             if (!isset($prefs['receive_copy_of_own_action'][$prj_id])) {
                 $prefs['receive_copy_of_own_action'][$prj_id] = 0;
             }
             if ($prefs['receive_copy_of_own_action'][$prj_id] == 0 && (!empty($user['sub_usr_id']) && $sender_usr_id == $user['sub_usr_id'] || strtolower(Mail_Helper::getEmailAddress($email)) == $sender_email)) {
                 continue;
             }
         }
         $emails[] = $email;
     }
     if (!$emails) {
         return;
     }
     // change the sender of the message to {prefix}{issue_id}@{host}
     //  - keep everything else in the message, except 'From:', 'Sender:', 'To:', 'Cc:'
     // make 'Joe Blow <*****@*****.**>' become 'Joe Blow [CSC] <*****@*****.**>'
     $from = self::getFixedFromHeader($issue_id, $sender, 'issue');
     list($_headers, $body) = Mime_Helper::splitBodyHeader($full_message);
     $header_names = Mime_Helper::getHeaderNames($_headers);
     $current_headers = Mail_Helper::stripHeaders($message['headers']);
     $headers = array();
     // build the headers array required by the smtp library
     foreach ($current_headers as $header_name => $value) {
         if ($header_name == 'from') {
             $headers['From'] = $from;
         } else {
             if (is_array($value)) {
                 $value = implode('; ', $value);
             }
             $headers[$header_names[$header_name]] = $value;
         }
     }
     $headers['Subject'] = Mail_Helper::formatSubject($issue_id, $headers['Subject']);
     if (empty($type)) {
         if ($sender_usr_id != false && User::getRoleByUser($sender_usr_id, Issue::getProjectID($issue_id)) == User::ROLE_CUSTOMER) {
             $type = 'customer_email';
         } else {
             $type = 'other_email';
         }
     }
     $options = array('save_email_copy' => 1, 'issue_id' => $issue_id, 'type' => $type, 'sender_usr_id' => $sender_usr_id, 'type_id' => $sup_id);
     foreach ($emails as $to) {
         // add the warning message about replies being blocked or not
         // FIXME: $headers contains $headers['To'] from previous iteration
         $fixed_body = Mail_Helper::addWarningMessage($issue_id, $to, $body, $headers);
         $headers['To'] = Mime_Helper::encodeAddress($to);
         $mail = array('to' => $to, 'headers' => $headers, 'body' => $fixed_body);
         Mail_Queue::addMail($mail, $options);
     }
 }