2010-08-25 54 views
5

由於德爾福沒有任何內置的正則表達式庫,您是否看到過使用Delphi RTL/VCL至少在某種程度上驗證電子郵件地址的好功能?德爾福:驗證電子郵件沒有正則表達式

我不想將額外的* .dll鏈接到我的產品集成正則表達式支持,我還需要Delphi 7的兼容性。將正則表達式庫嵌入到exe文件中會增加它的大小,我懷疑它值得添加下一個100k,因爲你只需要10-50行的電子郵件驗證功能。

+7

HTTP使用RegExpression之一://www.howtodothings。 com/computers/a1169-validating-email-addresses-in-delphi.html – Marko 2010-08-25 12:20:17

+1

值得一提的是,Delphi的下一個版本將會在RTL中內置一個正則表達式庫,並且會在短短几天內發佈。 – 2010-08-25 12:44:52

+0

驗證電子郵件地址是w的好例子之一這裏使用正則表達式可能不是一個聰明的主意 - http://stackoverflow.com/questions/36261/test-expand-my-email-regex/36277#36277 – mjn 2010-08-25 12:46:50

回答

5
+0

請注意,該代碼實現了一個過時的規範。代碼在第一次發佈時甚至已經過時。 – 2010-08-26 08:11:09

+0

@Rob Kennedy:你的意思是CharInSet警告? – 2010-08-26 09:08:42

+0

不,我的意思是代碼實現RFC 822.代碼發佈於2001年5月。RFC 2822發佈於2001年4月。 – 2010-08-26 13:57:38

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

+0

我個人只會強制執行: 1.字符串中只有一個@字符(索引> 0) 2.在字符串中沒有字符範圍[0..32]。 3.至少有一個「。」 @之後的字符(距離爲1或更多)。 4.域名中沒有:或/或\字符。 – alex 2010-08-25 14:43:23

+4

RFC 822已被2822廢棄,它刪除了822允許的一些語法。無論如何,很少需要完整的2822語法 - 允許更簡單的正則表達式 – 2010-08-25 14:52:43

+2

您不需要執行SMTP電子郵件握手來驗證地址。是的,您必須連接到電子郵件域的SMTP服務器,但在此之後,您可以使用SMTP'VRFY'命令詢問服務器地址是否有效。 Indy的TIdSMTP組件有一個Verify()方法。 – 2010-10-27 18:06:12

-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; 

對於誰喜歡使用數據庫服務器

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._%+-][email protected][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;