From 7645fa4e90fce478c995a79c97f404b412f6a617 Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Fri, 4 Sep 2020 15:35:09 +0300 Subject: [PATCH] emailSender usage and fixes --- application/Espo/Core/Htmlizer/Factory.php | 5 ++ application/Espo/Core/Htmlizer/Htmlizer.php | 6 ++- application/Espo/Core/Password/Recovery.php | 21 ++++----- .../Crm/Business/Event/Invitations.php | 36 ++++++++++----- .../Crm/Business/Reminder/EmailReminder.php | 12 ++--- .../Espo/Modules/Crm/Services/Meeting.php | 18 ++++++-- application/Espo/ORM/BaseEntity.php | 3 ++ .../Espo/Services/EmailNotification.php | 46 ++++++++++++------- 8 files changed, 96 insertions(+), 51 deletions(-) diff --git a/application/Espo/Core/Htmlizer/Factory.php b/application/Espo/Core/Htmlizer/Factory.php index fb8ae194b7..423ac84db4 100644 --- a/application/Espo/Core/Htmlizer/Factory.php +++ b/application/Espo/Core/Htmlizer/Factory.php @@ -57,4 +57,9 @@ class Factory return $this->injectableFactory->createWith(Htmlizer::class, $with); } + + public function createNoAcl() : Htmlizer + { + return $this->create(true); + } } diff --git a/application/Espo/Core/Htmlizer/Htmlizer.php b/application/Espo/Core/Htmlizer/Htmlizer.php index 6b1d61a813..46b36d3ba7 100644 --- a/application/Espo/Core/Htmlizer/Htmlizer.php +++ b/application/Espo/Core/Htmlizer/Htmlizer.php @@ -113,12 +113,14 @@ class Htmlizer $this->acl->getScopeRestrictedAttributeList($entity->getEntityType(), ['forbidden', 'internal', 'onlyAdmin']) ); - $forbiddenLinkList = $this->acl->getScopeRestrictedLinkList($entity->getEntityType(), ['forbidden', 'internal', 'onlyAdmin']); + $forbiddenLinkList = $this->acl->getScopeRestrictedLinkList( + $entity->getEntityType(), ['forbidden', 'internal', 'onlyAdmin'] + ); } $relationList = $entity->getRelationList(); - if (!$skipLinks && $level === 0) { + if (!$skipLinks && $level === 0 && $this->entityManager) { foreach ($relationList as $relation) { $collection = null; diff --git a/application/Espo/Core/Password/Recovery.php b/application/Espo/Core/Password/Recovery.php index 1c2b140a25..5a7152eabc 100644 --- a/application/Espo/Core/Password/Recovery.php +++ b/application/Espo/Core/Password/Recovery.php @@ -40,7 +40,7 @@ use Espo\Core\Exceptions\Error; use Espo\Core\{ ORM\EntityManager, Utils\Config, - Mail\Sender as MailSender, + Mail\EmailSender, Htmlizer\Factory as HtmlizerFactory, Utils\TemplateFileManager, }; @@ -53,20 +53,20 @@ class Recovery protected $entityManager; protected $config; - protected $mailSender; + protected $emailSender; protected $htmlizerFactory; protected $templateFileManager; public function __construct( EntityManager $entityManager, Config $config, - MailSender $mailSender, + EmailSender $emailSender, HtmlizerFactory $htmlizerFactory, TemplateFileManager $templateFileManager ) { $this->entityManager = $entityManager; $this->config = $config; - $this->mailSender = $mailSender; + $this->emailSender = $emailSender; $this->htmlizerFactory = $htmlizerFactory; $this->templateFileManager = $templateFileManager; } @@ -227,7 +227,6 @@ class Recovery { $config = $this->config; $em = $this->entityManager; - $mailSender = $this->mailSender; $htmlizerFactory = $this->htmlizerFactory; $templateFileManager = $this->templateFileManager; @@ -236,10 +235,12 @@ class Recovery $email = $em->getEntity('Email'); - if (!$mailSender->hasSystemSmtp() && !$config->get('internalSmtpServer')) { + if (!$this->emailSender->hasSystemSmtp() && !$config->get('internalSmtpServer')) { throw new Error("Password recovery: SMTP credentials are not defined."); } + $sender = $this->emailSender->create(); + $subjectTpl = $templateFileManager->getTemplate('passwordChangeLink', 'subject', 'User'); $bodyTpl = $templateFileManager->getTemplate('passwordChangeLink', 'body', 'User'); @@ -273,10 +274,8 @@ class Recovery 'isSystem' => true, ]); - if ($mailSender->hasSystemSmtp()) { - $mailSender->useGlobal(); - } else { - $mailSender->useSmtp([ + if (!$this->emailAddress->hasSystemSmtp()) { + $sender->withSmtpParams([ 'server' => $config->get('internalSmtpServer'), 'port' => $config->get('internalSmtpPort'), 'auth' => $config->get('internalSmtpAuth'), @@ -287,7 +286,7 @@ class Recovery ]); } - $mailSender->send($email); + $sender->send($email); } private function fail(?string $msg = null, int $errorCode = 403) diff --git a/application/Espo/Modules/Crm/Business/Event/Invitations.php b/application/Espo/Modules/Crm/Business/Event/Invitations.php index 1a1756d5db..16a7611863 100644 --- a/application/Espo/Modules/Crm/Business/Event/Invitations.php +++ b/application/Espo/Modules/Crm/Business/Event/Invitations.php @@ -29,19 +29,22 @@ namespace Espo\Modules\Crm\Business\Event; +use Laminas\Mail\Message; + use Espo\ORM\Entity; use Espo\Core\Utils\Util; use Espo\Core\{ ORM\EntityManager, - Mail\Sender, + Mail\EmailSender, Utils\Config, Utils\File\Manager as FileManager, Utils\DateTime, Utils\NumberUtil, Utils\Language, Utils\TemplateFileManager, + Htmlizer\Factory as HtmlizerFactory, }; class Invitations @@ -51,34 +54,37 @@ class Invitations protected $ics; protected $entityManager; - protected $mailSender; + protected $emailSender; protected $config; protected $dateTime; protected $language; protected $number; protected $templateFileManager; protected $fileManager; + protected $htmlizerFactory; public function __construct( EntityManager $entityManager, ?array $smtpParams, - Sender $mailSender, + EmailSender $emailSender, Config $config, FileManager $fileManager, DateTime $dateTime, NumberUtil $number, Language $language, - TemplateFileManager $templateFileManager + TemplateFileManager $templateFileManager, + HtmlizerFactory $htmlizerFactory ) { $this->entityManager = $entityManager; $this->smtpParams = $smtpParams; - $this->mailSender = $mailSender; + $this->emailSender = $emailSender; $this->config = $config; $this->dateTime = $dateTime; $this->language = $language; $this->number = $number; $this->fileManager = $fileManager; $this->templateFileManager = $templateFileManager; + $this->htmlizerFactory = $htmlizerFactory; } protected function getEntityManager() @@ -161,7 +167,7 @@ class Invitations $data['entityType'] = $this->language->translate($entity->getEntityType(), 'scopeNames'); $data['entityTypeLowerFirst'] = Util::mbLowerCaseFirst($data['entityType']); - $htmlizer = new \Espo\Core\Htmlizer\Htmlizer($this->fileManager, $dateTime, $this->number, null); + $htmlizer = $this->htmlizerFactory->createNoAcl(); $subject = $htmlizer->render($entity, $subjectTpl, 'invitation-email-subject-' . $entity->getEntityType(), $data, true); $body = $htmlizer->render($entity, $bodyTpl, 'invitation-email-body-' . $entity->getEntityType(), $data, false); @@ -178,24 +184,32 @@ class Invitations 'contents' => $this->getIscContents($entity), ]); - $message = new \Laminas\Mail\Message(); + $message = new Message(); - $emailSender = $this->mailSender; + $sender = $this->emailSender->create(); if ($this->smtpParams) { - $emailSender->useSmtp($this->smtpParams); + $sender->withSmtpParams($this->smtpParams); } - $emailSender->send($email, [], $message, [$attachment]); + + $sender + ->withMessage($message) + ->withAttachments([$attachment]) + ->send($email); $this->getEntityManager()->removeEntity($email); } protected function getIscContents(Entity $entity) { - $user = $entity->get('assignedUser'); + $user = $this->entityManager + ->getRepository($entity->getEntityType()) + ->getRelation($entity, 'assignedUser') + ->findOne(); $who = ''; $email = ''; + if ($user) { $who = $user->get('name'); $email = $user->get('emailAddress'); diff --git a/application/Espo/Modules/Crm/Business/Reminder/EmailReminder.php b/application/Espo/Modules/Crm/Business/Reminder/EmailReminder.php index 5d47bd6072..6c57792988 100644 --- a/application/Espo/Modules/Crm/Business/Reminder/EmailReminder.php +++ b/application/Espo/Modules/Crm/Business/Reminder/EmailReminder.php @@ -36,7 +36,7 @@ use Espo\Core\Utils\Util; use Espo\Core\{ ORM\EntityManager, Utils\TemplateFileManager, - Mail\Sender, + Mail\EmailSender, Utils\Config, Htmlizer\Factory as HtmlizerFactory, Utils\Language, @@ -45,7 +45,7 @@ use Espo\Core\{ class EmailReminder { protected $entityManager; - protected $mailSender; + protected $emailSender; protected $config; protected $dateTime; protected $templateFileManager; @@ -55,14 +55,14 @@ class EmailReminder public function __construct( EntityManager $entityManager, TemplateFileManager $templateFileManager, - Sender $mailSender, + EmailSender $emailSender, Config $config, HtmlizerFactory $htmlizerFactory, Language $language ) { $this->entityManager = $entityManager; $this->templateFileManager = $templateFileManager; - $this->mailSender = $mailSender; + $this->emailSender = $emailSender; $this->config = $config; $this->language = $language; $this->htmlizerFactory = $htmlizerFactory; @@ -140,8 +140,6 @@ class EmailReminder $email->set('body', $body); $email->set('isHtml', true); - $emailSender = $this->mailSender; - - $emailSender->send($email); + $this->emailSender->send($email); } } diff --git a/application/Espo/Modules/Crm/Services/Meeting.php b/application/Espo/Modules/Crm/Services/Meeting.php index 3c0ff590b2..8386a480a3 100644 --- a/application/Espo/Modules/Crm/Services/Meeting.php +++ b/application/Espo/Modules/Crm/Services/Meeting.php @@ -105,7 +105,11 @@ class Meeting extends \Espo\Services\Record implements $sentCount = 0; - $users = $entity->get('users'); + $users = $this->getEntityManager() + ->getRepository($entity->getEntityType()) + ->getRelation($entity, 'users') + ->find(); + foreach ($users as $user) { if ($user->id === $this->getUser()->id) { if ($entity->getLinkMultipleColumn('users', 'status', $user->id) === 'Accepted') { @@ -119,7 +123,11 @@ class Meeting extends \Espo\Services\Record implements } } - $contacts = $entity->get('contacts'); + $contacts = $this->getEntityManager() + ->getRepository($entity->getEntityType()) + ->getRelation($entity, 'contacts') + ->find(); + foreach ($contacts as $contact) { if ($contact->get('emailAddress') && !array_key_exists($contact->get('emailAddress'), $emailHash)) { $invitationManager->sendInvitation($entity, $contact, 'contacts'); @@ -128,7 +136,11 @@ class Meeting extends \Espo\Services\Record implements } } - $leads = $entity->get('leads'); + $leads = $this->getEntityManager() + ->getRepository($entity->getEntityType()) + ->getRelation($entity, 'leads') + ->find(); + foreach ($leads as $lead) { if ($lead->get('emailAddress') && !array_key_exists($lead->get('emailAddress'), $emailHash)) { $invitationManager->sendInvitation($entity, $lead, 'leads'); diff --git a/application/Espo/ORM/BaseEntity.php b/application/Espo/ORM/BaseEntity.php index 23958cc5e5..ce565616c2 100644 --- a/application/Espo/ORM/BaseEntity.php +++ b/application/Espo/ORM/BaseEntity.php @@ -152,6 +152,9 @@ class BaseEntity implements Entity // @todo Remove this. if ($this->hasRelation($name) && $this->id && $this->entityManager) { + $e = new \Exception(); + echo $e->getTraceAsString(); + die; trigger_error( "Accessing related records with Entity::get is deprecated. Use \$entityManager->getRelation(...)->find()", E_USER_DEPRECATED diff --git a/application/Espo/Services/EmailNotification.php b/application/Espo/Services/EmailNotification.php index 496cd45542..2bd59e381e 100644 --- a/application/Espo/Services/EmailNotification.php +++ b/application/Espo/Services/EmailNotification.php @@ -41,16 +41,17 @@ use Espo\Core\Utils\Util; use Espo\Core\{ ORM\EntityManager, Htmlizer\Factory as HtmlizerFactory, - Mail\Sender, Utils\Config, Utils\Metadata, Utils\Language, Select\SelectManagerFactory, InjectableFactory, Utils\TemplateFileManager, - Mail\Sender as MailSender, + Mail\EmailSender as EmailSender, }; +use Exception; + class EmailNotification { const HOURS_THERSHOLD = 5; @@ -61,7 +62,7 @@ class EmailNotification protected $entityManager; protected $htmlizerFactory; - protected $mailSender; + protected $emailSender; protected $config; protected $selectManagerFactory; protected $injectableFactory; @@ -71,7 +72,7 @@ class EmailNotification public function __construct( EntityManager $entityManager, HtmlizerFactory $htmlizerFactory, - MailSender $mailSender, + EmailSender $emailSender, Config $config, SelectManagerFactory $selectManagerFactory, InjectableFactory $injectableFactory, @@ -81,7 +82,7 @@ class EmailNotification ) { $this->entityManager = $entityManager; $this->htmlizerFactory = $htmlizerFactory; - $this->mailSender = $mailSender; + $this->emailSender = $emailSender; $this->config = $config; $this->selectManagerFactory = $selectManagerFactory; $this->injectableFactory = $injectableFactory; @@ -174,9 +175,11 @@ class EmailNotification 'parentId' => $entity->id, 'parentType' => $entity->getEntityType() ]); + try { - $this->mailSender->send($email); - } catch (\Exception $e) { + $this->emailSender->send($email); + } + catch (Exception $e) { $GLOBALS['log']->error('EmailNotification: [' . $e->getCode() . '] ' .$e->getMessage()); } } @@ -383,8 +386,9 @@ class EmailNotification } try { - $this->mailSender->send($email); - } catch (\Exception $e) { + $this->emailSender->send($email); + } + catch (Exception $e) { $GLOBALS['log']->error('EmailNotification: [' . $e->getCode() . '] ' .$e->getMessage()); } } @@ -503,6 +507,7 @@ class EmailNotification } $smtpParams = null; + if ($parentId && $parentType && !empty($parent)) { $handler = $this->getEmailNotificationEntityHandler($parentType); if ($handler) { @@ -517,12 +522,16 @@ class EmailNotification } } + $sender = $this->emailSender->create(); + try { if ($smtpParams) { - $this->mailSender->setParams($smtpParams); + $sender->withSmtpParams($smtpParams); } - $this->mailSender->send($email); - } catch (\Exception $e) { + + $sender->send($email); + } + catch (Exception $e) { $GLOBALS['log']->error('EmailNotification: [' . $e->getCode() . '] ' .$e->getMessage()); } } @@ -619,8 +628,9 @@ class EmailNotification ]); try { - $this->mailSender->send($email); - } catch (\Exception $e) { + $this->emailSender->send($email); + } + catch (Exception $e) { $GLOBALS['log']->error('EmailNotification: [' . $e->getCode() . '] ' .$e->getMessage()); } } @@ -704,7 +714,7 @@ class EmailNotification 'body' => $body, 'isHtml' => true, 'to' => $emailAddress, - 'isSystem' => true + 'isSystem' => true, ]); $email->set([ @@ -713,8 +723,9 @@ class EmailNotification ]); try { - $this->mailSender->send($email); - } catch (\Exception $e) { + $this->emailSender->send($email); + } + catch (Exception $e) { $GLOBALS['log']->error('EmailNotification: [' . $e->getCode() . '] ' .$e->getMessage()); } } @@ -722,6 +733,7 @@ class EmailNotification protected function loadParentNameFields(Entity $entity) { $fieldDefs = $this->metadata->get(['entityDefs', $entity->getEntityType(), 'fields'], []); + foreach ($fieldDefs as $field => $defs) { if (isset($defs['type']) && $defs['type'] == 'linkParent') { $entity->loadParentNameField($field);