dbh = new PDO($database['connect'], $database['user'], $database['password']); $this->dbh->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER); $this->imap = $imap; $this->loadCustomers(); } public function Workflow () { $this->connectToServer(); $this->importMails(); $this->closeConnection(); } private function findAdditionalErrors ($fb, $whiteList) { $fb = str_replace("\r\`", "`", str_replace("\r\"", "\"", str_replace("\r\n", "", $fb))); $report = json_decode($fb, true); if (!$report) { return addslashes($fb); } if ($whiteList) { if (!isset($whiteList['Layer'])) $whiteList['Layer'] = array(); if (!isset($whiteList['Report'])) $whiteList['Report'] = array(); if (!isset($whiteList['User'])) $whiteList['User'] = array(); } foreach ($report as $i => $log) { if (preg_match("/\.bat$/", $log['Name'])) { $report[$i]['Errors'][0] = htmlentities($report[$i]['Errors'][0]); $report[$i]['Errors'][0] = preg_replace("/!! Bitte E-Mailadresse fuer Statusbericht angeben !!/im", "! Bitte E-Mailadresse fuer Statusbericht angeben !", $report[$i]['Errors'][0]); $report[$i]['Errors'][0] = preg_replace("/!! SMTP-Konfiguration bitte anpassen !!/im", "! SMTP-Konfiguration bitte anpassen !", $report[$i]['Errors'][0]); $count = 0; $report[$i]['Errors'][0] = preg_replace("/(!![^\n]*!!)/im", "$1", $report[$i]['Errors'][0], -1, $count); $count2 = 0; $report[$i]['Errors'][0] = preg_replace("/\((\w{2}\d{4})\)( [^\r]*)/im", "($1)$2", $report[$i]['Errors'][0], -1, $count2); //die(print($log['Errors'][0])); if ($count > 0 || $count2 > 0) { $report[$i]['ErrorLevel'] = 2; for ($j = 1; $j < $count; $j++) { $report[$i]['Errors'][] = ""; } $this->currentErrorCount += 1; } } else if ($whiteList && count($report[$i]['Errors']) > 0 && ($report[$i]['Type'] == 'Versand' || $report[$i]['Type'] == 'Portal')) { $report[$i]['Errors2'] = array(); foreach ($report[$i]['Errors'] as $j => $e) { if (in_array($e['Layer'], $whiteList['Layer']) || in_array($e['Report'], $whiteList['Report']) || in_array($e['User'], $whiteList['User'])) { $report[$i]['Errors2'][] = $report[$i]['Errors'][$j]; unset($report[$i]['Errors'][$j]); } } if (count($report[$i]['Errors']) == 0) { $report[$i]['ErrorLevel'] = 3; $this->currentErrorCount -= 1; } } } return addslashes(json_encode($report)); } private function loadCustomers () { $q = $this->dbh->query("SELECT kunde, whitelist, version FROM kunden"); $customerQuery = $q->fetchAll(PDO::FETCH_ASSOC); $this->customers = array(); $this->version = array(); foreach ($customerQuery as $c) { $this->customers[$c['kunde']] = json_decode(stripslashes($c['whitelist']), true); $this->version[$c['kunde']] = $c['version']; } } private function connectToServer () { $this->fail = false; $this->imap['connect'] = imap_open($this->imap['server'], $this->imap['user'], $this->imap['password']) or die("Could not open Mailbox - try again later!"); $this->imap['message_count'] = imap_num_msg($this->imap['connect']); if ($this->imap['message_count'] > 40) { $this->imap['message_count'] = 40; $this->fail = true; } } private function importMails () { for ($m = 1; $m <= $this->imap['message_count']; $m++) { $this->currentErrorCount = 0; $header = imap_headerinfo($this->imap['connect'], $m); $rec = explode(";", $header->Subject); if ($rec[0] == "=?iso-8859-1?Q?L=B3ckenotto") { $rec[0] = "Lueckenotto"; } if (count($rec) < 5) continue; if (count($rec) < 6) { $rec[] = ""; } $attachments = $this->getAttachments($m, @$this->customers[$rec[0]]); $rec[] = $attachments['fehlerbericht']; $rec[4] += $this->currentErrorCount; /** @noinspection SqlInsertValues */ $insertQuery = "INSERT INTO status_meldung (kunde, start, ende, datum, anzahl, aufgabe, fehlerbericht) VALUES ('" . implode("','", $rec) . "')"; $c = $this->dbh->query($insertQuery); if ($c) { imap_delete($this->imap['connect'], $m); } else { if (strtotime($header->MailDate) < strtotime("-5 days")) { imap_delete($this->imap['connect'], $m); } $error = $this->dbh->errorInfo(); if ($error[0] != "23000") { print_r($error); } } if (!isset($this->customers[$rec[0]])) { $this->dbh->query("INSERT INTO kunden (kunde) VALUES ('{$rec[0]}')"); $this->customers[$rec[0]] = array(); } if (substr($rec[5], -4) == ".bat" && !isset($this->customers[$rec[0]][$rec[5]])) { $this->dbh->query("INSERT INTO kunden_aufgabe (kunde,aufgabe,start_soll,ende_soll,erster_status) VALUES ('{$rec[0]}', '{$rec[5]}', '{$rec[1]}', '{$rec[2]}', '{$rec[3]}')"); $this->customers[$rec[0]][$rec[5]]['whitelist'] = false; } $ver = ""; if (preg_match("/Version:\s*(\d{4}-\d{2}-\d{2})_?(\w*)?/", $attachments['fehlerbericht'], $ver) && (!isset($version[$rec[0]]) || $version[$rec[0]] != $ver[1])) { $beta = ($ver[2] == "beta") ? '1' : '0'; $this->dbh->query("UPDATE kunden SET version = '{$ver[1]}', beta_version = '{$beta}' WHERE kunde = '{$rec[0]}'"); } if ($attachments['info']) { $q = $this->dbh->query("SELECT * FROM kunden_config WHERE kunde = '{$rec[0]}' ORDER BY datum DESC LIMIT 1"); $last = ($q && $q->rowCount() == 1) ? $q->fetch(PDO::FETCH_ASSOC) : false; if (!$last || addslashes($last['info']) != $attachments['info']) { $this->dbh->query("INSERT INTO kunden_config (kunde, datum, info) VALUES ('{$rec[0]}', '{$rec[3]}', '{$attachments['info']}')"); } } if ($attachments['starter']) { $q = $this->dbh->query("SELECT * FROM kunden_gcstarter WHERE kunde = '{$rec[0]}' ORDER BY datum DESC LIMIT 1"); $last = ($q && $q->rowCount() == 1) ? $q->fetch(PDO::FETCH_ASSOC) : false; if (!$last || addslashes($last['gcstarter']) != $attachments['starter']) { $this->dbh->query("INSERT INTO kunden_gcstarter (kunde, datum, gcstarter) VALUES ('{$rec[0]}', '{$rec[3]}', '{$attachments['starter']}')"); } } if ($attachments['struct']) { $q = $this->dbh->query("SELECT * FROM kunden_gcstruct WHERE kunde = '{$rec[0]}' ORDER BY datum DESC LIMIT 1"); $last = ($q && $q->rowCount() == 1) ? $q->fetch(PDO::FETCH_ASSOC) : false; if (!$last || addslashes($last['gcstruct']) != $attachments['struct']) { $this->dbh->query("INSERT INTO kunden_gcstruct (kunde, datum, gcstruct) VALUES ('{$rec[0]}', '{$rec[3]}', '{$attachments['struct']}')"); } } } } private function closeConnection () { imap_expunge($this->imap['connect']); imap_close($this->imap['connect']); } private function getAttachments ($m, $customer = null) { $structure = imap_fetchstructure($this->imap['connect'], $m); $attachments = array(); if (isset($structure->parts) && count($structure->parts)) { for ($i = 0; $i < count($structure->parts); $i++) { $attachments[$i] = array( 'is_attachment' => false, 'filename' => '', 'name' => '', 'attachment' => '' ); if ($structure->parts[$i]->ifdparameters) { foreach ($structure->parts[$i]->dparameters as $object) { if (strtolower($object->attribute) == 'filename') { $attachments[$i]['is_attachment'] = true; $attachments[$i]['filename'] = $object->value; } } } if ($structure->parts[$i]->ifparameters) { foreach ($structure->parts[$i]->parameters as $object) { if (strtolower($object->attribute) == 'name') { $attachments[$i]['is_attachment'] = true; $attachments[$i]['name'] = $object->value; } } } if ($attachments[$i]['is_attachment']) { $attachments[$i]['attachment'] = imap_fetchbody($this->imap['connect'], $m, $i + 1); if ($structure->parts[$i]->encoding == 3) { // 3 = BASE64 $attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']); } elseif ($structure->parts[$i]->encoding == 4) { // 4 = QUOTED-PRINTABLE $attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']); } } } } $result = array( 'fehlerbericht' => 0, 'info' => 0, 'starter' => 0, 'struct' => 0 ); $result['fehlerbericht'] = addslashes(trim(imap_fetchbody($this->imap['connect'], $m, '1'))); foreach ($attachments as $key => $attachment) { if ($attachment['is_attachment']) { if ($attachment['filename'] == "info.json") { $result['info'] = addslashes($attachment['attachment']); } if ($attachment['filename'] == "gcstarter.json") { $result['starter'] = addslashes($attachment['attachment']); } if ($attachment['filename'] == "gcstruct.json") { $result['struct'] = addslashes($attachment['attachment']); } if ($attachment['filename'] == "fehlerbericht.json") { $result['fehlerbericht'] = $this->findAdditionalErrors($attachment['attachment'], $customer); } } } return $result; } }