|
| 1 | +<?php |
| 2 | + |
| 3 | +/* |
| 4 | +* Fetch all mails for accounts with ticket function |
| 5 | +* Create tickets or sort mails to existing tickets |
| 6 | +*/ |
| 7 | + |
| 8 | +use Xentral\Components\Logger\Logger; |
| 9 | +use Xentral\Components\MailClient\MailClientFactory; |
| 10 | +use Xentral\Modules\SystemMailClient\MailClientConfigProvider; |
| 11 | +use Xentral\Modules\SystemMailer\Service\EmailAccountGateway; |
| 12 | +use Xentral\Modules\Ticket\Importer\TicketFormatter; |
| 13 | +use Xentral\Modules\Ticket\Task\TicketImportHelperFactory; |
| 14 | + |
| 15 | +$DEBUG = 0; |
| 16 | + |
| 17 | + |
| 18 | +$debugfile = "/var/www/html/Xenomporio/debug.txt"; |
| 19 | + |
| 20 | +function file_append($filename,$text) { |
| 21 | + $oldtext = file_get_contents($filename); |
| 22 | + file_put_contents($filename,$oldtext.$text); |
| 23 | +} |
| 24 | + |
| 25 | +file_put_contents($debugfile,"0"); |
| 26 | + |
| 27 | +/** @var ApplicationCore $app */ |
| 28 | + |
| 29 | +$erp = $app->erp; |
| 30 | +$conf = $app->Conf; |
| 31 | + |
| 32 | +/** @var Logger $logger */ |
| 33 | +$logger = $app->Container->get('Logger'); |
| 34 | + |
| 35 | +$cronjobname = 'tickets'; |
| 36 | +/* |
| 37 | +$mutex = $app->DB->Select( |
| 38 | + "SELECT MAX(`mutex`) FROM `prozessstarter` WHERE (`parameter` = '".$cronjobname."')" |
| 39 | +); |
| 40 | +if($mutex){ |
| 41 | + $app->DB->Update( |
| 42 | + "UPDATE `prozessstarter` |
| 43 | + SET `mutexcounter`=`mutexcounter`+1 |
| 44 | + WHERE `mutex` = 1 AND (`parameter` = '".$cronjobname."')" |
| 45 | + ); |
| 46 | +
|
| 47 | + file_append($debugfile,"MUTEX"); |
| 48 | +
|
| 49 | + return; |
| 50 | +} |
| 51 | +$app->DB->Update( |
| 52 | + "UPDATE `prozessstarter` SET `mutex`='1', `mutexcounter` = 0 WHERE (`parameter` = '".$cronjobname."')" |
| 53 | +); |
| 54 | +*/ |
| 55 | + |
| 56 | +// get all email Accounts that have the ticket system active |
| 57 | +/** @var EmailAccountGateway $accountGateway */ |
| 58 | +$accountGateway = $app->Container->get('EmailAccountGateway'); |
| 59 | +$accounts = $accountGateway->getAccountsWithTicketActive(); |
| 60 | + |
| 61 | + file_append($debugfile,"Accs:".count($accounts).";"); |
| 62 | + |
| 63 | + |
| 64 | +// only load services if there is at least one account to import (performance) |
| 65 | +$ticketModule = null; |
| 66 | +$factory = null; |
| 67 | +$configProvider = null; |
| 68 | +$formatHelper = null; |
| 69 | +$importHelperFactory = null; |
| 70 | +if(!empty($accounts)){ |
| 71 | + /** @var Ticket $ticketModule */ |
| 72 | + $ticketModule = $app->erp->LoadModul('ticket'); |
| 73 | + /** @var MailClientFactory $factory */ |
| 74 | + $factory = $app->Container->get('MailClientFactory'); |
| 75 | + /** @var MailClientConfigProvider $configProvider */ |
| 76 | + $configProvider = $app->Container->get('MailClientConfigProvider'); |
| 77 | + /** @var TicketFormatter $formatHelper */ |
| 78 | + $formatHelper = $app->Container->get('TicketFormatter'); |
| 79 | + /** @var TicketImportHelperFactory $importHelperFactory */ |
| 80 | + $importHelperFactory = $app->Container->get('TicketImportHelperFactory'); |
| 81 | +} |
| 82 | + |
| 83 | +$totalEmailsImportCount = 0; |
| 84 | +foreach ($accounts as $account) { |
| 85 | + $logger->debug( |
| 86 | + 'Start imap ticket import for {email}', |
| 87 | + ['email' => $account->getEmailAddress(), 'account' => $account] |
| 88 | + ); |
| 89 | + |
| 90 | + file_append($debugfile,"Account ".$account->getemailAddress()); |
| 91 | + |
| 92 | + // create mail client |
| 93 | + try { |
| 94 | + $mailConfig = $configProvider->createImapConfigFromAccount($account); |
| 95 | + $mailClient = $factory->createImapClient($mailConfig); |
| 96 | + } catch (Exception $e) { |
| 97 | + $logger->error('Failed to create email client', ['error' => (string)$e, 'account' => $account]); |
| 98 | + |
| 99 | + file_append($debugfile,"Failed 1"); |
| 100 | + |
| 101 | + continue; |
| 102 | + } |
| 103 | + |
| 104 | + file_append($debugfile,"Connect to ".."SSL: ".$configProvider->isSslEnabled()." auth ".getAuthType()."\n"); |
| 105 | + |
| 106 | + // connect mail client |
| 107 | + try { |
| 108 | + try { |
| 109 | + $mailClient->connect(); |
| 110 | + |
| 111 | + file_append($debugfile,"Meh"); |
| 112 | + |
| 113 | + } catch (Exception $e) { |
| 114 | + $logger->error('Error during imap connection', ['error' => (string)$e, 'account' => $account]); |
| 115 | + |
| 116 | + file_append($debugfile,"Error ".(string)$e); |
| 117 | + |
| 118 | + continue; |
| 119 | + } |
| 120 | + } |
| 121 | + |
| 122 | + file_append($debugfile,"2"); |
| 123 | + |
| 124 | + // connet to INBOX folder |
| 125 | + try { |
| 126 | + $mailClient->selectFolder('INBOX'); |
| 127 | + } catch (Exception $e) { |
| 128 | + $logger->error('Failed to select INBOX folder', ['error' => (string)$e, 'account' => $account]); |
| 129 | + |
| 130 | + |
| 131 | + file_append($debugfile,"Failed 2"); |
| 132 | + |
| 133 | + |
| 134 | + continue; |
| 135 | + } |
| 136 | + |
| 137 | + $projectId = $account->getProjectId() > 0 ? $account->getProjectId() : 1; |
| 138 | + $delete_msg = 0; |
| 139 | + $daysold = $account->getBackupDeleteAfterDays(); |
| 140 | + |
| 141 | + // determine search criteria for new messages |
| 142 | + $datet = '2012-12-24'; |
| 143 | + if ($account->getImportStartDateAsString() !== '0000-00-00') { |
| 144 | + $datesince = date('d-M-Y', strtotime($account->getImportStartDateAsString())); |
| 145 | + $criteria = 'UNSEEN SINCE ' . $datesince; |
| 146 | + } else { |
| 147 | + $criteria = 'UNSEEN'; |
| 148 | + } |
| 149 | + |
| 150 | + file_append($debugfile,"3"); |
| 151 | + |
| 152 | + // search new messages |
| 153 | + try { |
| 154 | + $searchResult = $mailClient->searchMessages($criteria); |
| 155 | + } catch (Exception $e) { |
| 156 | + $logger->error('Error during imap search', ['exception' => $e]); |
| 157 | + |
| 158 | + file_append($debugfile,"Failed 3"); |
| 159 | + |
| 160 | + |
| 161 | + continue; |
| 162 | + } |
| 163 | + $logger->debug('unread emails to import: {message_count}', ['message_count' => count($searchResult)]); |
| 164 | + |
| 165 | + // set mutex if there is more than 5 emails to import |
| 166 | + if (count($searchResult) > 5) { |
| 167 | + $app->DB->Update( |
| 168 | + "UPDATE `prozessstarter` |
| 169 | + SET `mutex`=1, `mutexcounter` = 0, `letzteausfuerhung` = NOW() |
| 170 | + WHERE (`parameter` = '".$cronjobname."')" |
| 171 | + ); |
| 172 | + } |
| 173 | + $importer = $importHelperFactory->create($mailClient, $account, $projectId); |
| 174 | + $insertedMailsCount = $importer->importMessages($searchResult); |
| 175 | + $totalEmailsImportCount += $insertedMailsCount; |
| 176 | + |
| 177 | + // set mutex if the total amount of imported emails is more than 10 |
| 178 | + if ($totalEmailsImportCount > 10) { |
| 179 | + $app->DB->Update( |
| 180 | + "UPDATE `prozessstarter` |
| 181 | + SET `mutex`=1, `mutexcounter` = 0, `letzteausfuerhung` = NOW() |
| 182 | + WHERE (`parameter` = '".$cronjobname."')" |
| 183 | + ); |
| 184 | + } |
| 185 | + |
| 186 | + $mailClient->expunge(); |
| 187 | + $mailClient->disconnect(); |
| 188 | + |
| 189 | + if ( |
| 190 | + method_exists($app->erp, 'canRunCronjob') |
| 191 | + && !$app->erp->canRunCronjob(['supportmails', 'tickets']) |
| 192 | + ) { |
| 193 | + |
| 194 | + $logger->error('Tickets error'); |
| 195 | + |
| 196 | + file_append($debugfile,"Failed 5"); |
| 197 | + |
| 198 | + |
| 199 | + return; |
| 200 | + } |
| 201 | + $app->DB->Update( |
| 202 | + "UPDATE `prozessstarter` |
| 203 | + SET `mutex`=1, `mutexcounter` = 0, `letzteausfuerhung` = NOW() |
| 204 | + WHERE (`parameter` = '".$cronjobname."')" |
| 205 | + ); |
| 206 | +} |
| 207 | + |
| 208 | +$app->DB->Update( |
| 209 | + "UPDATE `prozessstarter` SET `mutex`=0,`mutexcounter`=0 WHERE (`parameter` = '".$cronjobname."')" |
| 210 | +); |
| 211 | + |
| 212 | +file_append($debugfile,"END"); |
0 commit comments