8

在我的应用程序中,我必须向域名中有变音符号的收件人发送电子邮件。示例:“test@äöü.test.com”

我正在使用 cfmail 标记,我收到这样的错误:“标记邮件的属性定义无效”“电子邮件地址定义无效 (test@äöü.test.com)”

有没有办法在coldfusion中向这些收件人发送电子邮件?

4

2 回答 2

6

甚至还有更简单的解决方案!为什么不使用内置类的 Oracle:http: //download.oracle.com/javase/6/docs/api/java/net/IDN.html#toUnicode (java.lang.String )

然后你只需要这样做(示例显示从 punycode 到 Unicode):

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

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

<cfoutput>
#jUrl#

你不必下载任何东西!

于 2011-08-18T12:56:44.690 回答
3

我不是 I18N 专家,但我很感兴趣,可以调查并提出以下解决方案。

问题本质上是如何将邮件发送到国际化域名 (IDN),即那些包含非 ASCII 字符的域名。IDN 现在是有效的,但包括 Java 在内的许多系统都无法识别(因此 ColdFusion,它使用 Java 验证 CFMAIL 地址字段 - 因此您看到的错误)。

对于识别 IDN 的系统,需要将其转换为称为Punycode的 ASCII 形式。例如müller.org需要转换为xn--mler-kva.org

LibIdn是一个操作系统 java 库,它将执行此操作,以下代码显示了如何使用 Mark Mandel 的JavaLoader将其连接到CF。

<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

笔记:

  1. 要获取 libidn jar 文件,请下载并解压缩 tar 并在 Java 目录中查找它
  2. 以上假设 libidn jar 和 JavaLoader 包与包含 CF 代码的模板位于同一文件夹中
  3. 以上应该适用于CF8及以上,虽然我只在CF9上测试过。
  4. 请注意,对于可能由于包含 IDN 以外的其他原因而无效的地址,没有错误处理。
于 2011-06-17T11:07:32.887 回答