Magento 2: Restrict customer registration by specific mail extension

In your case, I think we can try with Plugin. The Magento\Customer\Controller\Account\CreatePost controller will execute the customer registration request. So, we can build the logic with this class.

app/code/Company/Module/etc/frontend/di.xml

<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">

    <type name="Magento\Customer\Controller\Account\CreatePost">
        <plugin name="restrictCustomerEmail"
                type="Company\Module\Model\Plugin\Controller\Account\RestrictCustomerEmail"/>
    </type>
</config>

app/code/Company/Module/Model/Plugin/Controller/Account/RestrictCustomerEmail.php

<?php

namespace Company\Module\Model\Plugin\Controller\Account;

use Magento\Framework\Controller\Result\RedirectFactory;
use Magento\Framework\UrlFactory;
use Magento\Framework\Message\ManagerInterface;

class RestrictCustomerEmail
{

    /** @var \Magento\Framework\UrlInterface */
    protected $urlModel;

    /**
     * @var \Magento\Framework\Controller\Result\RedirectFactory
     */
    protected $resultRedirectFactory;

    /**
     * @var \Magento\Framework\Message\ManagerInterface
     */
    protected $messageManager;

    /**
     * RestrictCustomerEmail constructor.
     * @param UrlFactory $urlFactory
     * @param RedirectFactory $redirectFactory
     * @param ManagerInterface $messageManager
     */
    public function __construct(
        UrlFactory $urlFactory,
        RedirectFactory $redirectFactory,
        ManagerInterface $messageManager

    )
    {
        $this->urlModel = $urlFactory->create();
        $this->resultRedirectFactory = $redirectFactory;
        $this->messageManager = $messageManager;
    }

    /**
     * @param \Magento\Customer\Controller\Account\CreatePost $subject
     * @param \Closure $proceed
     * @return mixed
     * @throws \Magento\Framework\Exception\LocalizedException
     */
    public function aroundExecute(
        \Magento\Customer\Controller\Account\CreatePost $subject,
        \Closure $proceed
    )
    {
        /** @var \Magento\Framework\App\RequestInterface $request */
        $email = $subject->getRequest()->getParam('email');
        list($nick, $domain) = explode('@', $email, 2);
        if (in_array($domain, ['163.com', 'mail.ru'], true)) {

            $this->messageManager->addErrorMessage(
                'Registration is disabled for you domain'
            );
            $defaultUrl = $this->urlModel->getUrl('*/*/create', ['_secure' => true]);
            /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */
            $resultRedirect = $this->resultRedirectFactory->create();

            return $resultRedirect->setUrl($defaultUrl);

        }
        return $proceed();
    }
}

NOTE: This way can prevent customer who registers via Front page. It's better if we check before saving customer entity.


You should create plugin on \Magento\Customer\Api\CustomerRepositoryInterface::save method and verify email of customer.

For example:

class Vendor\Module\Plugin\CustomerValidation 
{
     /**
     * Before customer save.
     *
     * @param CustomerRepositoryInterface $customerRepository
     * @param CustomerInterface $customer
     * @param null $passwordHash
     * @return array
     *

     */
    public function beforeSave(
        CustomerRepositoryInterface $customerRepository,
        CustomerInterface $customer,
        $passwordHash = null
    ) {
       list($nick, $domain) = explode('@', $customer->getEmail(), 2);

       if (in_array($domain, ['163.com', 'mail.ru'], true)) {
           throw new \Magento\Framework\Exception\LocalizedException(
                __(
                    'Registration is disabled for you domain'
                )
            );       
        }

        return [$customer, $passwordHash];
    }
}