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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.03.2012, 11:25   #1  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Проверка корректности формата SMTP-адреса email
Пару-тройку раз столкнувшись с проблемами, связанными с тем, что в настройках был указан некорректный email-адрес, решил прикрутить какую-нить проверку хотя бы корректности его формата, чтобы по возможности отфильтровывать явный мусор. В результате появилась парочка вспомогательных методов, которые, надеюсь, пригодятся не только мне.
Это добавлено в макрос SysMailer:
X++:
// регулярное выражение для проверки корректности SMTP-адресов
// подсмотрено тут: codeproject.com/Articles/5189/Effective-Email-Address-Validation
// NB! тут специально не использованы ограничители начала и конца строки (^ $)
#localmacro.EmailValidationPattern
    @'([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)'
#endmacro
А это пара новых методов в классе SysMailer - собственно проверка корректности формата email-адреса:
X++:
// проверяет email на соответствие нужному формату
#localmacro.Pattern
    @'^\s*' + #EmailValidationPattern + @'\s*$'
#endmacro
public static client server boolean isValidEmail(Email _email)
{
    boolean ret;
    ;
    if (strlrtrim(_email) != '')
    {
        new InteropPermission(InteropKind::ClrInterop).assert();
        ret = System.Text.RegularExpressions.Regex::IsMatch(_email, #Pattern);
    }
    return ret;
}
и вспомогательный метод для "выкусывания" email-адреса, если на входе подается строка вида "John Doe <john@somewhere.com>":
X++:
/// <summary>
///     пытается выкинуть из адреса отправителя имя и <>, оставив собственно SMTP-адрес
/// </summary>
/// <param name="_emailFrom">
///     email предположительно в формате "Name <email>"
/// </param>
/// <returns>
///     email без лишней шелухи или же исходную строку, если параметр не подойдет под шаблон
/// </returns>
/// <remarks>
///     в качестве параметра для SMTP-команды MAIL FROM: годится ТОЛЬКО email без всяких там угловых скобок и имен
/// </remarks>
#localmacro.SearchPattern
    @'^.+\s<(' + #EmailValidationPattern + @')>$'
#endmacro
#define.ReplacementPattern('$1')
public static client server Email tryRemoveNameFromEmail(Email _emailFrom)
{
    System.Text.RegularExpressions.MatchCollection  matches;
    System.Text.RegularExpressions.Match            oneMatch;
    Counter                                         nMatches;
    Email                                           ret = strlrtrim(_emailFrom);
    ;
    if (ret)
    {
        new InteropPermission(InteropKind::ClrInterop).assert();
        matches = System.Text.RegularExpressions.Regex::Matches(ret, #SearchPattern);
        nMatches = matches.get_Count();
        if (nMatches > 0)
        {
            // резать к чертовой матери! не дожидаясь перитонитов...
            oneMatch = matches.get_Item(0);
            ret = oneMatch.Result(#ReplacementPattern);
        }
        else
        {
            ret = _emailFrom;
        }
    }
    return ret;
}
За это сообщение автора поблагодарили: lev (11), Morpheus (2), coolibin (2), BAx (1), S.Kuskov (3), NickMDAX (1).
Старый 11.03.2013, 16:51   #2  
leva is offline
leva
Участник
 
52 / 36 (2) +++
Регистрация: 03.08.2005
Цитата:
X++:
#localmacro.EmailValidationPattern
    @'([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)'
#endmacro
Какая-то странная регулярка. Явно выделена возможность указания сервера по ip-адресу, но мало того, что никак не проверяется, что число при этом не должно быть больше 255, но к тому же это абсолютно бесполезно сделано, так как вариант [a-zA-Z0-9\-]+ включает их все. Не проверяется, что адрес не может начинаться и заканчиваться точкой. Странные первая "[" после "@" и последняя "]". Домен верхнего уровня может быть больше 4 символов (например travel, museum).

Для простых проверок лучше такой
X++:
@'[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,10})'
Ещё есть вариант в \Classes\SysEmailDistributor\validateEmail, но по-моему он ещё хуже.

Все они абсолютной точности не дадут, но большинство ошибок отсекают. Для проверок по-точнее есть RFC822-совместимый (не для слабонервных). Можно ещё домены верхнего уровня ограничить известными, короче, чем более совершенна проверка, тем монструозней получится регэкс.

В Ax3 реализация регулярных выражений очень глючная, но такой вариант кажется работает верно (здесь < и > можно убрать, если нужно соответствие не всей строки)
X++:
@'<[0-9a-zA-Z\-_]+[0-9a-zA-Z\-_\.]*[^.]@[0-9a-zA-Z\-]+[0-9a-zA-Z\-\.]*\.[a-zA-Z][a-zA-Z]+>'
P.S. Для поддержки кириллицы нужно немного доработать.
P.P.S. Для отладки регулярок рекомендую онлайн тулзу debuggex.com.
За это сообщение автора поблагодарили: S.Kuskov (5).
Теги
ax2009, ax2012, ax4.0, email, regular expressions, законченный пример, полезное, проверка

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Arijit Basu: AX Email & URL Validation Blog bot DAX Blogs 3 10.12.2012 15:07
dynamicsaxbi: How To: Directing Reports to Email Blog bot DAX Blogs 0 10.03.2012 10:11
Проверка существования email-адреса в Active Directory через ADSI gl00mie DAX: Программирование 0 13.01.2012 15:19
daxdilip: [Updated] Code to read email using EWS (Exchange Web Services) Blog bot DAX Blogs 0 15.12.2010 17:11
Проверка корректности ИНН Andrux DAX: Программирование 2 09.08.2007 11:18

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

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

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