示例#1
0
 public function enhanceMail(Codendi_Mail $mail)
 {
     $headers = $this->getAdditionalHeaders();
     $from_mail = null;
     if (array_key_exists('from', $headers)) {
         $from_mail = $headers['from'];
         unset($headers['from']);
     }
     if ($from_mail === null && array_key_exists('reply-to', $headers)) {
         $from_mail = $headers['reply-to'];
     }
     if ($from_mail !== null) {
         $mail->clearFrom();
         $mail->setFrom($from_mail);
     }
     foreach ($headers as $name => $value) {
         $mail->addAdditionalHeader($name, $value);
     }
     foreach ($this->getAdditionalPropertiesForLookAndFeel() as $property => $value) {
         $mail->getLookAndFeelTemplate()->set($property, $value);
     }
     if ($this->getMessageId()) {
         $mail->getMail()->setMessageId($this->getMessageId());
     }
 }
示例#2
0
 public function itForcesFromHeader()
 {
     $mail_enhancer = new MailEnhancer();
     $mail = new Codendi_Mail();
     $mail->setFrom('*****@*****.**');
     $from_mail = '*****@*****.**';
     $mail_enhancer->addHeader('From', $from_mail);
     $mail_enhancer->enhanceMail($mail);
     $this->assertEqual($mail->getFrom(), $from_mail);
 }
示例#3
0
 public function enhanceMail(Codendi_Mail $mail)
 {
     foreach ($this->getAdditionalHeaders() as $name => $value) {
         $mail->addAdditionalHeader($name, $value);
     }
     foreach ($this->getAdditionalPropertiesForLookAndFeel() as $property => $value) {
         $mail->getLookAndFeelTemplate()->set($property, $value);
     }
     if ($this->getMessageId()) {
         $mail->getMail()->setMessageId($this->getMessageId());
     }
 }
示例#4
0
 /**
  * @return Codendi_Mail
  */
 public function buildEmail(Project $project, Notification $notification)
 {
     $mail = new Codendi_Mail();
     $mail->setFrom(ForgeConfig::get('sys_noreply'));
     $mail->setBcc($this->getBcc($notification));
     $mail->setTo('');
     if ($project->getTruncatedEmailsUsage()) {
         $presenter = new MailPresenter($notification->getServiceName(), $notification->getGotoLink(), ForgeConfig::get('sys_fullname'));
         $mail->setSubject($this->renderer->renderToString(self::TRUNCATED_SUBJECT_TEMPLATE, $presenter));
         $mail->setBodyHtml($this->renderer->renderToString(self::TRUNCATED_BODY_TEMPLATE, $presenter));
     } else {
         if ($notification->hasHTMLBody()) {
             $mail->setBodyHtml($notification->getHTMLBody());
         }
         if ($notification->hasTextBody()) {
             $mail->setBodyText($notification->getTextBody());
         }
         $mail->setSubject($notification->getSubject());
     }
     return $mail;
 }
示例#5
0
function initializeMail($subject, $from, $to, $html, $text)
{
    $mail = new Codendi_Mail();
    $mail->setSubject($subject);
    $mail->setTo($to);
    $mail->setBodyHtml($html);
    $mail->setBodyText($text);
    $mail->setFrom($from);
    return $mail;
}
示例#6
0
 public function sendMail(PFUser $user, Project $project, $tv3_id, $tracker_name)
 {
     $mail = new Codendi_Mail();
     $breadcrumbs = array();
     $breadcrumbs[] = '<a href="' . get_server_url() . '/projects/' . $project->getUnixName(true) . '" />' . $project->getPublicName() . '</a>';
     $mail->getLookAndFeelTemplate()->set('breadcrumbs', $breadcrumbs);
     $mail->addAdditionalHeader("X-Codendi-Project", $project->getUnixName());
     $mail->setFrom($GLOBALS['sys_noreply']);
     $mail->setTo($user->getEmail());
     $mail->setSubject('Output of your migration TV3 -> TV5');
     $mail->setBody($this->getMailBody($tv3_id, $tracker_name));
     $mail->send();
     $this->purgeLogStack();
 }
