/** * send internal message to recipients * @access private * @param string to * @param string cc * @param string bcc * @param string subject * @param string message * @param array attachments * @param integer id of mail which is stored in sentbox * @param array 'normal' and/or 'system' and/or 'email' * @return bool */ function distributeMail($a_rcp_to, $a_rcp_cc, $a_rcp_bcc, $a_subject, $a_message, $a_attachments, $sent_mail_id, $a_type, $a_action, $a_use_placeholders = 0) { global $log; include_once 'Services/Mail/classes/class.ilMailbox.php'; include_once './Services/User/classes/class.ilObjUser.php'; if (!ilMail::_usePearMail()) { // REPLACE ALL LOGIN NAMES WITH '@' BY ANOTHER CHARACTER $a_rcp_to = $this->__substituteRecipients($a_rcp_to, 'resubstitute'); $a_rcp_cc = $this->__substituteRecipients($a_rcp_cc, 'resubstitute'); $a_rcp_bcc = $this->__substituteRecipients($a_rcp_bcc, 'resubstitute'); } $mbox = new ilMailbox(); if (!$a_use_placeholders) { $rcp_ids = $this->getUserIds(trim($a_rcp_to) . ',' . trim($a_rcp_cc) . ',' . trim($a_rcp_bcc)); $as_email = array(); foreach ($rcp_ids as $id) { $tmp_mail_options = new ilMailOptions($id); // DETERMINE IF THE USER CAN READ INTERNAL MAILS $tmp_user = self::getCachedUserInstance($id); $user_is_active = $tmp_user->getActive(); $user_can_read_internal_mails = $tmp_user->hasAcceptedUserAgreement() && $tmp_user->checkTimeLimit(); // CONTINUE IF SYSTEM MESSAGE AND USER CAN'T READ INTERNAL MAILS if (in_array('system', $a_type) && !$user_can_read_internal_mails) { continue; } // CONTINUE IF USER CAN'T READ INTERNAL MAILS OR IF HE/SHE WANTS HIS/HER MAIL // SENT TO HIS/HER EXTERNAL E-MAIL ADDRESS ONLY // Do not send external mails to inactive users!!! if ($user_is_active) { if (!$user_can_read_internal_mails || $tmp_mail_options->getIncomingType() == $this->mail_options->EMAIL) { $as_email[] = $tmp_user->getEmail(); continue; } if ($tmp_mail_options->getIncomingType() == $this->mail_options->BOTH) { $as_email[] = $tmp_user->getEmail(); } } $mbox->setUserId($id); $inbox_id = $mbox->getInboxFolder(); $mail_id = $this->sendInternalMail($inbox_id, $this->user_id, $a_attachments, $a_rcp_to, $a_rcp_cc, '', 'unread', $a_type, 0, $a_subject, $a_message, $id, 0); if ($a_attachments) { $this->mfile->assignAttachmentsToDirectory($mail_id, $sent_mail_id, $a_attachments); } } // SEND EMAIL TO ALL USERS WHO DECIDED 'email' or 'both' $to = array(); $bcc = array(); if (count($as_email) == 1) { $to[] = $as_email[0]; } else { foreach ($as_email as $email) { $bcc[] = $email; } } if (count($to) > 0 || count($bcc) > 0) { $this->sendMimeMail(implode(',', $to), '', implode(',', $bcc), $a_subject, $a_message, $a_attachments); } } else { // to $rcp_ids_replace = $this->getUserIds(trim($a_rcp_to)); // cc / bcc $rcp_ids_no_replace = $this->getUserIds(trim($a_rcp_cc) . ',' . trim($a_rcp_bcc)); $as_email = array(); // to foreach ($rcp_ids_replace as $id) { $tmp_mail_options = new ilMailOptions($id); // DETERMINE IF THE USER CAN READ INTERNAL MAILS $tmp_user = self::getCachedUserInstance($id); $user_is_active = $tmp_user->getActive(); $user_can_read_internal_mails = $tmp_user->hasAcceptedUserAgreement() && $tmp_user->checkTimeLimit(); // CONTINUE IF SYSTEM MESSAGE AND USER CAN'T READ INTERNAL MAILS if (in_array('system', $a_type) && !$user_can_read_internal_mails) { continue; } // CONTINUE IF USER CAN'T READ INTERNAL MAILS OR IF HE/SHE WANTS HIS MAIL // SENT TO HIS/HER EXTERNAL E-MAIL ADDRESS ONLY // Do not send external mails to inactive users!!! if ($user_is_active) { if (!$user_can_read_internal_mails || $tmp_mail_options->getIncomingType() == $this->mail_options->EMAIL) { $as_email[$tmp_user->getId()] = $tmp_user->getEmail(); continue; } if ($tmp_mail_options->getIncomingType() == $this->mail_options->BOTH) { $as_email[$tmp_user->getId()] = $tmp_user->getEmail(); } } $mbox->setUserId($id); $inbox_id = $mbox->getInboxFolder(); $mail_id = $this->sendInternalMail($inbox_id, $this->user_id, $a_attachments, $a_rcp_to, $a_rcp_cc, '', 'unread', $a_type, 0, $a_subject, $a_message, $id, 1); if ($a_attachments) { $this->mfile->assignAttachmentsToDirectory($mail_id, $sent_mail_id, $a_attachments); } } if (count($as_email)) { foreach ($as_email as $id => $email) { $this->sendMimeMail($email, '', '', $a_subject, $this->replacePlaceholders($a_message, $id), $a_attachments); } } $as_email = array(); // cc / bcc foreach ($rcp_ids_no_replace as $id) { $tmp_mail_options = new ilMailOptions($id); // DETERMINE IF THE USER CAN READ INTERNAL MAILS $tmp_user = self::getCachedUserInstance($id); $user_is_active = $tmp_user->getActive(); $user_can_read_internal_mails = $tmp_user->hasAcceptedUserAgreement() && $tmp_user->checkTimeLimit(); // Do not send external mails to inactive users!!! if ($user_is_active) { // CONTINUE IF SYSTEM MESSAGE AND USER CAN'T READ INTERNAL MAILS if (in_array('system', $a_type) && !$user_can_read_internal_mails) { continue; } // CONTINUE IF USER CAN'T READ INTERNAL MAILS OR IF HE/SHE WANTS HIS MAIL // SENT TO HIS/HER EXTERNAL E-MAIL ADDRESS ONLY if (!$user_can_read_internal_mails || $tmp_mail_options->getIncomingType() == $this->mail_options->EMAIL) { $as_email[] = $tmp_user->getEmail(); continue; } if ($tmp_mail_options->getIncomingType() == $this->mail_options->BOTH) { $as_email[] = $tmp_user->getEmail(); } } $mbox->setUserId($id); $inbox_id = $mbox->getInboxFolder(); $mail_id = $this->sendInternalMail($inbox_id, $this->user_id, $a_attachments, $a_rcp_to, $a_rcp_cc, '', 'unread', $a_type, 0, $a_subject, $a_message, $id, 0); if ($a_attachments) { $this->mfile->assignAttachmentsToDirectory($mail_id, $sent_mail_id, $a_attachments); } } if (count($as_email)) { $this->sendMimeMail('', '', implode(',', $as_email), $a_subject, $a_message, $a_attachments); } } return true; }