私のアプリでは、ドメイン名にウムラウトがある受信者にメールを送信する必要があります。例:「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はCFMAILアドレスフィールドにJava検証を使用します-したがって、表示されるエラーです)。
システムがIDNを認識するためには、 Punycodeと呼ばれるASCII形式に変換する必要があります。たとえば、müller.orgをxn--mller-kva.orgに変換する必要があります
LibIdnはこれを行うOSJavaライブラリであり、次のコードは、MarkMandelの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
ノート: