如何使用域名中的变音符号向收件人发送电子邮件?

时间:2011-06-15 10:42:15

标签: email coldfusion cfmail

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

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

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

2 个答案:

答案 0 :(得分:5)

甚至还有一个更简单的解决方案!为什么不使用课堂上建造的Oracles: 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#

你不必下载任何东西!

答案 1 :(得分:3)

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

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

要使系统识别IDN,需要将其转换为名为Punycode的ASCII表单。例如,müller.org需要转换为 xn--mller-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之外的其他原因可能无效的地址没有错误处理。