Delphi: проверка электронной почты без регулярных выражений - PullRequest
6 голосов
/ 25 августа 2010

Поскольку в Delphi нет встроенной библиотеки регулярных выражений, видели ли вы хорошую функцию для проверки адресов электронной почты хотя бы до некоторой степени при использовании только Delphi RTL / VCL?

Я не хочу связывать дополнительные * .dll с моим продуктом, интегрируя поддержку регулярных выражений, и мне нужна также совместимость с Delphi 7. Встраивание библиотеки регулярных выражений в exe увеличивает ее размер, и я сомневаюсь, что стоит добавить следующие 100 тыс., Потому что вам просто нужна функция проверки электронной почты на 10-50 строк.

Ответы [ 3 ]

5 голосов
/ 26 августа 2010

По запросу я делаю свой комментарий как ответ ..

http://www.howtodothings.com/computers/a1169-validating-email-addresses-in-delphi.html

Спасибо!

5 голосов
/ 25 августа 2010

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

Статья Я знал, как проверить адрес электронной почтыПока я не прочитал RFC хорошо описывает это.
Он цитирует RFC the local-part MUST be interpreted and assigned semantics only by the host specified in the domain part of the address (local part - это часть до знака @ в адресе электронной почты).

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

Это то, что делает много анти-СПАМ-программ для проверки адресов электронной почты отправителя: они связываются с SMTP-сервером отправителя электронной почты, пытаются настроить SMTP-квитирование и, если все идет хорошо, они оценивают входящиеэлектронная почта как более похожая на нежелательную почту.

Вы можете использовать клиентский компонент Indy SMTP для отправки почты;принятый ответ на этот вопрос объясняет как.

- jeroen

0 голосов
/ 11 февраля 2016

Для старой версии Delphi, в которой нет регулярного выражения:

function TForm1.IsValidEmail(email: string): boolean;
const
  charslist = ['_', '-', '.', '0'..'9', 'A'..'Z', 'a'..'z'];
var
  Arobasc, lastpoint : boolean;
  i, n : integer;
  c : char;
begin
  n := Length(email);
  i := 1;
  Arobasc := false;
  lastpoint := false;
  result := true;
  while (i <= n) do begin
    c := email[i];
    if c = '@' then
    begin
      if Arobasc then  // Only 1 Arobasc
      begin
        result := false;
        exit;
      end;
      Arobasc := true;
    end
    else if (c = '.') and Arobasc then  // at least 1 . after arobasc
    begin
      lastpoint := true;
    end
    else if not(c in charslist) then  // valid chars
    begin
      result := false;
      exit;
    end;
    inc(i);
  end;
  if not(lastpoint) or (email[n] = '.')then  // not finish by . and have a . after arobasc
    result := false;
end;

Для тех, кто любит использовать RegExpression с использованием сервера базы данных

function TForm1.IsValidEmail(const AMail: string): Boolean;
var
  lQry: TSQLQuery;
begin
  // no REGEXP in Delphi 2009 -> use of REGEPX Oracle
  lQry := TSQLQuery.Create();
  lQry.SQLConnection := SQLConnection1;
  try
    vQry.SQL.Text := 'SELECT REGEXP_SUBSTR( ' + QuotedStr(aMail) + ', ''^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{1,}$'' ) "EMAIL" FROM DUAL';  // ORACLE
    // vQry.SQL.Text := 'SELECT ' + QuotedStr(aMail) + ' REGEXP ''^[a-zA-Z0-9][a-zA-Z0-9.-]*[a-zA-Z0-9.-]@[a-zA-Z0-9][a-zA-Z0-9._-]*[a-zA-Z0-9]\.[a-zA-Z]{2,4}$'';  // MySQL
    lQry.Open;
    Result := not lQry.Eof and ( lQry.FieldByName( 'EMAIL' ).AsString = AMail );
  finally
    FreeAndNil(lQry);
  end;
end;
...