Veja nesta dica uma função que apresenta como validar um endereço de e-mail, evitando que sejam informados dados incorretos nos cadastros.
Segue a implementação:
function ValidaEmail(sEmail: string): boolean;
const
// Caracteres válidos
ATOM_CHARS = [#33..#255] - ['(', ')', '<', '>', \@\, ',', ';', ':',
'\', '/', '"', '.', '[', ']', #127];
// Caracteres válidos em uma cadeia
QUOTED_STRING_CHARS = [#0..#255] - ['"', #13, '\'];
// Caracteres válidos em um subdominio
LETTERS = ['A'..'Z', 'a'..'z'];
LETTERS_DIGITS = ['0'..'9', 'A'..'Z', 'a'..'z'];
SUBDOMAIN_CHARS = ['-', '0'..'9', 'A'..'Z', 'a'..'z'];
type
States = (STATE_BEGIN, STATE_ATOM, STATE_QTEXT, STATE_QCHAR,
STATE_QUOTE, STATE_LOCAL_PERIOD, STATE_EXPECTING_SUBDOMAIN,
STATE_SUBDOMAIN, STATE_HYPHEN);
var
State: States;
i, n, iSubdomains: integer;
c: char;
begin
State := STATE_BEGIN;
n := Length(sEmail);
i := 1;
iSubdomains := 1;
while (i <= n) do
begin
c := sEmail[i];
case State of
STATE_BEGIN:
if c in atom_chars then
State := STATE_ATOM
else if c = '"' then
State := STATE_QTEXT
else
break;
STATE_ATOM:
if c = \@\ then
State := STATE_EXPECTING_SUBDOMAIN
else if c = '.' then
State := STATE_LOCAL_PERIOD
else if not (c in atom_chars) then
break;
STATE_QTEXT:
if c = '\' then
State := STATE_QCHAR
else if c = '"' then
State := STATE_QUOTE
else if not (c in quoted_string_chars) then
break;
STATE_QCHAR:
State := STATE_QTEXT;
STATE_QUOTE:
if c = \@\ then
State := STATE_EXPECTING_SUBDOMAIN
else if c = '.' then
State := STATE_LOCAL_PERIOD
else
break;
STATE_LOCAL_PERIOD:
if c in atom_chars then
State := STATE_ATOM
else if c = '"' then
State := STATE_QTEXT
else
break;
STATE_EXPECTING_SUBDOMAIN:
if c in letters then
State := STATE_SUBDOMAIN
else
break;
STATE_SUBDOMAIN:
if c = '.' then
begin
Inc(iSubdomains);
State := STATE_EXPECTING_SUBDOMAIN
end
else if c = '-' then
State := STATE_HYPHEN
else if not (c in letters_digits) then
break;
STATE_HYPHEN:
if c in letters_digits then
State := STATE_SUBDOMAIN
else if c <> '-' then
break;
end;
Inc(i);
end;
if i <= n then
Result := False
else
Result := (State = STATE_SUBDOMAIN) and (iSubdomains >= 2);
//se sEmail esta vazio retorna true
if sEmail = '' then
Result := true;
end;
Para testar, adicione a um novo formulário um Edit e um Button, programando no evento onClick deste último:
procedure TForm1.Button1Click(Sender: TObject);
begin
if ValidaEmail(Edit1.Text) then
ShowMessage('Ok! E-mail válido!')
else
ShowMessage('E-mail inválido!');
end;
Agora rode o programa e faça os testes digitando vários endereços de e-mail do Edit1 e clicando sobre o botão.