src/Subscriber/User/Registration/CheckEmailSubscriber.php line 53

Open in your IDE?
  1. <?php
  2. namespace App\Subscriber\User\Registration;
  3. use App\Dictionary\MailProviderStatus;
  4. use App\Entity\Account;
  5. use App\Event\User\RegistrationCheckEmailEvent;
  6. use App\Service\Mail\MogelmailService;
  7. use App\Service\System\MailProviderService;
  8. use App\Service\User\AccountService;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. class CheckEmailSubscriber implements EventSubscriberInterface
  11. {
  12.     /**
  13.      * @var AccountService
  14.      */
  15.     protected $accountService;
  16.     /**
  17.      * @var MogelmailService
  18.      */
  19.     protected $mogelmailService;
  20.     /**
  21.      * @var MailProviderService
  22.      */
  23.     protected $mailProviderService;
  24.     /**
  25.      * CheckEmailSubscriber constructor.
  26.      */
  27.     public function __construct(AccountService $accountServiceMailProviderService $mailProviderService,
  28.         MogelmailService $mogelmailService)
  29.     {
  30.         $this->accountService $accountService;
  31.         $this->mogelmailService $mogelmailService;
  32.         $this->mailProviderService $mailProviderService;
  33.     }
  34.     public static function getSubscribedEvents(): array
  35.     {
  36.         return [
  37.             RegistrationCheckEmailEvent::class => [
  38.                 ['checkStringFormat'100],
  39.                 ['checkAlreadyExistingEmailAddress'95],
  40.                 ['checkDomainIsBlockedByMailProviders'90],
  41.                 ['checkMogelmailSuspected'85],
  42.             ],
  43.         ];
  44.     }
  45.     public function checkStringFormat(RegistrationCheckEmailEvent $event)
  46.     {
  47.         $input $event->getEmail();
  48.         if (!strstr($input'@')) {
  49.             $event->setDeclineReason('Invalid email format.');
  50.             $event->stopPropagation();
  51.         }
  52.     }
  53.     public function checkAlreadyExistingEmailAddress(RegistrationCheckEmailEvent $event)
  54.     {
  55.         $email $event->getEmail();
  56.         if ($this->accountService->findAccountByEmail($email) instanceof Account) {
  57.             $event->setDeclineReason('Email address already taken.');
  58.             $event->stopPropagation();
  59.         }
  60.     }
  61.     public function checkDomainIsBlockedByMailProviders(RegistrationCheckEmailEvent $event)
  62.     {
  63.         $email $event->getEmail();
  64.         $domain $this->mogelmailService->extractDomain($email);
  65.         $provider $this->mailProviderService->findByName($domain);
  66.         if (!$provider) {
  67.             return;
  68.         }
  69.         $status $provider->getBounceStatus();
  70.         if (MailProviderStatus::OK == $status) {
  71.             return;
  72.         }
  73.         foreach (explode("\n"$provider->getDomains()) as $blockedDomain) {
  74.             if ($blockedDomain == $domain) {
  75.                 $event->setDeclineReason('Domain '.$domain.' is blocked ('.$status.').');
  76.                 $event->stopPropagation();
  77.                 return;
  78.             }
  79.         }
  80.     }
  81.     public function checkMogelmailSuspected(RegistrationCheckEmailEvent $event)
  82.     {
  83.         $email $event->getEmail();
  84.         if (!$this->mogelmailService->isEmailSuspectForTrash($email)) {
  85.             return;
  86.         }
  87.         // create provider entity with status
  88.         $this->mogelmailService->triggerSuspectMatch($email);
  89.         $event->setDeclineReason('Email address appears to be suspect of spam.');
  90.         $event->stopPropagation();
  91.     }
  92. }