Delphi:验证没有正则表达式的电子邮件

时间:2010-08-25 12:16:38

标签: delphi validation email delphi-2010 delphi-7

由于Delphi没有内置任何正则表达式库,您是否看到过使用Delphi RTL / VCL至少在某种程度上验证电子邮件地址的良好功能?

我不想将额外的* .dll链接到我的产品集成正则表达式支持,我还需要Delphi 7兼容性。将正则表达式库嵌入到exe中会增加它的大小,我怀疑它是否值得添加下一个100k,因为你只需要10-50行的电子邮件验证功能。

3 个答案:

答案 0 :(得分:5)

电子邮件地址验证的一个大问题是RFC 822非常宽泛,没有正则表达式会有所帮助。

文章I Knew How To Validate An Email Address Until I Read The RFC很好地描述了这一点 它引用了RFC the local-part MUST be interpreted and assigned semantics only by the host specified in the domain part of the addresslocal part是电子邮件地址中@签名之前的部分。)

所以:
检查电子邮件地址是否有效的唯一方法是设置与主机接受该特定域的邮件的SMTP连接,并使用您要验证的电子邮件地址启动电子邮件握手过程。

这是许多反垃圾邮件软件验证发件人电子邮件地址的原因:他们联系电子邮件发件人的SMTP服务器,尝试设置SMTP握手,如果一切正常,他们会对收到的邮件进行评级更喜欢不是垃圾邮件。

您可以使用Indy SMTP客户端组件发送邮件; this question接受的答案解释了如何。

- 的Jeroen

答案 1 :(得分:5)

根据要求,我正在将我的评论作为答案..

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

谢谢!

答案 2 :(得分:-1)

对于没有正则表达式的旧版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;