На данный момент проверка почты происходит как на стороне клиента, так и на стороне сервера.

перед проверкой адрес переводится в punycode, но почему то, переводится только его доменная часть.

 

Для стороны сервера, сласс определен в файле  \libraries\joomla\string\punycode.php

В методе emailToPunycode

	public static function emailToPunycode($email)
	{
		$explodedAddress = explode('@', $email);

		// Not addressing UTF-8 user names
		$newEmail = $explodedAddress[0];

		if (!empty($explodedAddress[1]))
		{
			$domainExploded = explode('.', $explodedAddress[1]);
			$newdomain = '';

			foreach ($domainExploded as $domainex)
			{
				$domainex = static::toPunycode($domainex);
				$newdomain .= $domainex . '.';
			}

			$newdomain = substr($newdomain, 0, -1);
			$newEmail = $newEmail . '@' . $newdomain;
		}

		return $newEmail;
	}

Обратное преобразование происходит в методе emailToUTF8:

	public static function emailToUTF8($email)
	{
		$explodedAddress = explode('@', $email);

		// Not addressing UTF-8 user names
		$newEmail = $explodedAddress[0];

		if (!empty($explodedAddress[1]))
		{
			$domainExploded = explode('.', $explodedAddress[1]);
			$newdomain = '';

			foreach ($domainExploded as $domainex)
			{
				$domainex = static::fromPunycode($domainex);
				$newdomain .= $domainex . '.';
			}

			$newdomain = substr($newdomain, 0, -1);
			$newEmail = $newEmail . '@' . $newdomain;
		}

		return $newEmail;
	}

Их надо отредактироват следующим образом:

В методе emailToPunycode
надо поменять строку

$newEmail = $explodedAddress[0];

на:

$newEmail = static::toPunycode($explodedAddress[0]);

В методе emailToUTF8 строку:

$newEmail = $explodedAddress[0];

На:

$newEmail = static::fromPunycode($explodedAddress[0]);

 

Для стороны клиента надо редактировать файл \media\system\js\punycode.js , но он сжат, поэтому предварительно в него надо перенести содержимое из файла \media\system\js\punycode-uncompressed.js и изменить метод mapDomain

	function mapDomain(string, fn) {
		var parts = string.split('@');
		var result = '';
		if (parts.length > 1) {
			// In email addresses, only the domain name should be punycoded. Leave
			// the local part (i.e. everything up to `@`) intact.
			result = parts[0] + '@';
			string = parts[1];
		}
		// Avoid `split(regex)` for IE8 compatibility. See #17.
		string = string.replace(regexSeparators, '\x2E');
		var labels = string.split('.');
		var encoded = map(labels, fn).join('.');
		return result + encoded;
	}

Строку:

result = parts[0] + '@';

надо изменить на:

result = fn(parts[0]) + '@';

Все это надо делать с помощью плагина для восстановления хаков, чтобы не слетела при обновлении.