EmailSenderHandler.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Sales\Model;
  7. use Magento\Sales\Model\Order\Email\Container\IdentityInterface;
  8. /**
  9. * Sales emails sending
  10. *
  11. * Performs handling of cron jobs related to sending emails to customers
  12. * after creation/modification of Order, Invoice, Shipment or Creditmemo.
  13. */
  14. class EmailSenderHandler
  15. {
  16. /**
  17. * Email sender model.
  18. *
  19. * @var \Magento\Sales\Model\Order\Email\Sender
  20. */
  21. protected $emailSender;
  22. /**
  23. * Entity resource model.
  24. *
  25. * @var \Magento\Sales\Model\ResourceModel\EntityAbstract
  26. */
  27. protected $entityResource;
  28. /**
  29. * Entity collection model.
  30. *
  31. * @var \Magento\Sales\Model\ResourceModel\Collection\AbstractCollection
  32. */
  33. protected $entityCollection;
  34. /**
  35. * Global configuration storage.
  36. *
  37. * @var \Magento\Framework\App\Config\ScopeConfigInterface
  38. */
  39. protected $globalConfig;
  40. /**
  41. * @var IdentityInterface
  42. */
  43. private $identityContainer;
  44. /**
  45. * @var \Magento\Store\Model\StoreManagerInterface
  46. */
  47. private $storeManager;
  48. /**
  49. * @param \Magento\Sales\Model\Order\Email\Sender $emailSender
  50. * @param \Magento\Sales\Model\ResourceModel\EntityAbstract $entityResource
  51. * @param \Magento\Sales\Model\ResourceModel\Collection\AbstractCollection $entityCollection
  52. * @param \Magento\Framework\App\Config\ScopeConfigInterface $globalConfig
  53. * @param IdentityInterface|null $identityContainer
  54. * @param \Magento\Store\Model\StoreManagerInterface $storeManager
  55. * @throws \InvalidArgumentException
  56. */
  57. public function __construct(
  58. \Magento\Sales\Model\Order\Email\Sender $emailSender,
  59. \Magento\Sales\Model\ResourceModel\EntityAbstract $entityResource,
  60. \Magento\Sales\Model\ResourceModel\Collection\AbstractCollection $entityCollection,
  61. \Magento\Framework\App\Config\ScopeConfigInterface $globalConfig,
  62. IdentityInterface $identityContainer = null,
  63. \Magento\Store\Model\StoreManagerInterface $storeManager = null
  64. ) {
  65. $this->emailSender = $emailSender;
  66. $this->entityResource = $entityResource;
  67. $this->entityCollection = $entityCollection;
  68. $this->globalConfig = $globalConfig;
  69. $this->identityContainer = $identityContainer ?: \Magento\Framework\App\ObjectManager::getInstance()
  70. ->get(\Magento\Sales\Model\Order\Email\Container\NullIdentity::class);
  71. $this->storeManager = $storeManager ?: \Magento\Framework\App\ObjectManager::getInstance()
  72. ->get(\Magento\Store\Model\StoreManagerInterface::class);
  73. }
  74. /**
  75. * Handles asynchronous email sending
  76. * @return void
  77. */
  78. public function sendEmails()
  79. {
  80. if ($this->globalConfig->getValue('sales_email/general/async_sending')) {
  81. $this->entityCollection->addFieldToFilter('send_email', ['eq' => 1]);
  82. $this->entityCollection->addFieldToFilter('email_sent', ['null' => true]);
  83. $this->entityCollection->setPageSize(
  84. $this->globalConfig->getValue('sales_email/general/sending_limit')
  85. );
  86. /** @var \Magento\Store\Api\Data\StoreInterface[] $stores */
  87. $stores = $this->getStores(clone $this->entityCollection);
  88. /** @var \Magento\Store\Model\Store $store */
  89. foreach ($stores as $store) {
  90. $this->identityContainer->setStore($store);
  91. if (!$this->identityContainer->isEnabled()) {
  92. continue;
  93. }
  94. $entityCollection = clone $this->entityCollection;
  95. $entityCollection->addFieldToFilter('store_id', $store->getId());
  96. /** @var \Magento\Sales\Model\AbstractModel $item */
  97. foreach ($entityCollection->getItems() as $item) {
  98. if ($this->emailSender->send($item, true)) {
  99. $this->entityResource->save(
  100. $item->setEmailSent(true)
  101. );
  102. }
  103. }
  104. }
  105. }
  106. }
  107. /**
  108. * Get stores for given entities.
  109. *
  110. * @param ResourceModel\Collection\AbstractCollection $entityCollection
  111. * @return \Magento\Store\Api\Data\StoreInterface[]
  112. * @throws \Magento\Framework\Exception\NoSuchEntityException
  113. */
  114. private function getStores(
  115. \Magento\Sales\Model\ResourceModel\Collection\AbstractCollection $entityCollection
  116. ): array {
  117. $stores = [];
  118. $entityCollection->addAttributeToSelect('store_id')->getSelect()->group('store_id');
  119. /** @var \Magento\Sales\Model\EntityInterface $item */
  120. foreach ($entityCollection->getItems() as $item) {
  121. /** @var \Magento\Store\Model\StoreManagerInterface $store */
  122. $store = $this->storeManager->getStore($item->getStoreId());
  123. $stores[$item->getStoreId()] = $store;
  124. }
  125. return $stores;
  126. }
  127. }