public function fetchFromMailServer(Entity $emailAccount) { if ($emailAccount->get('status') != 'Active') { throw new Error(); } $importer = new \Espo\Core\Mail\Importer($this->getEntityManager(), $this->getFileManager(), $this->getConfig()); $maxSize = $this->getConfig()->get('emailMessageMaxSize'); $user = $this->getEntityManager()->getEntity('User', $emailAccount->get('assignedUserId')); if (!$user) { throw new Error(); } $userId = $user->id; $teamId = $user->get('defaultTeamId'); $teamIds = array(); if (!empty($teamId)) { $teamIds[] = $teamId; } $filterCollection = $this->getEntityManager()->getRepository('EmailFilter')->where(['OR' => [['parentType' => $emailAccount->getEntityType(), 'parentId' => $emailAccount->id], ['parentId' => null]]])->find(); $fetchData = json_decode($emailAccount->get('fetchData'), true); if (empty($fetchData)) { $fetchData = array(); } if (!array_key_exists('lastUID', $fetchData)) { $fetchData['lastUID'] = array(); } if (!array_key_exists('lastUID', $fetchData)) { $fetchData['lastDate'] = array(); } $storage = $this->getStorage($emailAccount); $monitoredFolders = $emailAccount->get('monitoredFolders'); if (empty($monitoredFolders)) { throw new Error(); } $portionLimit = $this->getConfig()->get('personalEmailMaxPortionSize', self::PORTION_LIMIT); $monitoredFoldersArr = explode(',', $monitoredFolders); foreach ($monitoredFoldersArr as $folder) { $folder = mb_convert_encoding(trim($folder), 'UTF7-IMAP', 'UTF-8'); try { $storage->selectFolder($folder); } catch (\Exception $e) { $GLOBALS['log']->error('EmailAccount ' . $emailAccount->id . ' (Select Folder) [' . $e->getCode() . '] ' . $e->getMessage()); continue; } $lastUID = 0; $lastDate = 0; if (!empty($fetchData['lastUID'][$folder])) { $lastUID = $fetchData['lastUID'][$folder]; } if (!empty($fetchData['lastDate'][$folder])) { $lastDate = $fetchData['lastDate'][$folder]; } if (!empty($lastUID)) { $ids = $storage->getIdsFromUID($lastUID); } else { $dt = new \DateTime($emailAccount->get('fetchSince')); if ($dt) { $ids = $storage->getIdsFromDate($dt->format('d-M-Y')); } else { return false; } } if (count($ids) == 1 && !empty($lastUID)) { if ($storage->getUniqueId($ids[0]) == $lastUID) { continue; } } $k = 0; foreach ($ids as $i => $id) { if ($k == count($ids) - 1) { $lastUID = $storage->getUniqueId($id); } if ($maxSize) { if ($storage->getSize($id) > $maxSize * 1024 * 1024) { $k++; continue; } } $message = null; $email = null; try { $message = $storage->getMessage($id); if ($message && $emailAccount->get('keepFetchedEmailsUnread')) { $flags = $message->getFlags(); } try { $email = $importer->importMessage($message, $userId, $teamIds, $filterCollection); } catch (\Exception $e) { $GLOBALS['log']->error('EmailAccount ' . $emailAccount->id . ' (Import Message): [' . $e->getCode() . '] ' . $e->getMessage()); } if ($emailAccount->get('keepFetchedEmailsUnread')) { if (is_array($flags) && empty($flags[Storage::FLAG_SEEN])) { $storage->setFlags($id, $flags); } } } catch (\Exception $e) { $GLOBALS['log']->error('EmailAccount ' . $emailAccount->id . ' (Get Message): [' . $e->getCode() . '] ' . $e->getMessage()); } if (!empty($email)) { $this->noteAboutEmail($email); } if ($k == count($ids) - 1) { $lastUID = $storage->getUniqueId($id); if ($message && isset($message->date)) { $dt = new \DateTime($message->date); if ($dt) { $dateSent = $dt->setTimezone(new \DateTimeZone('UTC'))->format('Y-m-d H:i:s'); $lastDate = $dateSent; } } } if ($k == $portionLimit - 1) { $lastUID = $storage->getUniqueId($id); break; } $k++; } $fetchData['lastUID'][$folder] = $lastUID; $fetchData['lastDate'][$folder] = $lastDate; $emailAccount->set('fetchData', json_encode($fetchData)); $this->getEntityManager()->saveEntity($emailAccount, array('silent' => true)); } $storage->close(); return true; }
public function fetchFromMailServer(Entity $inboundEmail) { if ($inboundEmail->get('status') != 'Active') { throw new Error(); } $importer = new \Espo\Core\Mail\Importer($this->getEntityManager(), $this->getFileManager()); $maxSize = $this->getConfig()->get('emailMessageMaxSize'); $teamId = $inboundEmail->get('teamId'); $userId = $this->getUser()->id; if ($inboundEmail->get('assignToUserId')) { $userId = $inboundEmail->get('assignToUserId'); } $fetchData = json_decode($inboundEmail->get('fetchData'), true); if (empty($fetchData)) { $fetchData = array(); } if (!array_key_exists('lastUID', $fetchData)) { $fetchData['lastUID'] = array(); } if (!array_key_exists('lastUID', $fetchData)) { $fetchData['lastDate'] = array(); } $imapParams = array('host' => $inboundEmail->get('host'), 'port' => $inboundEmail->get('port'), 'user' => $inboundEmail->get('username'), 'password' => $inboundEmail->get('password')); if ($inboundEmail->get('ssl')) { $imapParams['ssl'] = 'SSL'; } $storage = new \Espo\Core\Mail\Storage\Imap($imapParams); $monitoredFolders = $inboundEmail->get('monitoredFolders'); if (empty($monitoredFolders)) { $monitoredFolders = 'INBOX'; } $monitoredFoldersArr = explode(',', $monitoredFolders); foreach ($monitoredFoldersArr as $folder) { $folder = trim($folder); $storage->selectFolder($folder); $lastUID = 0; $lastDate = 0; if (!empty($fetchData['lastUID'][$folder])) { $lastUID = $fetchData['lastUID'][$folder]; } if (!empty($fetchData['lastDate'][$folder])) { $lastDate = $fetchData['lastDate'][$folder]; } $ids = $storage->getIdsFromUID($lastUID); if (count($ids) == 1 && !empty($lastUID)) { if ($storage->getUniqueId($ids[0]) == $lastUID) { continue; } } $k = 0; foreach ($ids as $i => $id) { if ($k == count($ids) - 1) { $lastUID = $storage->getUniqueId($id); } if ($maxSize) { if ($storage->getSize($id) > $maxSize * 1024 * 1024) { continue; } } $message = $storage->getMessage($id); $email = $importer->importMessage($message, $userId, array($teamId)); if ($email) { if ($inboundEmail->get('createCase')) { $this->createCase($inboundEmail, $email); } else { if ($inboundEmail->get('reply')) { $user = $this->getEntityManager()->getEntity('User', $userId); $this->autoReply($inboundEmail, $email, $user); } } } if ($k == count($ids) - 1) { if ($message) { $dt = new \DateTime($message->date); if ($dt) { $dateSent = $dt->setTimezone(new \DateTimeZone('UTC'))->format('Y-m-d H:i:s'); $lastDate = $dateSent; } } } if ($k == self::PORTION_LIMIT - 1) { $lastUID = $storage->getUniqueId($id); break; } $k++; } $fetchData['lastUID'][$folder] = $lastUID; $fetchData['lastDate'][$folder] = $lastDate; $inboundEmail->set('fetchData', json_encode($fetchData)); $this->getEntityManager()->saveEntity($inboundEmail); } return true; }
public function fetchFromMailServer(Entity $emailAccount) { if ($emailAccount->get('status') != 'Active') { throw new Error(); } $importer = new \Espo\Core\Mail\Importer($this->getEntityManager(), $this->getFileManager(), $this->getConfig()); $maxSize = $this->getConfig()->get('emailMessageMaxSize'); $teamId = $emailAccount->get('teamId'); $userId = $this->getUser()->id; if ($emailAccount->get('assignToUserId')) { $userId = $emailAccount->get('assignToUserId'); } $teamIds = array(); if (!empty($teamId)) { $teamIds[] = $teamId; } $filterCollection = $this->getEntityManager()->getRepository('EmailFilter')->where(['OR' => [['parentType' => $emailAccount->getEntityType(), 'parentId' => $emailAccount->id], ['parentId' => null]]])->find(); $fetchData = json_decode($emailAccount->get('fetchData'), true); if (empty($fetchData)) { $fetchData = array(); } if (!array_key_exists('lastUID', $fetchData)) { $fetchData['lastUID'] = array(); } if (!array_key_exists('lastUID', $fetchData)) { $fetchData['lastDate'] = array(); } $imapParams = array('host' => $emailAccount->get('host'), 'port' => $emailAccount->get('port'), 'user' => $emailAccount->get('username'), 'password' => $this->getCrypt()->decrypt($emailAccount->get('password'))); if ($emailAccount->get('ssl')) { $imapParams['ssl'] = 'SSL'; } $storage = new \Espo\Core\Mail\Mail\Storage\Imap($imapParams); $monitoredFolders = $emailAccount->get('monitoredFolders'); if (empty($monitoredFolders)) { $monitoredFolders = 'INBOX'; } $monitoredFoldersArr = explode(',', $monitoredFolders); foreach ($monitoredFoldersArr as $folder) { $folder = mb_convert_encoding(trim($folder), 'UTF7-IMAP', 'UTF-8'); try { $storage->selectFolder($folder); } catch (\Exception $e) { $GLOBALS['log']->error('InboundEmail ' . $emailAccount->id . ' (Select Folder) [' . $e->getCode() . '] ' . $e->getMessage()); continue; } $lastUID = 0; $lastDate = 0; if (!empty($fetchData['lastUID'][$folder])) { $lastUID = $fetchData['lastUID'][$folder]; } if (!empty($fetchData['lastDate'][$folder])) { $lastDate = $fetchData['lastDate'][$folder]; } $ids = $storage->getIdsFromUID($lastUID); if (count($ids) == 1 && !empty($lastUID)) { if ($storage->getUniqueId($ids[0]) == $lastUID) { continue; } } $k = 0; foreach ($ids as $i => $id) { $toSkip = false; if ($k == count($ids) - 1) { $lastUID = $storage->getUniqueId($id); } if ($maxSize) { if ($storage->getSize($id) > $maxSize * 1024 * 1024) { $k++; continue; } } $message = null; $email = null; try { $message = $storage->getMessage($id); if ($message && isset($message->from)) { $fromString = $message->from; if (preg_match('/MAILER-DAEMON|POSTMASTER/i', $fromString)) { $toSkip = true; try { $this->processBouncedMessage($message); } catch (\Exception $e) { $GLOBALS['log']->error('InboundEmail ' . $emailAccount->id . ' (Process Bounced Message: [' . $e->getCode() . '] ' . $e->getMessage()); } } } if (!$toSkip) { try { $email = $importer->importMessage($message, $userId, $teamIds, $filterCollection); } catch (\Exception $e) { $GLOBALS['log']->error('InboundEmail ' . $emailAccount->id . ' (Import Message): [' . $e->getCode() . '] ' . $e->getMessage()); } } } catch (\Exception $e) { $GLOBALS['log']->error('InboundEmail ' . $emailAccount->id . ' (Get Message): [' . $e->getCode() . '] ' . $e->getMessage()); } if (!empty($email)) { if (!$emailAccount->get('createCase')) { $this->noteAboutEmail($email); } if ($emailAccount->get('createCase')) { $this->createCase($emailAccount, $email); } else { if ($emailAccount->get('reply')) { $user = $this->getEntityManager()->getEntity('User', $userId); $this->autoReply($emailAccount, $email, $user); } } } if ($k == count($ids) - 1) { if ($message && isset($message->date)) { $dt = new \DateTime($message->date); if ($dt) { $dateSent = $dt->setTimezone(new \DateTimeZone('UTC'))->format('Y-m-d H:i:s'); $lastDate = $dateSent; } } } if ($k == self::PORTION_LIMIT - 1) { $lastUID = $storage->getUniqueId($id); break; } $k++; } $fetchData['lastUID'][$folder] = $lastUID; $fetchData['lastDate'][$folder] = $lastDate; $emailAccount->set('fetchData', json_encode($fetchData)); $this->getEntityManager()->saveEntity($emailAccount, array('silent' => true)); } return true; }