golden hour
/home/doctorbruno/public_html/taeionline.com/support/include
⬆️ Go Up
Upload
File/Folder
Size
Actions
.MANIFEST
194.97 KB
Del
OK
.htaccess
14 B
Del
OK
JSON.php
33.13 KB
Del
OK
PasswordHash.php
6.92 KB
Del
OK
Spyc.php
31.74 KB
Del
OK
UniversalClassLoader.php
8.61 KB
Del
OK
ajax.admin.php
7.29 KB
Del
OK
ajax.config.php
4.61 KB
Del
OK
ajax.content.php
9.76 KB
Del
OK
ajax.draft.php
13.03 KB
Del
OK
ajax.email.php
2.33 KB
Del
OK
ajax.export.php
1006 B
Del
OK
ajax.filter.php
874 B
Del
OK
ajax.forms.php
13.84 KB
Del
OK
ajax.i18n.php
5.1 KB
Del
OK
ajax.kbase.php
2.93 KB
Del
OK
ajax.note.php
2.05 KB
Del
OK
ajax.orgs.php
11.73 KB
Del
OK
ajax.plugins.php
2.15 KB
Del
OK
ajax.schedule.php
4.29 KB
Del
OK
ajax.search.php
12.72 KB
Del
OK
ajax.sequence.php
3.2 KB
Del
OK
ajax.staff.php
11.62 KB
Del
OK
ajax.tasks.php
33.87 KB
Del
OK
ajax.thread.php
8.81 KB
Del
OK
ajax.tickets.php
79.7 KB
Del
OK
ajax.tips.php
1.66 KB
Del
OK
ajax.upgrader.php
2.24 KB
Del
OK
ajax.users.php
18.33 KB
Del
OK
api.cron.php
1.06 KB
Del
OK
api.tickets.php
10.36 KB
Del
OK
class.2fa.php
7.76 KB
Del
OK
class.ajax.php
1.45 KB
Del
OK
class.api.php
15.31 KB
Del
OK
class.app.php
1.49 KB
Del
OK
class.attachment.php
6.95 KB
Del
OK
class.auth.php
50.73 KB
Del
OK
class.avatar.php
6.44 KB
Del
OK
class.banlist.php
2.58 KB
Del
OK
class.base32.php
4.07 KB
Del
OK
class.businesshours.php
7.08 KB
Del
OK
class.canned.php
9.05 KB
Del
OK
class.captcha.php
1.73 KB
Del
OK
class.category.php
11.14 KB
Del
OK
class.charset.php
3.41 KB
Del
OK
class.cli.php
9.48 KB
Del
OK
class.client.php
15.39 KB
Del
OK
class.collaborator.php
5.65 KB
Del
OK
class.company.php
2.65 KB
Del
OK
class.config.php
60.36 KB
Del
OK
class.controller.php
1.15 KB
Del
OK
class.cron.php
3.6 KB
Del
OK
class.crypto.php
18.92 KB
Del
OK
class.csrf.php
2.38 KB
Del
OK
class.dept.php
33.21 KB
Del
OK
class.dispatcher.php
7.12 KB
Del
OK
class.draft.php
6.23 KB
Del
OK
class.dynamic_forms.php
64.98 KB
Del
OK
class.email.php
49 KB
Del
OK
class.error.php
1.69 KB
Del
OK
class.export.php
32.92 KB
Del
OK
class.faq.php
15.05 KB
Del
OK
class.file.php
34.59 KB
Del
OK
class.filter.php
31.9 KB
Del
OK
class.filter_action.php
23.67 KB
Del
OK
class.format.php
44.3 KB
Del
OK
class.forms.php
195.58 KB
Del
OK
class.http.php
7.16 KB
Del
OK
class.i18n.php
24.28 KB
Del
OK
class.import.php
6.9 KB
Del
OK
class.json.php
2.71 KB
Del
OK
class.knowledgebase.php
5.8 KB
Del
OK
class.list.php
42 KB
Del
OK
class.lock.php
4.05 KB
Del
OK
class.log.php
1.55 KB
Del
OK
class.mail.php
35.76 KB
Del
OK
class.mailer.php
25.75 KB
Del
OK
class.mailfetch.php
9.72 KB
Del
OK
class.mailparse.php
30.99 KB
Del
OK
class.message.php
6.42 KB
Del
OK
class.migrater.php
5.2 KB
Del
OK
class.misc.php
7.5 KB
Del
OK
class.model.php
2.3 KB
Del
OK
class.nav.php
14.15 KB
Del
OK
class.note.php
2.39 KB
Del
OK
class.oauth2.php
4.04 KB
Del
OK
class.organization.php
22.45 KB
Del
OK
class.orm.php
120.9 KB
Del
OK
class.osticket.php
20.64 KB
Del
OK
class.ostsession.php
21.86 KB
Del
OK
class.page.php
10.59 KB
Del
OK
class.pagenate.php
5.53 KB
Del
OK
class.passwd.php
1.21 KB
Del
OK
class.pdf.php
3.83 KB
Del
OK
class.plugin.php
36.13 KB
Del
OK
class.priority.php
1.81 KB
Del
OK
class.queue.php
103.51 KB
Del
OK
class.report.php
11.76 KB
Del
OK
class.role.php
11.27 KB
Del
OK
class.schedule.php
46.28 KB
Del
OK
class.search.php
61.66 KB
Del
OK
class.sequence.php
7.27 KB
Del
OK
class.session.php
19.25 KB
Del
OK
class.setup.php
3.55 KB
Del
OK
class.signal.php
4.16 KB
Del
OK
class.sla.php
9.11 KB
Del
OK
class.staff.php
60.21 KB
Del
OK
class.task.php
56.21 KB
Del
OK
class.team.php
12.31 KB
Del
OK
class.template.php
23.45 KB
Del
OK
class.thread.php
108.96 KB
Del
OK
class.thread_actions.php
17.08 KB
Del
OK
class.ticket.php
167.39 KB
Del
OK
class.timezone.php
21.94 KB
Del
OK
class.topic.php
20.06 KB
Del
OK
class.translation.php
34.79 KB
Del
OK
class.upgrader.php
13.76 KB
Del
OK
class.user.php
43.4 KB
Del
OK
class.usersession.php
7.55 KB
Del
OK
class.util.php
10.07 KB
Del
OK
class.validator.php
12.94 KB
Del
OK
class.variable.php
11.93 KB
Del
OK
class.xml.php
3.23 KB
Del
OK
class.yaml.php
1.15 KB
Del
OK
cli
-
Del
OK
client
-
Del
OK
config
-
Del
OK
fpdf
-
Del
OK
htmLawed.php
53.53 KB
Del
OK
html2text.php
33.71 KB
Del
OK
i18n
-
Del
OK
index.php
37 B
Del
OK
laminas-mail
-
Del
OK
mpdf
-
Del
OK
mysqli.php
9.55 KB
Del
OK
ost-config.php
5.63 KB
Del
OK
ost-sampleconfig.php
6.24 KB
Del
OK
pear
-
Del
OK
plugins
-
Del
OK
staff
-
Del
OK
tnef_decoder.php
19.82 KB
Del
OK
upgrader
-
Del
OK
Edit: class.mailfetch.php
<?php /********************************************************************* class.mailfetcher.php osTicket/Mail/Fetcher Peter Rotich <peter@osticket.com>, Kevin Thorne <kevin@osticket.com> Copyright (c) osTicket http://www.osticket.com Released under the GNU General Public License WITHOUT ANY WARRANTY. See LICENSE.TXT for details. vim: expandtab sw=4 ts=4 sts=4: **********************************************************************/ namespace osTicket\Mail; class Fetcher { private $account; private $mbox; private $api; function __construct(\MailboxAccount $account, $charset='UTF-8') { $this->account = $account; $this->mbox = $account->getMailBox(); if (($folder = $this->getFetchFolder())) $this->mbox->selectFolder($folder); } function getEmailId() { return $this->account->getEmailId(); } function getEmail() { return $this->account->getEmail(); } function getEmailAddress() { return $this->account->getEmail()->getAddress(); } function getMaxFetch() { return $this->account->getMaxFetch(); } function getFetchFolder() { return $this->account->getFetchFolder(); } function getArchiveFolder() { return $this->account->getArchiveFolder(); } function canDeleteEmails() { return $this->account->canDeleteEmails(); } function getTicketsApi() { // We're forcing CLI interface - this is absolutely necessary since // Email Fetching is considered a CLI operation regardless of how // it's triggered (cron job / task or autocron) // Please note that PHP_SAPI cannot be trusted for installations // using php-fpm or php-cgi binaries for php CLI executable. if (!isset($this->api)) $this->api = new \TicketApiController('cli'); return $this->api; } function noop() { return ($this->mbox && $this->mbox->noop()); } function processMessage(int $i, array $defaults = []) { try { // Please note that the returned object could be anything from // ticket, task to thread entry or a boolean. // Don't let TicketApi call fool you! return $this->getTicketsApi()->processEmail( $this->mbox->getRawEmail($i), $defaults); } catch (\TicketDenied $ex) { // If a ticket is denied we're going to report it as processed // so it can be moved out of the Fetch Folder or Deleted based // on the MailBox settings. return true; } catch (\EmailParseError $ex) { // Upstream we try to create a ticket on email parse error - if // it fails then that means we have invalid headers. // For Debug purposes log the parse error + headers as a warning $this->logWarning(sprintf("%s\n\n%s", $ex->getMessage(), $this->mbox->getRawHeader($i))); } return false; } function processEmails() { // We need a connection if (!$this->mbox) return false; // Get basic fetch settings $archiveFolder = $this->getArchiveFolder(); $deleteFetched = $this->canDeleteEmails(); $max = $this->getMaxFetch() ?: 30; // default to 30 if not set // Get message count in the Fetch Folder if (!($messageCount = $this->mbox->countMessages())) return 0; // If the number of emails in the folder are more than Max Fetch // then process the latest $max emails - this is necessary when // fetched emails are not getting archived or deleted, which might // lead to fetcher being stuck 4ever processing old emails already // fetched if ($messageCount > $max) { // Latest $max messages $messages = range($messageCount-$max, $messageCount); } else { // Create a range of message sequence numbers (msgno) to fetch // starting from the oldest taking max fetch into account $messages = range(1, min($max, $messageCount)); } $defaults = [ 'emailId' => $this->getEmailId() ]; $msgs = $errors = 0; // TODO: Use message UIDs instead of ids foreach ($messages as $i) { try { // Okay, let's try to create a ticket if (($result=$this->processMessage($i, $defaults))) { // Mark the message as "Seen" (IMAP only) $this->mbox->markAsSeen($i); // Attempt to move the message if archive folder is set or if ($archiveFolder) $this->mbox->moveMessage($i, $archiveFolder); elseif ($deleteFetched) // else delete if deletion is desired $this->mbox->removeMessage($i); $msgs++; $errors = 0; // We are only interested in consecutive errors. } else { $errors++; } } catch (\Throwable $t) { // If we have result then exception happened after email // processing and shouldn't count as an error if (!$result) $errors++; // log the exception as a debug message $this->logDebug($t->getMessage()); } } // Expunge the mailbox $this->mbox->expunge(); // Warn on excessive errors - when errors are more than email // processed successfully. if ($errors > $msgs) { $warn = sprintf("%s\n\n%s [%d/%d - %d/%d]", // Mailbox Info sprintf(_S('Excessive errors processing emails for %1$s (%2$s).'), $this->mbox->getHostInfo(), $this->getEmail()), // Fetch Folder sprintf('%s (%s)', _S('Please manually check the Fetch Folder'), $this->getFetchFolder()), // Counts - sort of cryptic but useful once we document // what it means $messageCount, $max, $msgs, $errors); $this->logWarning($warn); } return $msgs; } private function logDebug($msg) { $this->log($msg, LOG_DEBUG); } private function logWarning($msg) { $this->log($msg, LOG_WARN); } private function log($msg, $level = LOG_WARN) { global $ost; $subj = _S('Mail Fetcher'); switch ($level) { case LOG_WARN: $ost->logWarning($subj, $msg); break; case LOG_DEBUG: default: $ost->logDebug($subj, $msg); } } /* MailFetcher::run() Static function called to initiate email polling */ static function run() { global $ost; if(!$ost->getConfig()->isEmailPollingEnabled()) return; //Hardcoded error control... $MAXERRORS = 5; //Max errors before we start delayed fetch attempts $TIMEOUT = 10; //Timeout in minutes after max errors is reached. $now = \SqlFunction::NOW(); // Num errors + last error $interval = new \SqlInterval('MINUTE', $TIMEOUT); $errors_Q = \Q::any([ 'num_errors__lte' => $MAXERRORS, new \Q(['last_error__lte' => $now->minus($interval)]) ]); // Last fetch + frequency $interval = new \SqlInterval('MINUTE', \SqlExpression::plus(new \SqlCode('fetchfreq'), 0)); $fetch_Q = \Q::any([ 'last_activity__isnull' => true, new \Q(['last_activity__lte' => $now->minus($interval)]) ]); $mailboxes = \MailBoxAccount::objects() ->filter(['active' => 1, $errors_Q, $fetch_Q]) ->order_by('last_activity'); //Get max execution time so we can figure out how long we can fetch // take fetching emails. if (!($max_time = ini_get('max_execution_time'))) $max_time = 300; //Start time $start_time = \Misc::micro_time(); foreach ($mailboxes as $mailbox) { // Check if the mailbox is active 4realz by getting credentials if (!$mailbox->isActive()) continue; // Break if we're 80% into max execution time if ((\Misc::micro_time()-$start_time) > ($max_time*0.80)) break; // Try fetching emails try { $mailbox->fetchEmails(); } catch (\Throwable $t) { if ($mailbox->getNumErrors() >= $MAXERRORS && $ost) { //We've reached the MAX consecutive errors...will attempt logins at delayed intervals // XXX: Translate me $msg = sprintf("\n %s:\n", _S('osTicket is having trouble fetching emails from the following mail account')). "\n"._S('Email').": ".$mailbox->getEmail()->getAddress(). "\n"._S('Host Info').": ".$mailbox->getHostInfo(). "\n"._S('Error').": ".$t->getMessage(). "\n\n ".sprintf(_S('%1$d consecutive errors. Maximum of %2$d allowed'), $mailbox->getNumErrors(), $MAXERRORS). "\n\n ".sprintf(_S('This could be connection issues related to the mail server. Next delayed login attempt in aprox. %d minutes'), $TIMEOUT); $ost->alertAdmin(_S('Mail Fetch Failure Alert'), $msg, true); } } } //end foreach. } } ?>
Save