Autor Beitrag
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 110



BeitragVerfasst: 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



BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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.

ausblenden volle Höhe Delphi-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:
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                                                         //
//    Copyright 2001,2002 by Arcana Technologies Incorporated                 //
//    Written By Jason Southwell                                              //
//                                                                            //
//  Description:                                                              //
//    This unit houses functions to quickly and easily send email.  It is     //
//    useful for notification in your web apps.  It is especially useful when //
//    wrapped in a try/except block for sending error messages to a system    //
//    administrator.  Note that this function requires that you have Indy     //
//    9.x installed.                                                          //
//                                                                            //
//  Updates:                                                                  //
//    08/31/2001 - Released to Open Source.  Functions include SendMail.      //
//    11/14/2002 - Added an overloaded SendMail function for sending          //
//                 attachments.  Added a function to validate an email        //
//                 address. Added ParseEmail function to seperate an email    //
//                 address into it's username and domain sections.            //                                
//                                                                            //
//  License:                                                                  //
//    This code is covered by the Mozilla Public License 1.1 (MPL 1.1)        //
//    Full text of this license can be found at                               //
//    http://www.opensource.org/licenses/mozilla1.1.html                      //
//                                                                            //
////////////////////////////////////////////////////////////////////////////////

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 : stringvar Username, Domain : string);
function ValidateEmailAddress(const EMailAddress : stringconst 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 : stringvar 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 : stringconst 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(nildo
          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 user profile iconAXMD: Code- durch Delphi-Tags ersetzt
stiftmaster
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149



BeitragVerfasst: 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.

ausblenden 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;
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function ValidateEmailAddress(const EMailAddress: stringconst 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 > 0and (iPos < Length(EMailAddress)) then</span>
    begin ...


Falls nochjemand einen Fall findet, der nicht abgedeckt wird, der darf gerne noch posten :-)

Stefan