2011-06-15 51 views
7

En mi aplicación, tengo que enviar un correo electrónico al destinatario que tiene umlauts en el nombre de dominio. Ejemplo: "[email protected]äöü.test.com"¿Cómo enviar un correo electrónico al destinatario con diéresis en el nombre de dominio?

estoy usando la etiqueta CFMAIL y yo estoy poniendo dicho error: "definición no válido para el atributo de correo en la etiqueta" "definición de Dirección no válida de correo electrónico ([email protected]äöü.test.com) "

¿Hay alguna forma de enviar correos electrónicos a dichos destinatarios en coldfusion?

+2

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

+0

¿Qué versión de ColdFusion? 9? –

+1

@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

Respuesta

5

¡Incluso hay una solución más fácil! Por qué no utilizar los oráculos construida en clase: http://download.oracle.com/javase/6/docs/api/java/net/IDN.html#toUnicode(java.lang.String)

Entonces sólo tiene que hacer esto (el ejemplo muestra de punycode a Unicode):

<cfset strUrl = "xn--land-poa.se" /> 

<!--- Create a Java URL. ---> 
<cfset jUrl = CreateObject("java", "java.net.IDN").toUnicode(strUrl) /> 

<cfoutput> 
#jUrl# 

deseados, sin tener que descargar nada !

+0

Excelente. Debería haber verificado una solución Java integrada. – CfSimplicity

3

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:

  1. para obtener el archivo jar libidn, descargar y extraer el alquitrán y buscar en el directorio de Java
  2. 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
  3. Lo anterior debería funcionar en CF8 y superior, aunque solo lo he probado en CF9.
  4. 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.
+1

@orangepips. OK gracias por la sugerencia - editado. Aunque para ser honesto, solo estaba tratando de centrarme en la forma del dominio que es el problema aquí. – CfSimplicity

Cuestiones relacionadas