MailConfigChecker/Application/Controller/Admin/MailConfigCheck.php
2023-12-11 10:38:59 +01:00

154 lignes
5.6 KiB
PHP

<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
namespace D3\MailConfigChecker\Application\Controller\Admin;
use Assert\Assert;
use Assert\InvalidArgumentException;
use D3\MailConfigChecker\Application\Model\Exception\d3TranslatableLazyAssertionException;
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\Email;
use OxidEsales\Eshop\Core\Registry;
class MailConfigCheck extends AdminDetailsController
{
protected $_sThisTemplate = 'mailConfigCheck.tpl';
public function render()
{
$this->checkDataAreSet();
$this->addTplParam('shop', Registry::getConfig()->getActiveShop());
return parent::render();
}
protected function checkDataAreSet()
{
try {
/** @var Shop $shop */
$shop = Registry::getConfig()->getActiveShop();
$lang = Registry::getLang();
Assert::lazy()
->setExceptionClass(d3TranslatableLazyAssertionException::class)
->that( $shop->getFieldData( 'oxsmtp' ), $lang->translateString('SHOP_MAIN_SMTPSERVER') )
->notBlank( $lang->translateString('D3_ASSERTIONS_NOTSET') )
->regex( '/.*:(587|2525)$/m', $lang->translateString('D3_ASSERTIONS_NOPORT') )
->that( 'cloud1-vm279.de-nserver.de:5', $lang->translateString('SHOP_MAIN_SMTPSERVER') )
->notBlank( $lang->translateString('D3_ASSERTIONS_NOTSET') )
->regex( '/.*:(587|2525)$/m', $lang->translateString('D3_ASSERTIONS_NOPORT') )
->that( $shop->getFieldData( 'oxsmtpuser' ), $lang->translateString('SHOP_MAIN_SMTPUSER') )
->notBlank( $lang->translateString('D3_ASSERTIONS_NOTSET') )
->that( $shop->getFieldData( 'oxsmtppwd' ), $lang->translateString('SHOP_MAIN_SMTPPASSWORD') )
->notBlank( $lang->translateString('D3_ASSERTIONS_NOTSET') )
->that( $shop->getFieldData( 'oxinfoemail' ), $lang->translateString('SHOP_MAIN_INFOEMAIL') )
->email( $lang->translateString('D3_ASSERTIONS_NOTSET') )
->that( $shop->getFieldData( 'oxorderemail' ), $lang->translateString('SHOP_MAIN_ORDEREMAIL') )
->email( $lang->translateString('D3_ASSERTIONS_NOTSET') )
->that( $shop->getFieldData( 'oxowneremail' ), $lang->translateString('SHOP_MAIN_OWNEREMAIL') )
->email( $lang->translateString('D3_ASSERTIONS_NOTSET') )
->verifyNow();
} catch (InvalidArgumentException $e) {
Registry::getUtilsView()->addErrorToDisplay(nl2br($e->getMessage()));
}
}
public function checkConfiguration()
{
dumpvar('');
dumpvar('');
dumpvar('');
dumpVar('');
$this->useSmtp();
$this->checkSpf();
}
protected function useSmtp()
{
try {
echo "<h3>Mailer Check</h3>";
$mail = oxNew( Email::class );
$mail->setRecipient( 'test@example.com' );
$mail->setBody('.');
$mail->send();
dumpvar( 'Shop sendet ueber '.ucfirst($mail->getMailer()) );
} catch (\Exception $e) {
dumpvar($e->getMessage());
}
}
protected function checkSpf()
{
echo "<h3>SPF Check</h3>";
$mailDomains = $this->getMailDomains();
array_walk(
$mailDomains,
function($domain) {
dumpvar('<b>'.$domain.'</b>');
$this->checkSpfByDomain($domain);
}
);
}
protected function checkSpfByDomain($domain)
{
$checker = new SPFCheck(new DNSRecordGetter());
$query = new Query('', $domain);
$result = $checker->getResult($query);
if (in_array(
$result->getResult(),
[Result::FAIL, Result::NEUTRAL, Result::PASS, Result::SOFTFAIL]
)) {
dumpvar('SPF is set');
} elseif (Result::NONE) {
dumpvar('SPF missing');
} else {
dumpvar('error determine SPF record');
}
if ($record = $result->getRecord()) {
dumpvar($record->getRawRecord());
}
}
protected function getMailDomains()
{
return
array_filter(
array_unique(
array_map(
function($mailAddress) {
$mailAddress = trim($mailAddress);
return strstr($mailAddress, '@') ?
array_pop(explode('@', $mailAddress)) :
'';
},
[
Registry::getConfig()->getActiveShop()->getFieldData('oxinfoemail'),
Registry::getConfig()->getActiveShop()->getFieldData('oxorderemail'),
Registry::getConfig()->getActiveShop()->getFieldData('oxowneremail'),
]
)
)
);
}
}