|
![]() |
#1 |
Дмитрий Ерин
|
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). |
![]() |
#2 |
Участник
|
В продолжении темы.
Действительно, предложенный способ конвертации, похоже, помогает решить проблему X++: System.Globalization.IdnMapping idn; str ret; ; try { idn = new System.Globalization.IdnMapping(); ret = idn.GetAscii("письмо.рф"); } catch { error(AifUtil::getClrErrorMessage()); } 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). |
![]() |
#3 |
Участник
|
В итоге, проблему решил таким образом:
- создать новую статичную функцию преобразования кириллических доменов в 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; } 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 + ']'; } ... |
|
|
За это сообщение автора поблагодарили: gl00mie (2). |
![]() |
#4 |
Дмитрий Ерин
|
Если это не "образец", а окончательная редакция кода, то не забудьте про .рус, .укр, .бел, .москва, .дети, .сайт, .онлайн и т.д. Полный список наверно можно нагуглить где-нить на сайте ICANN, а с учетом того, что домены первого уровня теперь продают почти всем желающим, может быть стоит сделать более универсальную проверку на кириллицу? Или вообще не делать, ведь латиница в Punycode остается без изменений...
|
|
|
За это сообщение автора поблагодарили: someOne (5). |
Теги |
email кириллицей, кирилица |
|
|