* @link https://www.oxidmodule.com */ declare(strict_types=1); namespace D3\MailConfigChecker\Application\Controller\Admin; use Assert\InvalidArgumentException; use D3\MailConfigChecker\Application\Model\SpfResult; use Mika56\SPFCheck\DNS\DNSRecordGetter; use Mika56\SPFCheck\Model\Query; use Mika56\SPFCheck\Model\Result; use Mika56\SPFCheck\SPFCheck; use OxidEsales\Eshop\Application\Controller\Admin\AdminDetailsController; use OxidEsales\Eshop\Application\Model\Shop; use OxidEsales\Eshop\Core\Registry; class SpfChecker extends AdminDetailsController { protected $_sThisTemplate = 'spfCheck.tpl'; public function render() { $this->checkSpf(); return parent::render(); } protected function checkSpf() { $result = []; $mailDomains = $this->getMailDomains(); array_walk( $mailDomains, function ($domain) use (&$result) { $this->checkSpfByDomain($domain, $result); } ); $this->addTplParam('result', $result); } protected function getMailDomains() { /** @var Shop $shop */ $shop = Registry::getConfig()->getActiveShop(); return array_filter( array_unique( array_map( function ($mailAddress) { $mailAddress = trim($mailAddress); try { if (! strstr($mailAddress, '@')) { throw oxNew(InvalidArgumentException::class); } $addressChunks = explode('@', $mailAddress); return array_pop($addressChunks); } catch (InvalidArgumentException $e) { return ''; } }, [ $shop->getFieldData('oxinfoemail'), $shop->getFieldData('oxorderemail'), $shop->getFieldData('oxowneremail'), ] ) ) ); } protected function checkSpfByDomain($domain, &$summarize) { $checker = new SPFCheck(new DNSRecordGetter()); $query = new Query('', $domain); $result = $checker->getResult($query); switch ($result->getResult()) { case Result::FAIL: case Result::NEUTRAL: case Result::PASS: case Result::SOFTFAIL: $status = SpfResult::SET; break; case Result::NONE: $status = SpfResult::MISSING; break; default: $status = SpfResult::ERROR; } $rawRecord = ($record = $result->getRecord()) ? $record->getRawRecord() : null; $summarize[$domain] = oxNew(SpfResult::class, $status, $rawRecord); } public function getSpfStatusColor(SpfResult $result) { switch ($result->getStatus()) { case SpfResult::SET: return 'success'; case SpfResult::ERROR: return 'warning'; default: return 'danger'; } } }