【问题标题】:How to send email to recipient with umlauts in domain name?如何使用域名中的变音符号向收件人发送电子邮件?
【发布时间】:2011-06-15 10:42:14
【问题描述】:

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

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

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

【问题讨论】:

  • 语法 <cfmail from="test@äöü.test.com" to="email@test.com" subject="test">Test</cfmail> 对我有用,就像交换 fromto 值一样。能否在 exception.log 中提供代码和消息?
  • 什么版本的 ColdFusion? 9?
  • @orangepips:您是否有机会使用 Railo?我得到与 ACF8 和 9 上的 OP 相同的错误,这是预料之中的,因为 ACF 使用 javax.mail.internet.InternetAddress 解析器,它只允许按照 RFC822 的 ASCII 值(参见tjordahl.blogspot.com/2006/09/…
  • @CFSimplicty:我使用的是 ACF 9.01。来自 Tom Jordahl 博客的好链接。
  • @orangepips。多么奇怪。想不出为什么你没有看到错误。

标签: email coldfusion cfmail


【解决方案1】:

还有更简单的解决方案!为什么不使用内置的 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#

您不必下载任何东西!

【讨论】:

  • 优秀。我应该检查一下内置的 Java 解决方案。
【解决方案2】:

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

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

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

LibIdn 是一个 OS 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 以外的其他原因而无效的地址,没有错误处理。

【讨论】:

  • @orangepips。好的,感谢您的建议 - 已编辑。虽然老实说,我只是想把注意力集中在域的形式上,这就是这里的问题。
猜你喜欢
  • 2010-12-29
  • 2019-03-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2012-05-18
相关资源
最近更新 更多