*/ class InboundEmail extends RecordService implements Di\CryptAware, Di\EmailSenderAware { use Di\CryptSetter; use Di\EmailSenderSetter; protected function filterInput($data) { parent::filterInput($data); if (property_exists($data, 'password')) { $data->password = $this->crypt->encrypt($data->password); } if (property_exists($data, 'smtpPassword')) { $data->smtpPassword = $this->crypt->encrypt($data->smtpPassword); } } public function processValidation(Entity $entity, $data) { parent::processValidation($entity, $data); if ($entity->get('useImap')) { if (!$entity->get('fetchSince')) { throw new BadRequest("EmailAccount validation: fetchSince is required."); } } } public function findAccountForSending(string $emailAddress): ?InboundEmailEntity { /** @var ?InboundEmailEntity $inboundEmail */ $inboundEmail = $this->entityManager ->getRDBRepository(InboundEmailEntity::ENTITY_TYPE) ->where([ 'status' => InboundEmailEntity::STATUS_ACTIVE, 'useSmtp' => true, 'smtpHost!=' => null, 'emailAddress' => $emailAddress, ]) ->findOne(); return $inboundEmail; } public function findSharedAccountForUser(User $user, string $emailAddress): ?InboundEmailEntity { $groupEmailAccountPermission = $this->aclManager->getPermissionLevel($user, 'groupEmailAccountPermission'); if (!$groupEmailAccountPermission || $groupEmailAccountPermission === 'no') { return null; } if ($groupEmailAccountPermission === 'team') { /** @var string[] $teamIdList */ $teamIdList = $user->getLinkMultipleIdList('teams'); if (!count($teamIdList)) { return null; } /** @var ?InboundEmailEntity */ return $this->entityManager ->getRDBRepository(InboundEmailEntity::ENTITY_TYPE) ->distinct() ->join('teams') ->where([ 'status' => InboundEmailEntity::STATUS_ACTIVE, 'useSmtp' => true, 'smtpIsShared' => true, 'teamsMiddle.teamId' => $teamIdList, 'emailAddress' => $emailAddress, ]) ->findOne(); } if ($groupEmailAccountPermission === 'all') { /** @var ?InboundEmailEntity */ return $this->entityManager ->getRDBRepository(InboundEmailEntity::ENTITY_TYPE) ->where([ 'status' => InboundEmailEntity::STATUS_ACTIVE, 'useSmtp' => true, 'smtpIsShared' => true, 'emailAddress' => $emailAddress, ]) ->findOne(); } return null; } public function storeSentMessage(InboundEmailEntity $emailAccount, Message $message): void { /** @var AccountService $service */ $service = $this->injectableFactory->create(AccountService::class); $service->storeSentMessage($emailAccount->getId(), $message); } /** * @return ?array */ public function getSmtpParamsFromAccount(InboundEmailEntity $emailAccount): ?array { $smtpParams = []; $smtpParams['server'] = $emailAccount->get('smtpHost'); if ($smtpParams['server']) { $smtpParams['port'] = $emailAccount->get('smtpPort'); $smtpParams['auth'] = $emailAccount->get('smtpAuth'); $smtpParams['security'] = $emailAccount->get('smtpSecurity'); $smtpParams['username'] = $emailAccount->get('smtpUsername'); $smtpParams['password'] = $emailAccount->get('smtpPassword'); if ($emailAccount->get('smtpAuth')) { $smtpParams['authMechanism'] = $emailAccount->get('smtpAuthMechanism'); } if ($emailAccount->get('fromName')) { $smtpParams['fromName'] = $emailAccount->get('fromName'); } if ($emailAccount->get('emailAddress')) { $smtpParams['fromAddress'] = $emailAccount->get('emailAddress'); } if (array_key_exists('password', $smtpParams) && is_string($smtpParams['password'])) { $smtpParams['password'] = $this->crypt->decrypt($smtpParams['password']); } $this->applySmtpHandler($emailAccount, $smtpParams); return $smtpParams; } return null; } /** * @param array $params */ public function applySmtpHandler(InboundEmailEntity $emailAccount, array &$params): void { /** @var ?class-string $handlerClassName */ $handlerClassName = $emailAccount->get('smtpHandler'); if (!$handlerClassName) { return; } try { $handler = $this->injectableFactory->create($handlerClassName); } catch (Throwable $e) { $this->log->error( "InboundEmail: Could not create Smtp Handler for account {$emailAccount->id}. Error: " . $e->getMessage() ); return; } if (method_exists($handler, 'applyParams')) { $handler->applyParams($emailAccount->getId(), $params); } } }