在我的应用程序中,我必须向域名中有变音符号的收件人发送电子邮件。示例:“test@äöü.test.com”
我正在使用 cfmail 标记,我收到这样的错误:“标记邮件的属性定义无效”“电子邮件地址定义无效 (test@äöü.test.com)”
有没有办法在coldfusion中向这些收件人发送电子邮件?
在我的应用程序中,我必须向域名中有变音符号的收件人发送电子邮件。示例:“test@äöü.test.com”
我正在使用 cfmail 标记,我收到这样的错误:“标记邮件的属性定义无效”“电子邮件地址定义无效 (test@äöü.test.com)”
有没有办法在coldfusion中向这些收件人发送电子邮件?
甚至还有更简单的解决方案!为什么不使用内置类的 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#
你不必下载任何东西!
我不是 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
笔记: