8

私のアプリでは、ドメイン名にウムラウトがある受信者にメールを送信する必要があります。例:「test@äöü.test.com」

cfmailタグを使用していますが、「タグメールの属性の定義が無効です」「電子メールアドレスの定義が無効です(test@äöü.test.com)」というエラーが表示されます。

ColdFusionでそのような受信者にメールを送信する方法はありますか?

4

2 に答える 2

6

さらに簡単な解決策があります!クラスに組み込まれた 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#

何もダウンロードする必要はありません!

于 2011-08-18T12:56:44.690 に答える
3

私は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

ノート:

  1. libidn jarファイルを取得するには、tarをダウンロードして解凍し、Javaディレクトリで探します。
  2. 上記は、libidn jarとJavaLoaderパッケージが、CFコードを含むテンプレートと同じフォルダーにあることを前提としています。
  3. 上記はCF8以降で機能するはずですが、私はCF9でのみテストしました。
  4. IDNが含まれている以外の理由で無効になる可能性のあるアドレスには、エラー処理がないことに注意してください。
于 2011-06-17T11:07:32.887 に答える