/** * 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); } }