示例#7
0
 private function sendErrorMail($to, $subject, $message)
 {
     $mail = new Codendi_Mail();
     $mail->setFrom(ForgeConfig::get('sys_noreply'));
     $mail->setTo($to);
     $mail->setSubject($subject);
     $mail->setBody($message);
     $mail->send();
 }
 /**
  *
  * Send mails to a group of people and check the max number of emailed people limit.
  *
  * @param Project $project Project of the receivers
  * @param PFO_User $user Sender
  * @param string $subject
  * @param string $html_body
  * @param PFUser[] $receivers
  */
 public function sendMassmail(Project $project, PFUser $user, $subject, $html_body, array $receivers)
 {
     $hp = Codendi_HTMLPurifier::instance();
     $project_name = $project->getPublicName();
     $sys_max_number_of_emailed_people = ForgeConfig::get('sys_max_number_of_emailed_people');
     if (count($receivers) > $sys_max_number_of_emailed_people && !$user->isSuperUser()) {
         $GLOBALS['Response']->addFeedback('error', $GLOBALS['Language']->getText('my_index', 'massmail_not_sent_max_users', $sys_max_number_of_emailed_people));
         return;
     }
     $mail = new Codendi_Mail();
     $mail->setFrom($user->getEmail());
     $mail->setTo($user->getEmail());
     $mail->setBccUser($receivers);
     $mail->setSubject("[" . $GLOBALS['sys_name'] . "] [" . $project_name . "] " . $subject);
     $mail->setBodyText($hp->purify($html_body, CODENDI_PURIFIER_STRIP_HTML));
     $mail->setBodyHtml($html_body);
     $is_sent = $mail->send();
     return $is_sent;
 }
