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);