Проверять/принимать только сообщения электронной почты с определенного доменного имени

Это часть моего сценария jQuery. Мне нужно, чтобы система проверяла электронные письма для определенного домена.

например, [email protected]

И разрешить электронные письма только от @schooldomain.com

Код:

email: function(value,element){return this.optional(element)||/^((([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])))\.?$/i.test(value);}

person JsEveryDay    schedule 29.08.2012    source источник
comment
а что именно не работает?   -  person rene    schedule 29.08.2012
comment
@Daniil, твоя правка испортила код. Пожалуйста, не редактируйте код в вопросах в будущем.   -  person Shadow Wizard Wearing Mask V2    schedule 29.08.2012
comment
скрипка   -  person Shadow Wizard Wearing Mask V2    schedule 29.08.2012
comment
Бессмысленно проверять электронные письма на стороне клиента, так как с отключенным javascript я могу ввести все, что захочу.   -  person Dunhamzzz    schedule 29.08.2012
comment
stackoverflow.com/questions/46155/   -  person kapa    schedule 29.08.2012
comment
@Dunhamzzz - Нет, это не так. Это облегчает жизнь пользователю, обнаруживая ошибки до того, как они отправят их на сервер. Это экономит время на обновление страницы. Также необходимо решение на стороне сервера, но проверка данных на стороне клиента не лишена смысла.   -  person Quentin    schedule 30.08.2012
comment
Извините, ребята, мой первый опыт работы с регулярными выражениями здесь, возможно, мой первый пост на StackOverflow... спасибо за все ваши советы.   -  person JsEveryDay    schedule 28.04.2016


Ответы (2)


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

function validateEmail(email) { 
    var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    if(re.test(email)){
        //Email valid. Procees to test if it's from the right domain (Second argument is to check that the string ENDS with this domain, and that it doesn't just contain it)
        if(email.indexOf("@thedomain.com", email.length - "@thedomain.com".length) !== -1){
            //VALID
            console.log("VALID");
        }
    }
}
person Jacob Lauritzen    schedule 29.08.2012
comment
Этот код скажет, что @thedomain.comTHIS_IS_CERTAINLY_NOT_AN_EMAIL_ADDRESS@@ действителен. - person kapa; 29.08.2012
comment
Отредактировано, поэтому сначала проверяется электронная почта, а затем проверяется, находится ли она в правильном домене. - person Jacob Lauritzen; 29.08.2012
comment
Электронная почта IIRC не поддерживает регулярное выражение, всегда будет какой-то гипотетический адрес, который не будет соответствовать регулярному выражению, но будет действительным. Я думаю, что лучшее решение - просто проверить а) есть ли в адресе только одно @, б) соответствует ли строка "@thedomain.com$" Редактировать: оказывается, это регулярное выражение, но с одним BEAST регулярного выражения : ex-parrot.com/~pdw/Mail-RFC822-Address.html - person DZittersteyn; 29.08.2012
comment
Ну, я думал, что это лучший метод (это было просто). - person Jacob Lauritzen; 29.08.2012
comment
@JacobLauritzen indexOf по-прежнему не является правильным методом, потому что вы не можете проверить, находится ли он в конце или нет. [email protected] является действительным адресом электронной почты... - person kapa; 30.08.2012
comment
Исправил это, проверив, заканчивается ли он им. - person Jacob Lauritzen; 30.08.2012

Благодаря этой теме я нашел другое решение для принятия только одного конкретного домена после at / @. Получить все после тире в строке в JavaScript По сути, электронное письмо делится на две части: текст до @ и текст после @. Если текст после @ не равен указанному домену, проверка будет ложной.

 // Email validation   
let em = document.forms['Login']['email'].value; 
let atpos = em.indexOf("@");
let domain = em.split("@")[1]; // Saves user input after the @ (at)

if (em == null || em == "") {
    alert("Email can not be empty.");
    document.getElementById('e').focus();
    return false;
} 
                                            // First test checks for atleast one character before @
else if (atpos < 1 || domain != "gmail.com"){ // Second test checks if the user entered a gmail.com domain after @
    alert("Not a valid e-mail address. Please write your gmail address like this: [email protected].");
    document.getElementById('e').focus();
    return false;
} 
person Henrik Granum    schedule 15.04.2021