Я не эксперт по I18N, но был достаточно заинтригован, чтобы исследовать и найти следующее решение.
Проблема, по сути, заключается в том, как отправлять почту на интернационализированные доменные имена (IDN), то есть те, которые содержат символы, не входящие в ASCII. IDN действительны в настоящее время, но не распознаются многими системами, включая Java (и, следовательно, ColdFusion, который использует проверку Java для полей адреса CFMAIL - отсюда и ошибка, которую вы видите).
Чтобы система распознала IDN, ее необходимо преобразовать в форму ASCII, которая называется Punycode . Например, müller.org необходимо преобразовать в xn--mller-kva.org
LibIdn - это java-библиотека ОС, которая сделает это, и в следующем коде показано, как вы можете подключить ее к CF с помощью JavaLoader .
Марка Манделя.
<cffunction name="convertIdnToAscii" returntype="string" output="false">
<cfargument name="domain" type="string" required="true">
<cfscript>
var local = {};
// these paths assume the JavaLoader folder and the libidn-1.22.jar are in the same folder as the cfm template.
local.javaLoaderPath = "javaLoader.JavaLoader";
local.idnLibPath = ExpandPath( "libidn-1.22.jar" );
// convert the IDN lib path to an array which is what JavaLoader expects
local.libPathArray = [ local.idnLibPath ];
//load the IDN Lib
loader = CreateObject( "component",local.javaLoaderPath ).init( local.libPathArray );
// create an instance of the IDN lib
local.idn = loader.create( "gnu.inet.encoding.IDNA" ).init();
// convert the domain name
return local.idn.toASCII( arguments.domain );
</cfscript>
</cffunction>
<cffunction name="convertIdnAddress" returntype="string" output="false">
<cfargument name="address" type="string" required="true">
<cfscript>
var local = {};
local.domain = GetToken( arguments.address,2,"@" );
local.converted = convertIdnToAscii( local.domain );
return Replace( arguments.address,local.domain,local.converted );
</cfscript>
</cffunction>
<!--- Loop over a list of addresses and convert them if necessary --->
<cfset processedAddresses = []>
<cfloop list="test@äöü.test.com,test@example.com" index="address">
<cfif( NOT IsValid( "email",address ) )>
<cfset address = convertIdnAddress( address )>
</cfif>
<cfmail server="0.0.0.0" from="sender@mydomain.com" to="#address#" subject="test">Message</cfmail>
<cfset ArrayAppend( processedAddresses,address )>
</cfloop>
<cfdump var="#processedAddresses#">
Это отправит 2 электронных письма (на несуществующий почтовый сервер) и сбросит преобразованные адреса:
test@xn--4ca0bs.test.com
test@example.com
Примечания:
- Чтобы получить файл jar libidn, скачайте и распакуйте tar и найдите его в каталоге Java
- Выше предполагается, что libidn jar и пакет JavaLoader находятся в той же папке, что и шаблон, содержащий код CF
- Вышеуказанное должно работать на CF8 и выше, хотя я проверял только на CF9.
- Имейте в виду, что нет обработки ошибок для адресов, которые могут быть недействительными по причинам, отличным от тех, которые содержат IDN.