在我的应用中,我必须向拥有域名变音符号的收件人发送电子邮件。 例: “test@äöü.test.com”
我正在使用cfmail标记,但是我收到了这样的错误: “标签邮件属性的无效定义” “无效的电子邮件地址定义(test@äöü.test.com)”
有没有办法在coldfusion中向这些收件人发送电子邮件?
答案 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
注意: