Валидиране на e-mail адрес

17 отговора 464 прегледа
#1

Валидиране на e-mail адрес

Валидиране на e-mail адрес

Търся функциика за валидиране на е-маил адрес.
В краен случей ме устройват и критериите за проверка.

Благодаря

Отговор
в отговор на NikB #2

Re: Валидиране на e-mail адрес

Какво имаш в предвид под "Валидиране на e-mail адрес"? Наличие на едно @ в него, или проверка за реално съществуване на този адрес?

Възможно е само второто:

function Check_Email_Address(e-mail-address: string): Boolean;
var
I: Integer;
S: string;
begin
Result:= False;
I:= Pos('@', e-mail-address);
if I > 0 then
begin
S:= Copy(e-mail-address, I+1, length(e-mail-address)-I);
if Pos('@', S) = 0 then
Result:= True;
end;
end;

Отговор
в отговор на CTan #3

Формален контрол

Формален контрол, а не контрол на мейл сървъра :)
А това за едното @ едва ли е достатъчно, може би трябва да се провери и зоната в края на мейл адреса (или поне наличието й в стринга)

Отговор
в отговор на NikB #4

Re: Формален контрол

Пиша малко наизуст
<име>@<събдом>.<дом>
Където:
<име> да се проверява на дължина и допустими символи и комбинация от символи - RFC нам кое си
<събдом>да се проверява на дължина и допустими символи и комбинация от символи - RFC нам кое си
<дом>да се проверява за принадлежност към домейните от горно ниво - RFC нам кое си

Отговор
в отговор на NDeu #5

Ще почакам още малко по темата

Ще почакам още малко по темата, преди да почна да рова RFC

Впрочем, някъде бях мернал на PHP - май по-лесно ще стане.

Отговор
в отговор на NikB #6

Re: Валидиране на e-mail адрес

Използвай например:
[линк]

regExpr := TregExpr.Create;
regExpr.ModifierI := False;
regExpr.ModifierM := True;
regExpr.Expression := '\W(\w{n,})@(\w{m,}).(\w{2,3})\W';
if regExpr.Exec(mail) then
begin
User := regExp.Match[1];
SubDom := regExp.Match[2];
Dom := regExp.Match[3];
if ... then ...
end;

n и m са минималните допустими дължини на съответните части (виж поста на NDeu). За User, SubDom и Dom можеш да направиш допълнителни проверки.
пп: сорса съм го писъл тук и може да има грешки.

Редактирано от vido на

Отговор
в отговор на NDeu #7

RFC 822 ако се не лъжа :-)

[линк]

Отговор
в отговор на NDeu #8

Re: Формален контрол

.<дом> съвсем не е задължително...мисля.

Отговор
в отговор на CTan #9

Re: Формален контрол

В отговор на:

.<дом> съвсем не е задължително...мисля.



И понеже най-мразим да мислим, както казват селяните на запад взех та прочетох RFC-то дето андрю му е дал адреса

6.2.2. ABBREVIATED DOMAIN SPECIFICATION

Since any number of levels is possible within the domain
hierarchy, specification of a fully qualified address can
become inconvenient. This standard permits abbreviated domain
specification, in a special case:

For the address of the sender, call the left-most
sub-domain Level N. In a header address, if all of
the sub-domains above (i.e., to the right of) Level N
are the same as those of the sender, then they do not
have to appear in the specification. Otherwise, the
address must be fully qualified.

This feature is subject to approval by local sub-
domains. Individual sub-domains may require their
member systems, which originate mail, to provide full
domain specification only. When permitted, abbrevia-
tions may be present only while the message stays
within the sub-domain of the sender.

Use of this mechanism requires the sender's sub-domain
to reserve the names of all top-level domains, so that
full specifications can be distinguished from abbrevi-
ated specifications.


Отговор
в отговор на NikB #10

Re: Формален контрол

Айде и аз да напиша един израз :-)
/^[a-zA-Z0-9_.\-]+@[a-zA-Z0-9.\-]+[a-zA-Z0-9\-]\.[a-zA-Z][a-zA-Z]+$/

Отговор
в отговор на NikB #11

Re: Валидиране на e-mail адрес

function IsValidEmail(const Value: string): boolean;
function CheckAllowed(const s: string): boolean;
var
i: integer;
begin
Result:= false;
for i:= 1 to Length(s) do
begin
if not (s in ['a'..'z', 'A'..'Z', '0'..'9', '_', '-', '.']) then
Exit;
end;
Result:= true;
end;
var
i: integer;
namePart, serverPart: string;
begin
Result:= false;
i:= Pos('@', Value);
if i = 0 then
Exit;
namePart:= Copy(Value, 1, i - 1);
serverPart:= Copy(Value, i + 1, Length(Value));
if (Length(namePart) = 0) or ((Length(serverPart) < 5)) then
Exit;
i:= Pos('.', serverPart);
if (i = 0) or (i > (Length(serverPart) - 2)) then
Exit;
Result:= CheckAllowed(namePart) and CheckAllowed(serverPart);
end;

Отговор
в отговор на trump #12

someone@my_company_name.com

Твоята функция какво ще каже за тоя адрес? Щото според мен е невалиден

ПП А как стои въпроса с интернационализацията на имената, след като вече мога да си регистрирам домейн на кирилица или на китайски, значи мога да имам и e-mail адрес в този домейн...

Отговор
в отговор на andrew_nikoloff #13

Re: someone@my_company_name.com - кое е невалидно?

someone@my_company_name.com

кое му е невалидното на това?

Отговор
в отговор на NikB #14

Re: someone@my_company_name.com - кое е невалидно?

В името на домейна не можеш да имаш подчертавка...

Отговор
в отговор на andrew_nikoloff #15

Ша сложим параметър на вътр.функциика, 10х

Ша сложим параметър на вътрешната функциика, 10х

А може би и в заоната не може да има друго, освен букви?

Отговор
в отговор на NikB #16

Re: Ша сложим параметър на вътр.функциика, 10х

Явно не ви се използват регулярни изрази, но все пак ето прицезиран регулярен израз в зависимост от последните забележки

regExpr.Expression := '\W(\w{n,})@([a-zA-Zа-яА-Я0-9]{m,})\.([a-zA-Zа-яА-Я0-9]{2,3})\W';

С регулярен израз може да се прецизира максимално според всички критерии, а основното е че кода винаги ще е 5 реда.

Редактирано от vido на

Отговор
в отговор на vido #17

Re: Ша сложим параметър на вътр.функциика, 10х

Това все пак е форум за Делфи, а не за Пърл :-) Тук хората повече държат кода да е ясен, а не сбит. Например на мен лично ми отне 2 пъти повече време да открия в твоя регулярен израз, че [email protected] няма да мине при теб, отколкото да видя проблемите в горните примери. Освен това за да ползваш регулярни изрази в Делфи трябва да инсталираш допълнителни компоненти или библиотеки, което не винаги е желателно.

Отговор
в отговор на andrew_nikoloff #18

Re: Ша сложим параметър на вътр.функциика, 10х

ОК. Просто аз обичам да работя в такива ситуации с RE.

Отговор