EmailAddressAttribute неверно классифицирует французский адрес электронной почты как недействительный

Я использую EmailAddressAttribute для использования в моей модели.

Проблема заключается в том, что я использую (совершенно правильный) адрес электронной почты

ó[email protected]

он говорит, что это неверно.

Модель:

public class ForgotPasswordViewModel
{
    [Required]
    [EmailAddress]
    [Display(Name = "Email")]
    public string Email { get; set; }

    public CmsContentPagesModel PageCmsContent { get; set; }

    public CmsContentPagesModel PageCmsContentInfoIcon { get; set; }
    public CmsContentPagesModel PageCmsContentRightPanel { get; set; }
}

Это проблема с атрибутом, или мне почему-то нужно указать, что французские электронные письма в порядке?

Поле ввода как отображаемое:

<div class="col-md-5">
     <input class="form-control" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-required="The Email field is required." id="Email" name="Email" type="text" value="" />
     <span class="field-validation-valid text-danger" data-valmsg-for="Email" data-valmsg-replace="true"></span>
</div>

Я также извлек регулярное выражение из проверки на стороне клиента, следующая строка возвращает false

/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-][email protected][a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( 'ó[email protected]' );

который, по-видимому, соответствует этому стандарту, даже если демо для этого точного кода также не работает.

Ответ 1

Вам нужно установить настраиваемое регулярное выражение для проверки подлинности электронной почты в плагине проверки jQuery:

$.validator.methods.email = function( value, element ) {
  return this.optional( element ) || /INSERT_YOUR_REGEX_HERE/.test( value );
}

jQuery Validation Plugin использует RFC 5322 Спецификация протокола интернет-сообщений определение действительного адреса электронной почты. Это определение запрещает использование нелатинских букв в локальной части. Соответствующая выдержка из проекта README.md:

ВАЖНОЕ ЗАМЕЧАНИЕ О ВАЖНОМ УРОВНЕ ЭЛЕКТРОННОЙ ПОЧТЫ.. Начиная с версии 1.12.0 это плагин использует то же регулярное выражение, что спецификация HTML5 предлагает браузеру использовать. Мы будем следовать их примеру и использовать ту же проверку. Если вы считаете, что спецификация неверна, сообщите об этом им. Если у вас разные требования, рассмотрите с помощью настраиваемого метода. Если вам нужно настроить встроенные шаблоны регулярных выражений проверки, пожалуйста, следовать документация.

Интернационализация адресов электронной почты определяется другой спецификацией - Обзор RFC 6530 и структура интернационализированной электронной почты. Он использует термин SMTPUTF8. Для получения дополнительной информации и поддержки просмотрите Страница адреса электронной почты в Википедии.

Ответ 2

Как вы можете видеть в регулярном выражении:

/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-][email protected][a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( 'ó[email protected]' );

символ ó не находится в диапазоне

вы можете использовать следующее регулярное выражение:

/^[a-zA-Z0-9 àâäèéêëîïóôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ.!#$%&'*+\/=?^_`{|}~-][email protected][a-zA-Z0-9 àâäèéêëîïóôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ.!#$%&'*+\/=?^_`{|}~-](?:[a-zA-Z0-9 àâäèéêëîïóôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ.!#$%&'*+\/=?^_`{|}~-]{0,61}[a-zA-Z0-9 àâäèéêëîïóôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ.!#$%&'*+\/=?^_`{|}~-])?(?:\.[a-zA-Z0-9 àâäèéêëîïóôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ.!#$%&'*+\/=?^_`{|}~-](?:[a-zA-Z0-9 àâäèéêëîïóôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ.!#$%&'*+\/=?^_`{|}~-]{0,61}[a-zA-Z0-9 àâäèéêëîïóôœùûüÿçÀÂÄÈÉÊËÎÏÔŒÙÛÜŸÇ.!#$%&'*+\/=?^_`{|}~-])?)*$/

И вы также можете создать пользовательский атрибут как FrenchEmailAddress, чтобы проверить свойство с помощью регулярного выражения, которое я разместил в пользовательском атрибуте

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class FrenchEmailAddressAttribute : ValidationAttribute
{
    public string Pattern { get; set; }
    public RegexOptions Options { get; set; }

    public FrenchEmailAddressAttribute(string pattern, RegexOptions options = RegexOptions.None)
    {
        Pattern = pattern;
        Options = options;
    }

    public override bool IsValid(object value)
    {
        return IsValid(value as string);
    }

    public bool IsValid(string value)
    {
        return string.IsNullOrEmpty(value) ? true : new Regex(Pattern, Options).IsMatch(value);
    }
}

Ответ 3

Контекст проблемы очень важен для определения правильного ответа. В большинстве сценариев лучше придерживаться простого решения:

^\[email protected]\S+\.\S+$

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

Ответ 4

System.ComponentModel.DataAnnotations.EmailAddressAttribute класс с использованием этого регулярного выражения.

const string pattern = @"^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$";

и подтвердите свой адрес электронной почты, как сказал @ThomasRainero

Ответ 5

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

EmailAddressAttribute testEmailAddress = new EmailAddressAttribute();
bool isValid = testEmailAddress.IsValid("ó[email protected]");

Надеюсь, что это полезно.