Spaces:
No application file
No application file
| namespace Mautic\EmailBundle\Model; | |
| use Mautic\CoreBundle\Helper\DateTimeHelper; | |
| use Mautic\EmailBundle\Entity\Stat; | |
| use Mautic\EmailBundle\MonitoredEmail\Search\ContactFinder; | |
| use Mautic\LeadBundle\Entity\DoNotContact as DNC; | |
| use Mautic\LeadBundle\Model\DoNotContact; | |
| class TransportCallback | |
| { | |
| public function __construct( | |
| private DoNotContact $dncModel, | |
| private ContactFinder $finder, | |
| private EmailStatModel $emailStatModel | |
| ) { | |
| } | |
| /** | |
| * @param string $hashId | |
| * @param string $comments | |
| * @param int $dncReason | |
| */ | |
| public function addFailureByHashId($hashId, $comments, $dncReason = DNC::BOUNCED): void | |
| { | |
| $result = $this->finder->findByHash($hashId); | |
| if ($contacts = $result->getContacts()) { | |
| $stat = $result->getStat(); | |
| $this->updateStatDetails($stat, $comments, $dncReason); | |
| $email = $stat->getEmail(); | |
| $channel = ($email) ? ['email' => $email->getId()] : 'email'; | |
| foreach ($contacts as $contact) { | |
| $this->dncModel->addDncForContact($contact->getId(), $channel, $dncReason, $comments); | |
| } | |
| } | |
| } | |
| /** | |
| * @param string $address | |
| * @param string $comments | |
| * @param int $dncReason | |
| * @param int|null $channelId | |
| */ | |
| public function addFailureByAddress($address, $comments, $dncReason = DNC::BOUNCED, $channelId = null): void | |
| { | |
| $result = $this->finder->findByAddress($address); | |
| if ($contacts = $result->getContacts()) { | |
| foreach ($contacts as $contact) { | |
| $channel = ($channelId) ? ['email' => $channelId] : 'email'; | |
| $this->dncModel->addDncForContact($contact->getId(), $channel, $dncReason, $comments); | |
| } | |
| } | |
| } | |
| /** | |
| * @param int $dncReason | |
| * @param int|null $channelId | |
| */ | |
| public function addFailureByContactId($id, $comments, $dncReason = DNC::BOUNCED, $channelId = null): void | |
| { | |
| $channel = ($channelId) ? ['email' => $channelId] : 'email'; | |
| $this->dncModel->addDncForContact($id, $channel, $dncReason, $comments); | |
| } | |
| private function updateStatDetails(Stat $stat, $comments, $dncReason): void | |
| { | |
| if (DNC::BOUNCED === $dncReason) { | |
| $stat->setIsFailed(true); | |
| } | |
| $openDetails = $stat->getOpenDetails(); | |
| if (!isset($openDetails['bounces'])) { | |
| $openDetails['bounces'] = []; | |
| } | |
| $dtHelper = new DateTimeHelper(); | |
| $openDetails['bounces'][] = [ | |
| 'datetime' => $dtHelper->toUtcString(), | |
| 'reason' => $comments, | |
| ]; | |
| $stat->setOpenDetails($openDetails); | |
| $this->emailStatModel->saveEntity($stat); | |
| } | |
| } | |