Как отправить электронное письмо получателю с умлаутами в доменном имени?

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

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

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


person balytskyi    schedule 15.06.2011    source источник
comment
Синтаксис <cfmail from="test@äöü.test.com" to="[email protected]" subject="test">Test</cfmail> работает для меня, как и замена значений from и to. Можете ли вы предоставить код и сообщение в файле exception.log?   -  person orangepips    schedule 15.06.2011
comment
Какая версия ColdFusion? 9?   -  person Sean Coyne    schedule 15.06.2011
comment
@orangepips: ты случайно не пользуешься Railo? Я получаю ту же ошибку, что и OP на ACF8 и 9, что ожидается, поскольку ACF использует синтаксический анализатор javax.mail.internet.InternetAddress, который допускает только значения ASCII в соответствии с RFC822 (см. tjordahl.blogspot.com/2006/09/ )   -  person CfSimplicity    schedule 17.06.2011
comment
@CFSimplety: я использую ACF 9.01. Хорошая ссылка из блога Тома Джордала.   -  person orangepips    schedule 17.06.2011
comment
@orangepips. Как странно. Тогда не могу понять, почему вы не видите ошибку.   -  person CfSimplicity    schedule 17.06.2011
comment
Кстати, вот начало трассировки стека из exception.log Error,jrpp-4,06/17/11,08:28:37,, Ошибка проверки атрибута для тега CFMAIL. Значение атрибута для, которое в настоящее время test@äöü.test.com недействителен. Конкретная последовательность включенных или обработанных файлов: C:\Dev\servers\simplicity\webroot\test\index.cfm, строка: 3 coldfusion.tagext.InvalidTagAttributeException: Ошибка проверки атрибута для тега CFMAIL. на coldfusion.tagext.net.MailTag.validate(MailTag.java:666) на coldfusion.tagext.net.MailTag.processAttributes(MailTag.java:766)   -  person CfSimplicity    schedule 17.06.2011


Ответы (2)


Есть еще более простое решение! Почему бы не использовать оракулы, встроенные в класс: 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#

You don´t have to download anything!

person Molnfront    schedule 18.08.2011
comment
Отлично. Я должен был проверить встроенное решение Java. - person CfSimplicity; 20.08.2011

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

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

Чтобы система распознала IDN, его необходимо преобразовать в форму ASCII, которая называется Punycode. Например, müller.org необходимо преобразовать в xn--müller-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,[email protected]" index="address">
    <cfif( NOT IsValid( "email",address ) )>
        <cfset address  =   convertIdnAddress( address )>
    </cfif>
    <cfmail server="0.0.0.0" from="[email protected]" to="#address#" subject="test">Message</cfmail>
    <cfset ArrayAppend( processedAddresses,address )>
</cfloop>
<cfdump var="#processedAddresses#">

Это отправит 2 электронных письма (на несуществующий почтовый сервер) и выгрузит преобразованные адреса:

[email protected]

[email protected]

Примечания:

  1. Чтобы получить файл jar libidn, загрузите и распакуйте tar и найдите его в каталоге Java.
  2. Вышеприведенное предполагает, что libidn jar и пакет JavaLoader находятся в той же папке, что и шаблон, содержащий код CF.
  3. Вышеупомянутое должно работать на CF8 и выше, хотя я тестировал это только на CF9.
  4. Имейте в виду, что обработка ошибок для адресов, которые могут быть недействительными по причинам, отличным от содержания IDN, не предусмотрена.
person CfSimplicity    schedule 17.06.2011
comment
@orangepips. Хорошо, спасибо за предложение - отредактировано. Хотя, если честно, я пытался просто сосредоточиться на форме домена, которая здесь является проблемой. - person CfSimplicity; 17.06.2011