No soy experto en I18N pero estaba lo suficientemente intrigado como para investigar y llegar a la siguiente solución.
El problema es esencialmente cómo enviar correo a Nombres de dominio internacionalizados (IDN), es decir, aquellos que contienen caracteres no ASCII. Los IDN son válidos hoy en día, pero no son reconocidos por muchos sistemas, incluido Java (y, por lo tanto, ColdFusion, que usa la validación de Java para campos de direcciones CFMAIL, de ahí el error que está viendo).
Para que un sistema reconozca un IDN, debe convertirse a un formato ASCII llamado Punycode. Por ejemplo müller.org necesita ser convertida a xn--mller-kva.org
LibIdn es una biblioteca de Java sistema operativo que va a hacer esto y el código siguiente muestra cómo puede conectarlo a CF usando Mark Mandel's 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="[email protected]äöü.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#">
Esto enviará correos electrónicos (2 a un servidor de correo inexistente) y volcar las direcciones convertidos:
[email protected]
[email protected]
Notas:
- para obtener el archivo jar libidn, descargar y extraer el alquitrán y buscar en el directorio de Java
- Lo anterior supone que el paquete libidn y el paquete JavaLoader se encuentran en la misma carpeta que la plantilla que contiene el código CF
- Lo anterior debería funcionar en CF8 y superior, aunque solo lo he probado en CF9.
- Tenga en cuenta que no se manejan errores para las direcciones que pueden ser inválidas por razones distintas a las que contienen un IDN.
La sintaxis ' Prueba ' funciona para mí al igual que el intercambio de 'from' y' to 'valores. ¿Puedes proporcionar el código y el mensaje en exception.log? –
orangepips
¿Qué versión de ColdFusion? 9? –
@orangepips: ¿estás usando Railo por casualidad? Recibo el mismo error que el OP en ACF8 y 9, que se espera porque ACF usa el analizador javax.mail.internet.InternetAddress que solo permite valores ASCII según RFC822 (ver http://tjordahl.blogspot.com/2006/ 09/coldfusion-email-validation-isvalid.html) – CfSimplicity