AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.02.2016, 12:49   #1  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Проблема отправки email на адреса с кириллицей (Ax2009)
При попытке отправки почты из Ax (версия 2009) с использованием встроенного класса SysMailer возникает ошибка при указании адреса электронной почты на кириллице (например user@компания.рф)

Получаем ошибку 501 5.1.3 Invalid Address.

SysMailer использует для отправки COM объект "CDO.Message". Кто нибудь сталкивался с проблемой ?
У меет ли вообще "CDO.Message" отправлять птсьма на адреса электронной почты на кириллице ?
Какие варианты решения проблемы ? Переводить отправку на NET ?
Подскажите, какую библиотеку отправки почты используют в AX2012 ?
Старый 11.02.2016, 13:44   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
В AX2012 SysMailer остался без изменений. Перевести отправку на .NET довольно просто, вот тут был готовый пример.
За это сообщение автора поблагодарили: someOne (3).
Старый 11.02.2016, 15:15   #3  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Спасибо. Проверил этот способ.

Вот в этом месте

X++:
     mailAddressCollection = mailMessage.get_To();
        try
        {
            mailAddressCollection.Add(mailTo);
        }
        catch
        {
            error(aifUtil::getClrErrorMessage());
        }
При попытке добавить адрес получателя, например "kjs@ааа.рф" получаем исключение:
The specified string is not in the form required for an e-mail address.

Похоже эта штука тоже не работает с кириллицей.

Стоит отметить что через outlook письма на эти адреса - отправляются!
Старый 11.02.2016, 15:26   #4  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
IdnMapping
X++:
// The example displays the following output:
//    bücher.com --> xn--bcher-kva.com --> bücher.com
//    Original: U+0062 U+00FC U+0063 U+0068 U+0065 U+0072 U+002E U+0063 U+006F U+006D
//    Restored: U+0062 U+00FC U+0063 U+0068 U+0065 U+0072 U+002E U+0063 U+006F U+006D
//    
//    мойдомен.рф --> xn--d1acklchcc.xn--p1ai --> мойдомен.рф
//    Original: U+043C U+043E U+0439 U+0434 U+043E U+043C U+0435 U+043D U+002E U+0440 U+0444
//    Restored: U+043C U+043E U+0439 U+0434 U+043E U+043C U+0435 U+043D U+002E U+0440 U+0444
//
__________________
За это сообщение автора поблагодарили: AlGol (2), Damn (2), someOne (3).
Старый 16.02.2016, 13:26   #5  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
В продолжении темы.

Действительно, предложенный способ конвертации, похоже, помогает решить проблему

X++:
    System.Globalization.IdnMapping         idn;
    str ret;
    ;
    try
    {
        idn = new System.Globalization.IdnMapping();
        ret = idn.GetAscii("письмо.рф");
    }
    catch
    {
        error(AifUtil::getClrErrorMessage());
    }
На выходе получаем "xn--h1aigbl0e.xn--p1ai", после чего этот адрес уже можно передавать функции

X++:
mailAddressCollection.Add(mailTo);

Это все имеет смысл делать для NET3.5 (Ax2009)

В более поздних версиях NET (4.5 например) этой конвертации не требуется - функция mailAddressCollection.Add принимает на вход кириллицу без конвертации (видимо конвертацию встроили внутрь)

В результате выясняется, что ошибка " 501 5.1.3 Invalid Address." является, скорее всего ошибкой, возвращаемой используемым SMTP сервером, а не почтовым клиентом, используемым в Ax.

По крайней мере, в итоге оба варианта (NET и COM "CDO.Message") возвращают одну и ту же ошибку.

Будем обновлять (менять) SMTP сервер...
За это сообщение автора поблагодарили: Ruff (2).
Старый 28.02.2016, 16:55   #6  
someOne is offline
someOne
Участник
Аватар для someOne
 
174 / 432 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
В итоге, проблему решил таким образом:

- создать новую статичную функцию преобразования кириллических доменов в email адресах

X++:
// Преобразовать email содержащий кириллические символы в домене получателя
static client server str convertEmailCyr(str _email)
{
    int     pos;
    str     domain;
    str     user;
    str     ret;
    System.Globalization.IdnMapping         idn;
    int     len;
    ;
    len = strLen(_email);

    if (subStr(_email, len - 1, 2) != "рф")
        return _email;

    pos = strfind(_email, "@", 1, len);

    if (pos == 0)
        return _email; // это странно

    user = subStr(_email, 1, pos - 1);

    domain = subStr(_email, pos + 1, len - pos);

    new InteropPermission(InteropKind::ClrInterop).assert();

    try
    {
        idn = new System.Globalization.IdnMapping();
        domain = idn.GetAscii(domain);
    }
    catch
    {
        return _email;
    }


    ret = strFmt("%1@%2", user, domain);

    return ret;
}
- далее вставить эту функцию в метод класса SysMailerAddressField
X++:
// Add item to the collection
void appendAddress(str addr, str name='')
{
    str address;
    str addresses;
    ;
    // new
    addr = convertEmailCyr(addr);

    if (prmisdefault(name))
    {
        address = addr;
    }
    else
    {
        address = name + '[' + addr + ']';
    }

...
После чего почту можно отправлять на кириллические адреса из AX2009
За это сообщение автора поблагодарили: gl00mie (2).
Старый 28.02.2016, 18:36   #7  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Цитата:
Сообщение от someOne Посмотреть сообщение
if (subStr(_email, len - 1, 2) != "рф")
return _email;
Если это не "образец", а окончательная редакция кода, то не забудьте про .рус, .укр, .бел, .москва, .дети, .сайт, .онлайн и т.д. Полный список наверно можно нагуглить где-нить на сайте ICANN, а с учетом того, что домены первого уровня теперь продают почти всем желающим, может быть стоит сделать более универсальную проверку на кириллицу? Или вообще не делать, ведь латиница в Punycode остается без изменений...
За это сообщение автора поблагодарили: someOne (5).
Теги
email кириллицей, кирилица

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
И снова проблема с кодировкой русских email в Ax2009 mikki_messer DAX: Программирование 17 09.09.2015 09:28
emeadaxsupport: Sending email notifications for Retail orders [AX 2012 R2 and R3] Blog bot DAX Blogs 0 17.03.2015 00:11
Проверка корректности формата SMTP-адреса email gl00mie DAX: Программирование 1 11.03.2013 16:51
Проблема с выгрузкой отчетов Reporting Services в AX2009 oleg_e DAX: Администрирование 14 18.01.2012 19:08
Проверка существования email-адреса в Active Directory через ADSI gl00mie DAX: Программирование 0 13.01.2012 15:19
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:33.