示例#9
0
 public function itHasAppropriateTypeForAttachment()
 {
     $mail = new Codendi_Mail();
     $mail->addInlineAttachment('data', 'text/plain', 'attachment');
     $this->assertEqual($mail->getMail()->getType(), 'multipart/related');
 }
 private function addLogoInAttachment(Codendi_Mail $mail)
 {
     $logo_retriever = new LogoRetriever();
     $cid_logo = '';
     $path_logo = $logo_retriever->getPath();
     if ($path_logo) {
         $id_attachment = 'logo';
         $mail->addInlineAttachment(file_get_contents($path_logo), $logo_retriever->getMimetype(), $id_attachment);
         $cid_logo = 'cid:' . $id_attachment;
     }
     return $cid_logo;
 }
 /**
  * Send a notification
  *
  * @param array  $recipients the list of recipients
  * @param array  $headers    the additional headers
  * @param string $subject    the subject of the message
  * @param string $htmlBody   the html content of the message
  * @param string $txtBody    the text content of the message
  *
  * @return void
  */
 protected function sendNotification($recipients, $headers, $subject, $htmlBody, $txtBody)
 {
     $mail = new Codendi_Mail();
     $hp = Codendi_HTMLPurifier::instance();
     $breadcrumbs = array();
     $groupId = $this->getTracker()->getGroupId();
     $project = $this->getTracker()->getProject();
     $trackerId = $this->getTracker()->getID();
     $artifactId = $this->getArtifact()->getID();
     $breadcrumbs[] = '<a href="' . get_server_url() . '/projects/' . $project->getUnixName(true) . '" />' . $project->getPublicName() . '</a>';
     $breadcrumbs[] = '<a href="' . get_server_url() . '/plugins/tracker/?tracker=' . (int) $trackerId . '" />' . $hp->purify(SimpleSanitizer::unsanitize($this->getTracker()->getName())) . '</a>';
     $breadcrumbs[] = '<a href="' . get_server_url() . '/plugins/tracker/?aid=' . (int) $artifactId . '" />' . $hp->purify($this->getTracker()->getName() . ' #' . $artifactId) . '</a>';
     $mail->getLookAndFeelTemplate()->set('breadcrumbs', $breadcrumbs);
     $mail->getLookAndFeelTemplate()->set('title', $hp->purify($subject));
     $mail->setFrom($GLOBALS['sys_noreply']);
     $mail->addAdditionalHeader("X-Codendi-Project", $this->getArtifact()->getTracker()->getProject()->getUnixName());
     $mail->addAdditionalHeader("X-Codendi-Tracker", $this->getArtifact()->getTracker()->getItemName());
     $mail->addAdditionalHeader("X-Codendi-Artifact-ID", $this->getId());
     foreach ($headers as $header) {
         $mail->addAdditionalHeader($header['name'], $header['value']);
     }
     $mail->setTo(implode(', ', $recipients));
     $mail->setSubject($subject);
     if ($htmlBody) {
         $mail->setBodyHTML($htmlBody);
     }
     $mail->setBodyText($txtBody);
     $mail->send();
 }
 /**
  * Send a notification
  *
  * @param array  $recipients the list of recipients
  * @param array  $headers    the additional headers
  * @param string $subject    the subject of the message
  * @param string $htmlBody   the html content of the message
  * @param string $txtBody    the text content of the message
  * @param string $message_id the id of the message
  * @param string $from       the from email address
  *
  * @return void
  */
 protected function sendNotification($recipients, $headers, $subject, $htmlBody, $txtBody, $message_id, $from)
 {
     $mail = new Codendi_Mail();
     if ($message_id) {
         $mail->getMail()->setMessageId($message_id);
     }
     $hp = Codendi_HTMLPurifier::instance();
     $breadcrumbs = array();
     $tracker = $this->getTracker();
     $project = $tracker->getProject();
     $artifactId = $this->getArtifact()->getID();
     $project_unix_name = $project->getUnixName(true);
     $tracker_name = $tracker->getItemName();
     $breadcrumbs[] = '<a href="' . get_server_url() . '/projects/' . $project_unix_name . '" />' . $project->getPublicName() . '</a>';
     $breadcrumbs[] = '<a href="' . get_server_url() . '/plugins/tracker/?tracker=' . (int) $tracker->getId() . '" />' . $hp->purify($this->getTracker()->getName()) . '</a>';
     $breadcrumbs[] = '<a href="' . get_server_url() . '/plugins/tracker/?aid=' . (int) $artifactId . '" />' . $hp->purify($this->getTracker()->getName() . ' #' . $artifactId) . '</a>';
     $mail->getLookAndFeelTemplate()->set('breadcrumbs', $breadcrumbs);
     $mail->getLookAndFeelTemplate()->set('unsubscribe_link', $this->getUnsubscribeLink());
     $mail->getLookAndFeelTemplate()->set('title', $hp->purify($subject));
     $mail->setFrom($from);
     $mail->addAdditionalHeader("X-Codendi-Project", $project->getUnixName());
     $mail->addAdditionalHeader("X-Codendi-Tracker", $tracker_name);
     $mail->addAdditionalHeader("X-Codendi-Artifact-ID", $this->getId());
     foreach ($headers as $header) {
         $mail->addAdditionalHeader($header['name'], $header['value']);
     }
     $mail->setTo(implode(', ', $recipients));
     $mail->setSubject($subject);
     if ($htmlBody) {
         $htmlBody .= $this->getHTMLBodyFilter($project_unix_name, $tracker_name);
         $mail->setBodyHTML($htmlBody);
     }
     $txtBody .= $this->getTextBodyFilter($project_unix_name, $tracker_name);
     $mail->setBodyText($txtBody);
     $mail->send();
 }
 /**
  * Prepare mail
  *
  * @param FRSPackage $package Id of th package
  * @param PFUser       $user    The deleted user
  *
  * @return Codendi_Mail
  */
 function prepareMail(FRSPackage $package, PFUser $user)
 {
     $subject = $GLOBALS['Language']->getText('file_filemodule_monitor', 'mail_subject', array($GLOBALS['sys_name'], $package->getName()));
     $mail = new Codendi_Mail();
     $mail->getLookAndFeelTemplate()->set('title', $subject);
     $mail->setFrom($GLOBALS['sys_noreply']);
     $mail->setTo($user->getEmail());
     $mail->setSubject($subject);
     return $mail;
 }
 /**
  * Remind a user about the document he is supposed to review
  *
  * @param Docman_ApprovalTable $table      Approval table
  * @param Integer              $reviewerId Id of the reviewer
  *
  * @return Boolean
  */
 private function notifyIndividual(Docman_ApprovalTable $table, $reviewerId)
 {
     $hp = Codendi_HTMLPurifier::instance();
     $um = UserManager::instance();
     $reviewer = $um->getUserById($reviewerId);
     if ($table instanceof Docman_ApprovalTableFile) {
         $versionFactory = new Docman_VersionFactory();
         $version = $versionFactory->getSpecificVersionById($table->getVersionId(), 'plugin_docman_version');
         $itemId = $version->getItemId();
     } else {
         $itemId = $table->getItemId();
     }
     $itemFactory = new Docman_ItemFactory();
     $docmanItem = $itemFactory->getItemFromDb($itemId);
     $subject = $GLOBALS['Language']->getText('plugin_docman', 'approval_reminder_mail_subject', array($GLOBALS['sys_name'], $docmanItem->getTitle()));
     $mailMgr = new MailManager();
     $mailPrefs = $mailMgr->getMailPreferencesByUser($reviewer);
     $mail = new Codendi_Mail();
     $mail->getLookAndFeelTemplate()->set('title', $hp->purify($subject));
     $mail->setFrom($GLOBALS['sys_noreply']);
     $mail->setTo($reviewer->getEmail());
     $mail->setSubject($subject);
     if ($mailPrefs == Codendi_Mail_Interface::FORMAT_HTML) {
         $htmlBody = $this->getBodyHtml($table, $docmanItem);
         $mail->setBodyHtml($htmlBody);
     }
     $txtBody = $this->getBodyText($table, $docmanItem);
     $mail->setBodyText($txtBody);
     return $mail->send();
 }
