Я не эксперт I18N, но я был достаточно заинтригован, чтобы провести расследование и найти следующее решение.
Проблема в основном заключается в том, как отправлять почту на интернационализированные доменные имена (IDN), то есть те, которые содержат символы, отличные от ASCII. IDN действительны в настоящее время, но не распознаются многими системами, включая Java (и, следовательно, ColdFusion, который использует проверку Java для адресных полей CFMAIL — отсюда и ошибка, которую вы видите).
Чтобы система распознала IDN, его необходимо преобразовать в форму ASCII, которая называется Punycode. Например, müller.org необходимо преобразовать в xn--müller-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,[email protected]" index="address">
<cfif( NOT IsValid( "email",address ) )>
<cfset address = convertIdnAddress( address )>
</cfif>
<cfmail server="0.0.0.0" from="[email protected]" to="#address#" subject="test">Message</cfmail>
<cfset ArrayAppend( processedAddresses,address )>
</cfloop>
<cfdump var="#processedAddresses#">
Это отправит 2 электронных письма (на несуществующий почтовый сервер) и выгрузит преобразованные адреса:
[email protected]
[email protected]
Примечания:
- Чтобы получить файл jar libidn, загрузите и распакуйте tar и найдите его в каталоге Java.
- Вышеприведенное предполагает, что libidn jar и пакет JavaLoader находятся в той же папке, что и шаблон, содержащий код CF.
- Вышеупомянутое должно работать на CF8 и выше, хотя я тестировал это только на CF9.
- Имейте в виду, что обработка ошибок для адресов, которые могут быть недействительными по причинам, отличным от содержания IDN, не предусмотрена.
person
CfSimplicity
schedule
17.06.2011
<cfmail from="test@äöü.test.com" to="[email protected]" subject="test">Test</cfmail>
работает для меня, как и замена значенийfrom
иto
. Можете ли вы предоставить код и сообщение в файле exception.log? - person orangepips   schedule 15.06.2011