Как отправить письмо получателю с помощью умлаутса в доменном имени? - PullRequest
7 голосов
/ 15 июня 2011

В моем приложении я должен отправить электронное письмо получателю, у которого умлаутс в имени домена. Пример: "Test@äöü.test.com"

Я использую тэг cfmail и получаю такую ​​ошибку: msgstr "неверное определение для атрибута на почту тега" «Неверное определение адреса электронной почты (test@äöü.test.com)»

Есть ли способ отправить электронное письмо таким получателям в coldfusion?

Ответы [ 2 ]

5 голосов
/ 18 августа 2011

Существует даже более простое решение!Почему бы не использовать встроенные в класс Oracle?Не нужно ничего скачивать!

3 голосов
/ 17 июня 2011

Я не эксперт по I18N, но был достаточно заинтригован, чтобы исследовать и найти следующее решение.

Проблема, по сути, заключается в том, как отправлять почту на интернационализированные доменные имена (IDN), то есть те, которые содержат символы, не входящие в ASCII. IDN действительны в настоящее время, но не распознаются многими системами, включая Java (и, следовательно, ColdFusion, который использует проверку Java для полей адреса CFMAIL - отсюда и ошибка, которую вы видите).

Чтобы система распознала IDN, ее необходимо преобразовать в форму ASCII, которая называется Punycode . Например, müller.org необходимо преобразовать в xn--mller-kva.org

LibIdn - это java-библиотека ОС, которая сделает это, и в следующем коде показано, как вы можете подключить ее к CF с помощью JavaLoader .

Марка Манделя.
<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. Чтобы получить файл jar libidn, скачайте и распакуйте tar и найдите его в каталоге Java
  2. Выше предполагается, что libidn jar и пакет JavaLoader находятся в той же папке, что и шаблон, содержащий код CF
  3. Вышеуказанное должно работать на CF8 и выше, хотя я проверял только на CF9.
  4. Имейте в виду, что нет обработки ошибок для адресов, которые могут быть недействительными по причинам, отличным от тех, которые содержат IDN.
...