示例#15
0
function plugin_forumml_process_mail($plug, $reply = false)
{
    $request =& HTTPRequest::instance();
    $hp =& ForumML_HTMLPurifier::instance();
    // Instantiate a new Mail class
    $mail = new Codendi_Mail();
    // Build mail headers
    $to = mail_get_listname_from_list_id($request->get('list')) . "@" . $GLOBALS['sys_lists_host'];
    $mail->setTo($to);
    $from = user_getrealname(user_getid()) . " <" . user_getemail(user_getid()) . ">";
    $mail->setFrom($from);
    $vMsg = new Valid_Text('message');
    if ($request->valid($vMsg)) {
        $message = $request->get('message');
    }
    $subject = $request->get('subject');
    $mail->setSubject($subject);
    if ($reply) {
        // set In-Reply-To header
        $hres = plugin_forumml_get_message_headers($request->get('reply_to'));
        $reply_to = db_result($hres, 0, 'value');
        $mail->addAdditionalHeader("In-Reply-To", $reply_to);
    }
    $continue = true;
    if ($request->validArray(new Valid_Email('ccs')) && $request->exist('ccs')) {
        $cc_array = array();
        $idx = 0;
        foreach ($request->get('ccs') as $cc) {
            if (trim($cc) != "") {
                $cc_array[$idx] = $hp->purify($cc, CODENDI_PURIFIER_FULL);
                $idx++;
            }
        }
        // Checks sanity of CC List
        $err = '';
        if (!util_validateCCList($cc_array, $err)) {
            $GLOBALS['Response']->addFeedback('error', $GLOBALS['Language']->getText('plugin_forumml', 'invalid_mail', $err));
            $continue = false;
        } else {
            // add list of cc users to mail mime
            if (count($cc_array) > 0) {
                $cc_list = util_normalize_emails(implode(',', $cc_array));
                $mail->setCc($cc_list, true);
            }
        }
    }
    if ($continue) {
        // Process attachments
        if (isset($_FILES["files"]) && count($_FILES["files"]['name']) > 0) {
            foreach ($_FILES["files"]['name'] as $i => $fileName) {
                $data = file_get_contents($_FILES["files"]["tmp_name"][$i]);
                $mime_type = $_FILES["files"]["type"][$i];
                $mail->addAttachment($data, $mime_type, $fileName);
            }
        }
        $mail->setBodyText($message);
        if ($mail->send()) {
            $GLOBALS['Response']->addFeedback('info', $GLOBALS['Language']->getText('plugin_forumml', 'mail_succeed'));
        } else {
            $GLOBALS['Response']->addFeedback('error', $GLOBALS['Language']->getText('plugin_forumml', 'mail_fail'));
            $continue = false;
        }
    }
    return $continue;
}
示例#16
0
 /** for a certain set of users being part of the same ugroups
  * create the mail body containing only fields that they have the permission to read
  */
 function createHTMLMailForUsers($ugroups, $changes, $group_id, $group_artifact_id, &$ok, &$subject)
 {
     global $art_field_fact, $art_fieldset_fact, $Language;
     $artifact_href = get_server_url() . "/tracker/?func=detail&aid=" . $this->getID() . "&atid={$group_artifact_id}&group_id={$group_id}";
     $used_fields = $art_field_fact->getAllUsedFields();
     $art_fieldset_fact = new ArtifactFieldsetFactory($this->ArtifactType);
     $used_fieldsets = $art_fieldset_fact->getAllFieldSetsContainingUsedFields();
     $ok = false;
     $hp = $this->getHTMLPurifier();
     $body = '';
     //generate the field permissions (TRACKER_FIELD_READ, TRACKER_FIEDL_UPDATE or nothing)
     //for all fields of this tracker given the $ugroups the user is part of
     $field_perm = false;
     if ($ugroups) {
         $field_perm = $this->ArtifactType->getFieldPermissions($ugroups);
     }
     $summ = "";
     if ($field_perm === false || isset($field_perm['summary']) && $field_perm['summary'] && permission_can_read_field($field_perm['summary'])) {
         $summ = util_unconvert_htmlspecialchars($this->getValue('summary'));
     }
     $subject = '[' . $this->ArtifactType->getCapsItemName() . ' #' . $this->getID() . '] ' . $summ;
     // artifact fields
     // Generate the message preamble with all required
     // artifact fields - Changes first if there are some.
     $body .= '<h1>' . $summ . '</h1>';
     if ($changes) {
         $body .= $this->formatChangesHTML($changes, $field_perm, $artifact_href, $visible_change);
         if (!$visible_change) {
             return;
         }
     }
     $ok = true;
     // Snapshot
     $fields_per_line = 2;
     // the column number is the number of field per line * 2 (label + value)
     // + the number of field per line -1 (a blank column between each pair "label-value" to give more space)
     $columns_number = $fields_per_line * 2 + ($fields_per_line - 1);
     $max_size = 40;
     $snapshot = '';
     foreach ($used_fieldsets as $fieldset_id => $result_fieldset) {
         // this variable will tell us if we have to display the fieldset or not (if there is at least one field to display or not)
         $display_fieldset = false;
         $fieldset_html = '';
         $i = 0;
         $fields_in_fieldset = $result_fieldset->getAllUsedFields();
         foreach ($fields_in_fieldset as $key => $field) {
             if ($field->getName() != 'comment_type_id' && $field->getName() != 'artifact_id') {
                 $field_html = $this->_getFieldLabelAndValueForHTMLMail($group_id, $group_artifact_id, $field, $field_perm);
                 if ($field_html) {
                     // if the user can read at least one field, we can display the fieldset this field is within
                     $display_fieldset = true;
                     list($sz, ) = explode("/", $field->getDisplaySize());
                     // Details field must be on one row
                     if ($sz > $max_size || $field->getName() == 'details') {
                         $fieldset_html .= "\n<TR>" . '<TD align="left" valign="top" width="10%" nowrap="nowrap">' . $field_html['label'] . '</td>' . '<TD valign="top" width="90%" colspan="' . ($columns_number - 1) . '">' . $field_html['value'] . '</TD>' . "\n</TR>";
                         $i = 0;
                     } else {
                         $fieldset_html .= $i % $fields_per_line ? '' : "\n<TR>";
                         $fieldset_html .= '<TD align="left" valign="top" width="10%" nowrap="nowrap">' . $field_html['label'] . '</td>' . '<TD width="38%" valign="top">' . $field_html['value'] . '</TD>';
                         $i++;
                         // if the line is not full, we add a additional column to give more space
                         $fieldset_html .= $i % $fields_per_line ? '<td class="artifact_spacer" width="4%">&nbsp;</td>' : "\n</TR>";
                     }
                 }
             }
         }
         // We display the fieldset only if there is at least one field inside that we can display
         if ($display_fieldset) {
             $snapshot .= '<TR style="color: #444444; background-color: #F6F6F6;"><TD COLSPAN="' . (int) $columns_number . '">&nbsp;<span title="' . $hp->purify(SimpleSanitizer::unsanitize($result_fieldset->getDescriptionText()), CODENDI_PURIFIER_CONVERT_HTML) . '">' . $hp->purify(SimpleSanitizer::unsanitize($result_fieldset->getLabel()), CODENDI_PURIFIER_CONVERT_HTML) . '</span></TD></TR>';
             $snapshot .= $fieldset_html;
         }
     }
     if ($snapshot) {
         $body .= '<h2>' . $GLOBALS['Language']->getText('tracker_include_artifact', 'mail_snapshot_title') . '</h2>';
         $body .= '<table>';
         $body .= $snapshot;
         $body .= '</table>';
         if (!$changes) {
             $body .= $this->fetchHtmlAnswerButton($artifact_href);
         }
     }
     $result = $this->getFollowups();
     if (db_numrows($result)) {
         $body .= '<h2>' . $GLOBALS['Language']->getText('tracker_include_artifact', 'mail_comment_title') . '</h2>';
         $body .= '<dl>';
         while ($row = db_fetch_array($result)) {
             $orig_subm = $this->getOriginalCommentSubmitter($row['artifact_history_id']);
             $orig_sub_mod_by = db_result($orig_subm, 0, 'mod_by');
             if ($orig_sub_mod_by == 100) {
                 $submitter_real_name = db_result($orig_subm, 0, 'email');
             } else {
                 $submitter = UserManager::instance()->getUserById($orig_sub_mod_by);
                 $submitter_real_name = $submitter->getRealName();
             }
             $orig_date = $this->getOriginalCommentDate($row['artifact_history_id']);
             $subm_date = format_date($GLOBALS['Language']->getText('system', 'datefmt'), db_result($orig_date, 0, 'date'));
             $body .= '<dt><strong>' . $submitter_real_name . '</strong> <span style="color:#bbb">' . $subm_date . '</span></dt>';
             $body .= '<dd>' . $this->formatFollowUp($group_id, $row['format'], $row['new_value'], self::OUTPUT_BROWSER) . '</dd>';
         }
         $body .= '</dl>';
     }
     // Finaly, transform relatives URLs to absolute
     // I'm Nicolas Terray and I approve this hack.
     $body = preg_replace('%<a href="/%', '<a href="' . get_server_url() . '/', $body);
     // Mail is ready, we can create it
     if ($ok) {
         $project = ProjectManager::instance()->getProject($group_id);
         $breadcrumbs = array();
         $breadcrumbs[] = '<a href="' . get_server_url() . '/projects/' . $project->getUnixName($tolower = true) . '" />' . $project->getPublicName() . '</a>';
         $breadcrumbs[] = '<a href="' . get_server_url() . '/tracker/?group_id=' . (int) $group_id . '&amp;atid=' . (int) $group_artifact_id . '" />' . $hp->purify(SimpleSanitizer::unsanitize($this->ArtifactType->getName())) . '</a>';
         $breadcrumbs[] = '<a href="' . $artifact_href . '" />' . $hp->purify($this->ArtifactType->getItemName() . ' #' . $this->getID()) . '</a>';
         $mail = new Codendi_Mail();
         $mail->getLookAndFeelTemplate()->set('breadcrumbs', $breadcrumbs);
         $mail->getLookAndFeelTemplate()->set('title', $hp->purify($subject, CODENDI_PURIFIER_CONVERT_HTML));
         $mail->getLookAndFeelTemplate()->set('additional_footer_link', '<a href="' . $artifact_href . '">' . $GLOBALS['Language']->getText('tracker_include_artifact', 'mail_direct_link') . '</a>');
         $mail->setBodyHtml($body);
         return $mail;
     } else {
         return null;
     }
 }
示例#17
0
 /**
  * Prepare the mail to be sent after daily user sync
  *
  * @param String  $recipients  List of project administrators emails we want to notify
  * @param Integer $projectName Public name of the project we want to notify its administrators
  * @param String  $subject     The subject of the notification mail
  * @param String  $body        The content of the notification mail
  *
  * @return Codendi_Mail
  */
 protected function prepareMail($recipients, $projectName, $subject, $body)
 {
     $mail = new Codendi_Mail();
     $mail->setFrom($GLOBALS['sys_noreply']);
     if (empty($recipients)) {
         throw new InvalidArgumentException('Cannot send notification without any valid receiver, Perhaps the project <' . $projectName . '> has no administrators.');
     }
     $mail->setSubject($subject);
     $mail->setTo($recipients);
     $mail->setBody($body);
     return $mail;
 }