| Autor |
Beitrag |
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: Mo 02.12.02 20:43
Ich suche eine Überprüfungsroutine für EMail- und Internet-Adressen. Ich weiss nicht ob das System (z.B. API) irgendwelche Funktionen zu verfügung stellt. Bevor ich mich also großartig in Arbeit stürze wollte ich nachfragen ob das einer weiss. Wenn es keine API Funktion gibt, dann bin ich auch mit den Regeln oder einer guten Routine zufrieden.
Es ist ja nicht so als ob ich das wenige nicht selbst programmieren könnte, aber ich hab keine Ahnung nach welchen Regeln ich richtig prüfen soll. Ich leg schon mal mit den Regeln die ich kenne los. Wenn einer von euch aber etwas gutes hat oder das schon mal gemacht hat, dann meldet euch.
|
|
Savage
      
Beiträge: 110
|
Verfasst: Mo 02.12.02 21:24
Hi,
so könnte man es evtl. machen:
Internetadresse: z.B.: www.google.de
Du könntest z.B. einen DNS-Request losschicken und versuchen die DNS aufzulösen, also ne IP drauß zu bilden. Meldet dir der DNS-Server einen Fehler (konnte nicht gefunden werden), dann gibt es sie nicht, falls er dir eine IP-Adresse anbietet, dann gibt es die Adresse.
EMail-Adresse: z.B.: Max@Mustermann.de
Jetzt kommt es drauf an, wie genau du es prüfen willst.
Willst du nur die Domain checken, dann musst du wieder einen DNS-Request losschicken, jedoch diesmal den Typ MX (MailExchanger). Bietet dir der DNS-Server eine oder mehrere MX-Adressen, so gibt es schon mal diese Domain, wenn nicht, dann ist es auf jedemfall keine gültige EMail Adresse.
Wenn du jetzt noch testen willst, ob es den User "Max" gibt, wird es schon schwieriger. Weil jetzt musst du den MailExchanger von der Domain fragen, ob es diesen User gibt. Du musst dich also mit Ihm connecten und dich mit "Ihm unterhalten", gibt er dir das OK, schließt du die connection und weist, dass es diesen User gibt, meldet er dir einen Fehler 5xx dann gibt es ihn nicht. (am besten in den RFC's für SMTP stöbern)
Für den dns-lookup bietet dir Indy ne dnsresolver - Kompo, um dich mit den MX-Server zuverbinden reicht eine simple TClientsocket-Kompo.
Vieleicht konnte ich dir helfen
Mfg
Savage
|
|
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: Mo 02.12.02 21:38
Danke zuerst für deine Antwort. Ist ein guter Tipp (und kommt in meine Tippsammlung), nur muß man dafür Online sein. Ich will das Offline testen. Dei Tipp prüft ob es die Adresse überhaupt gibt. Ich brauche nur den Korrekte-Schreibweise-Test.
In der Zwischenzeit hab ich was programmiert. Allerdings weiss ich nicht ob ich dammit alles abdecke:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| function MailTest(S: String): Boolean; begin Result := False; S := Trim(S); if Pos(#32, S) > 0 then Exit; if Pos('@', S) > 0 then Delete(S, 1, Pos('@', S)); if Pos('@', S) > 0 then Exit; if Pos('.', S) < 1 then Exit; Result := True; end;
function UrlTest(S: String): Boolean; const HTYP: array[0..7] of String = ('ftp://', 'http://', 'https://', 'gopher://', 'mailto:', 'news:', 'telnet:', 'wais:'); var i: Integer; begin Result := False; S := Trim(AnsiLowerCase(S)); if Pos(#32, S) > 0 then Exit; if Pos('www.', S) = 1 then S := 'http://' + S; for i := 0 to 7 do if (Pos(HTYP[i], S) = 1) then Result := True; end; |
Das ist ein grober Test. Wenn ich also was vergessen habe oder jemand was bessares hat, dann bitte melden.
Ich warte also immer noch.
|
|
bis11
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: Di 03.12.02 07:02
Schaue Dir mal dieses Posting an, das ist ein OpenSource-Projekt, vielleicht findest Du ja was darin.
www.auq.de/viewtopic.php?t=879
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Di 03.12.02 12:29
Hiho!
In der Unit SmtpSendMail gibt es die Funktion ValidateEmailAdress, die die Syntax analysiert und auf Wunsch sogar die Domain einer Email-Adresse überprüft (bei Adresse blabla@gmx.de prüft das Ding dann über einen DNS-Server, ob es eine solche Domain gibt).
Die Unit ist Opensource, daher sollte es okay sein, wenn ich sie hier poste, Copyright etc. ist ja dabei.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185:
| unit SMTPSendMail;
interface
uses Classes, SysUtils, IdMessage, IdSMTP, IdURI, IdTCPClient, IdDNSResolver;
procedure SendMail(const SMTPServer, EMailAddress, From, Subject, MailText : string); overload; procedure SendMail(const SMTPServer, EMailAddress, From, Subject, MailText, Attachment : string; Username : string=''; Password : string=''); overload; procedure ParseEmail(EmailAddress : string; var Username, Domain : string); function ValidateEmailAddress(const EMailAddress : string; const DNSServer : string='') : boolean;
implementation
function CharPos(str : string; c : char) : integer; var i, iLen : integer; begin result := 0; iLen := Length(str); for i := 1 to iLen do if str[i]=c then begin result := i; break; end; end;
procedure ParseEmail(EmailAddress : string; var Username, Domain : string); begin Username := Copy(EmailAddress, 1, CharPos(EmailAddress, '@')-1); Domain := Copy(EmailAddress, CharPos(EmailAddress, '@')+1,9999999); end;
procedure SendMail(const SMTPServer, EMailAddress, From, Subject, MailText, Attachment : String; Username : string=''; Password : string=''); var SMTP: TIdSMTP; Msg: TIdMessage; begin SMTP := TIdSMTP.Create(nil); try SMTP.Username := Username; SMTP.Password := Password;
Msg := TIdMessage.Create(SMTP); Msg.AttachmentEncoding := 'MIME'; Msg.ContentType := 'text/plain'; msg.Encoding := meMIME; msg.NoEncode := False; Msg.NoDecode := False;
Msg.IsEncoded := True; Msg.Subject := Subject; with Msg.Recipients.Add do begin Address := EMailAddress; Name := EMailAddress; end; Msg.From.Address := From; Msg.From.Name := Copy(From,1,pos('@',From)-1); with Msg.ReplyTo.Add do begin Address := From; Name := Copy(From,1,pos('@',From)-1); end;
Msg.Body.Text := MailText; if Attachment <> '' then TIdAttachment.Create(Msg.MessageParts, Attachment);
SMTP.Host := SMTPServer; SMTP.Connect; try; SMTP.Send(Msg); finally SMTP.Disconnect; end; finally SMTP.Free; end; end;
procedure SendMail(const SMTPServer, EMailAddress, From, Subject, MailText : string); begin SendMail(SMTPServer, EMailAddress, From, Subject, MailText, '','',''); end;
function ValidateEmailAddress(const EMailAddress : string; const DNSServer : string='') : boolean; var iPos, iResult : integer; dns : TIdDNSResolver; sResult, sUser, sDomain : string; i : integer; bFound : boolean; begin Result := False; bFound := False; iPos := CharPos(EMailAddress,'@'); if iPos > 0 then begin iPos := CharPos(EMailAddress,'.'); if iPos > 0 then begin if DNSServer = '' then begin Result := True; exit; end; ParseEmail(EMailAddress, sUser, sDomain); dns := TIdDNSResolver.Create(nil); try dns.AllowRecursiveQueries := True; dns.Host := DNSServer; dns.QueryRecords := [qtMX]; dns.ReceiveTimeout := 1000; dns.Resolve(sDomain); for i := 0 to dns.QueryResult.Count-1 do begin if dns.QueryResult[i].RecType = qtMX then begin sDomain := TMXRecord(dns.QueryResult[i]).ExchangeServer; bFound := True; break; end; end;
if bFound then begin with TIdTCPClient.Create(nil) do try Port := 25; Host := sDomain; Connect; WriteLn('HELO '+sDomain); sResult := ReadLn; WriteLn('MAIL FROM:<'+EmailAddress+'>'); sResult := ReadLn; WriteLn('RCPT TO:<'+EmailAddress+'>'); sResult := ReadLn; iPos := CharPos(sResult,' '); if iPos > 0 then sResult := Copy(sResult,1,iPos-1); iPos := CharPos(sResult,'-'); if iPos > 0 then sResult := Copy(sResult,1,iPos-1); iResult := StrToIntDef(sResult,0); Result := iResult = 250; finally free; end; end; finally dns.Free; end; end; end; end;
end. |
Cu,
Udontknow
Moderiert von AXMD: Code- durch Delphi-Tags ersetzt
|
|
stiftmaster
      
Beiträge: 149
|
Verfasst: Mo 20.03.06 14:38
Hallo,
coole Unit - hab ich gleich mal verwendet und dabei ein bissle erweitert, da folgende Sachen nicht abgehandelt werden:
a.w@ ist eine gültige E-Mail Adresse (nach dem Algo), da der Punkt vorkommt. Die Prüfung sollte eigentlich false zurück geben, da der Punkt hinter dem @-Zeichen stehen sollte.
a@d. ist ebenfalls gülig (nach dem Algo). Der Punkt darf nicht das letzte Zeichen sein.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function CharPos(str: string; c: char; <span style="color: red">start: Integer = 1</span>): Integer; var I, iLen: Integer; begin result := 0; iLen := Length(str); for I := <span style="color: red">start</span> to iLen do if str[I]=c then begin Result := I; Break; end; end; | Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| function ValidateEmailAddress(const EMailAddress: string; const DNSServer: string = ''): Boolean; var iPos, iResult: Integer; dns: TIdDNSResolver; sResult, sUser, sDomain: string; I: Integer; bFound: Boolean; begin Result := False; bFound := False; iPos := CharPos(EMailAddress,'@'); if iPos > 0 then begin <span style="color: red">iPos := CharPos(EMailAddress, '.', iPos); if (iPos > 0) and (iPos < Length(EMailAddress)) then</span> begin ... |
Falls nochjemand einen Fall findet, der nicht abgedeckt wird, der darf gerne noch posten
Stefan
|
|
|