由於德爾福沒有任何內置的正則表達式庫,您是否看到過使用Delphi RTL/VCL至少在某種程度上驗證電子郵件地址的好功能?德爾福:驗證電子郵件沒有正則表達式
我不想將額外的* .dll鏈接到我的產品集成正則表達式支持,我還需要Delphi 7的兼容性。將正則表達式庫嵌入到exe文件中會增加它的大小,我懷疑它值得添加下一個100k,因爲你只需要10-50行的電子郵件驗證功能。
由於德爾福沒有任何內置的正則表達式庫,您是否看到過使用Delphi RTL/VCL至少在某種程度上驗證電子郵件地址的好功能?德爾福:驗證電子郵件沒有正則表達式
我不想將額外的* .dll鏈接到我的產品集成正則表達式支持,我還需要Delphi 7的兼容性。將正則表達式庫嵌入到exe文件中會增加它的大小,我懷疑它值得添加下一個100k,因爲你只需要10-50行的電子郵件驗證功能。
按照要求我做我的評論答案..
http://www.howtodothings.com/computers/a1169-validating-email-addresses-in-delphi.html
謝謝!
請注意,該代碼實現了一個過時的規範。代碼在第一次發佈時甚至已經過時。 – 2010-08-26 08:11:09
@Rob Kennedy:你的意思是CharInSet警告? – 2010-08-26 09:08:42
不,我的意思是代碼實現RFC 822.代碼發佈於2001年5月。RFC 2822發佈於2001年4月。 – 2010-08-26 13:57:38
電子郵件地址驗證的最大問題是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 address
(local part
是@
登錄電子郵件地址之前的部分)。
所以:
檢查電子郵件地址是否有效的唯一辦法,就是要建立一個SMTP連接到主機接受郵件的特定域,並與您試圖將電子郵件地址啓動電子郵件握手過程覈實。
這就是很多反垃圾郵件軟件用來驗證發件人電子郵件地址的方法:他們聯繫電子郵件發件人的SMTP服務器,嘗試設置SMTP握手,如果這樣做確定,他們會評估傳入電子郵件更像是不是垃圾郵件。
您可以使用Indy SMTP客戶端組件發送郵件; this question的接受答案解釋瞭如何。
--jeroen
我個人只會強制執行: 1.字符串中只有一個@字符(索引> 0) 2.在字符串中沒有字符範圍[0..32]。 3.至少有一個「。」 @之後的字符(距離爲1或更多)。 4.域名中沒有:或/或\字符。 – alex 2010-08-25 14:43:23
RFC 822已被2822廢棄,它刪除了822允許的一些語法。無論如何,很少需要完整的2822語法 - 允許更簡單的正則表達式 – 2010-08-25 14:52:43
您不需要執行SMTP電子郵件握手來驗證地址。是的,您必須連接到電子郵件域的SMTP服務器,但在此之後,您可以使用SMTP'VRFY'命令詢問服務器地址是否有效。 Indy的TIdSMTP組件有一個Verify()方法。 – 2010-10-27 18:06:12
對於老版本的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;
HTTP使用RegExpression之一://www.howtodothings。 com/computers/a1169-validating-email-addresses-in-delphi.html – Marko 2010-08-25 12:20:17
值得一提的是,Delphi的下一個版本將會在RTL中內置一個正則表達式庫,並且會在短短几天內發佈。 – 2010-08-25 12:44:52
驗證電子郵件地址是w的好例子之一這裏使用正則表達式可能不是一個聰明的主意 - http://stackoverflow.com/questions/36261/test-expand-my-email-regex/36277#36277 – mjn 2010-08-25 12:46:50