AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi [D2009] Online eMail-Adress Prüfung obs valide ist?
Thema durchsuchen
Ansicht
Themen-Optionen

[D2009] Online eMail-Adress Prüfung obs valide ist?

Ein Thema von KodeZwerg · begonnen am 30. Jul 2018 · letzter Beitrag vom 5. Aug 2018
Antwort Antwort
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#1

AW: [D2009] Online eMail-Adress Prüfung obs valide ist?

  Alt 30. Jul 2018, 11:50
Ich glaube ich entferne einfach dieses Feature, das übersteigt meinen Horizont. Meine 5 Punkte Theorie will ich zumindest einmal umgesetzt haben um daraus zu Lernen wie die Dinge so funktionieren/funktioniert haben.
Link verschicken, User klickt Link, das bedarf doch WebServer?

Was ich vorhatte war:
Registrier-Dialog öffnet sich, Anwender gibt Daten ein, auch eine eMail Adresse, dahinter sollte ein grüner Haken bzw gelbes Fragezeichen erscheinen, mehr nicht. Ist grüner Haken da werden mehr features im Programm aktiv, ohne das ich weiß wer es benutzt, das ist mir zu diesem Zeitpunkt noch egal. Ob da nun einer "Angela@Merkel.de" eintippt oder sonst was ist mir auch egal. Ich wollte damit nicht prüfen ob Anwender derjenige ist der sagt er ist dieses oder jenes. Nur Grundsätzlich als Gimmick ein "Existiert diese eMail-Adresse oder eben nicht" um die GUI aufzuhübschen.
Später wollte ich für Support/Kauf eine sende mail funktion integrieren das man mir Bugs Wünsche Freischaltung etc schicken kann. An dieser Stelle sollte halt geprüft werden ob derjenige auch ist wer er vorgibt zu sein.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#2

AW: [D2009] Online eMail-Adress Prüfung obs valide ist?

  Alt 30. Jul 2018, 11:54
[...]
Ich wollte damit nicht prüfen ob Anwender derjenige ist der sagt er ist dieses oder jenes.
[...]
An dieser Stelle sollte halt geprüft werden ob derjenige auch ist wer er vorgibt zu sein.
Du solltest mit dir selbst im Reinen sein, was du nun wirklich willst, sonst klappt die Umsetzung gar nicht.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: [D2009] Online eMail-Adress Prüfung obs valide ist?

  Alt 30. Jul 2018, 12:07
Beachte meine Erste Zeile, ich bin mit mir im Reinen.Ich glaube ich entferne einfach dieses Feature, das übersteigt meinen Horizont. Beispiel:
User tippt ein: "schoko@ha.se" wollte ich ursprünglich schauen, existiert "ha.se", hat "ha.se" einen SMTP usw usf. Halte die 5 Punkte rasch runterrattern lassen. Dies hat noch nichts mit einer "mach aus Demo eine Vollversion" zu tun. Das dient nur der GUI Optik.
Demo nach Vollprodukt: Das wollte ich dann im nächsten Schritt erst bewerkstelligen. Support/Kauf, wo man mich anmailen kann/muss.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
655 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: [D2009] Online eMail-Adress Prüfung obs valide ist?

  Alt 30. Jul 2018, 12:50
Eine 100%ige E-Mailüberprüfung kannst du nicht machen, wie dir hier ja schon mehrere geschrieben haben. Du kannst im Prinzip nur die Syntax und das Vorhandensein eines Mailsservers, der zur EMail-Domäne passt, überprüfen.

Die Syntaxprüfung kannst du mit einem RegEx machen und die Abfage, ob es einen MX-Record zu einer E-Mailadresse gibt, kannst du mit folgender Unit machen. Die Funktion RFResolveMailServer liefert dir das Gewünschte retour.

Beispiel:
Code:
s := RFResolveMailServer('8.8.8.8', 'meinefirma.de'); // Google DNS

// Wenn kein zur Domäne passender MX-Record über den Google DSN gefunden wurde,
// durchsuchen wir nun vom Root-DNS Server aus nach unten durch die DNS-Serverlisten.
if s = '' then
  s := RFResolveMailServer('', 'meinefirma.de');

if (s <> '') then
  Mailserver := s
else
  Mailserver := 'E-Mail domäne ungültig';
Code:
unit RFIndyUtils;

{$IFNDEF INDY9}
  {$IF RTLVersion > 18.0}
    {$DEFINE INDY10}
  {$IFEND}
{$ENDIF}

interface

uses
  Classes, IdDNSResolver;

function RFGetMXServers(const ADNSServer: String; const ADomain: String;
  AMXServers: TStrings; ATimeOutMS: Integer = 0): Boolean; overload;
function RFGetMXServers(ADNSResolverComp: TIdDNSResolver;
  const ADNSServer: String; const ADomain: String; AMXServers: TStrings): Boolean; overload;
{ Liefert alle zu einer Domäne passenden Mailserver (MX) als StringList retour.
    ADNSServer: Name des zu verwendenden DNS-Servers oder leer wenn e.root-servers.net
                 verwendet werden soll.
    AResolveDomain: Domain-Name zu dem die Mailserver (MX) retour gegeben werden soll.
    AMXServers: Stringliste in der die Mailserver retour geliefert werden. }

function RFResolveMailServer(const ADNSServer, AResolveDomain: String;
  ATimeOutMS: Integer = 0): String;
{ Liefert die Mailserveradresse zu einer EMail zurück. Bsp: info@domain.com -> mail.domain.com
  Mögliche Rückgabewerte:
    Server gemäss DNS MX-Record oder leer wenn nichts gefunden.
  Parameter:
    ADNSServer: Name des zu verwendenden DNS-Servers oder leer zum Start bei einem root DNS-Server (empfohlen).
    AResolveDomain: Domain-Name zu dem der eigentliche Server-Name retour gegeben werden soll
    ATimeOutMS: Timeout in ms, die beim Lesen gewartet werden soll bevor ein Fehler kommt.
                 Wenn <= 0 wird der Standard verwendet }


implementation

uses
  SysUtils;


function SortServers(List: TStringList; Index1, Index2: Integer): Integer;
{ RFGetMXServers StringList-Sortierungsroutine }
var
  p1, p2: Word;
begin
  p1 := Word(List.Objects[Index1]);
  p2 := Word(List.Objects[Index2]);
  if p1 < p2 then
    Result := -1
  else if p1 > p2 then
    Result := 1
  else
    Result := 0;
end;

function InternalGetMXServers(ADNSResolverComp: TIdDNSResolver; const ADNSServer: String;
  const ADomain: String; AMXServers, ASearchedNSServers: TStrings): Boolean;
var
  i : Integer;
  NSServers, MXServers: TStringList;
  ServerARecord: String;
  TmpQueryType: TQueryType;
begin
  Result := False;
  AMXServers.Clear;
  if ADNSResolverComp = nil then
    Exit;

  if ADNSServer = '' then
    ADNSResolverComp.Host := 'k.root-servers.net'
  else
    ADNSResolverComp.Host := ADNSServer;
  try
    ADNSResolverComp.Resolve(ADomain);
    if ADNSResolverComp.QueryResult.Count = 0 then
    begin
      ADNSResolverComp.Host := 'i.root-servers.net';
      ADNSResolverComp.Resolve(ADomain);
    end;
  except
    Exit;
  end;

  MXServers := nil;
  ServerARecord := '';
  for i := 0 to ADNSResolverComp.QueryResult.Count - 1 do
  begin
    if ADNSResolverComp.QueryResult[i] is TMXRecord then
    begin
      if MXServers = nil then
        MXServers := TStringList.Create;
      with TMXRecord(ADNSResolverComp.QueryResult[i]) do
        MXServers.AddObject(ExchangeServer,TObject(Integer(Preference)));
    end;
    if ADNSResolverComp.QueryResult[i] is TARecord then
      ServerARecord := TARecord(ADNSResolverComp.QueryResult[i]).Name;
  end;

  if MXServers <> nil then
  begin
    MXServers.CustomSort(SortServers);
    AMXServers.Assign(MXServers);
    FreeAndNil(MXServers);
    Result := True;
    Exit;
  end;

  NSServers := nil;
  try
    for i := 0 to ADNSResolverComp.QueryResult.Count - 1 do
    begin
      if ADNSResolverComp.QueryResult[i] is TNSRecord then
      begin
        with TNSRecord(ADNSResolverComp.QueryResult[i]) do
        begin
          if HostName <> '' then
          begin
            if NSServers = nil then
              NSServers := TStringList.Create;
            NSServers.Add(HostName);
          end;
        end;
      end;
    end;

    if NSServers <> nil then
    begin
      for i := 0 to NSServers.Count-1 do
      begin
        { Bereits durchsuchte Subdomains sollen nicht mehr durchsucht werden }
        if ASearchedNSServers.IndexOf(NSServers[i]) = -1 then
        begin
          Result := InternalGetMXServers(ADNSResolverComp, NSServers[i], ADomain,
            AMXServers, ASearchedNSServers);
          if Result then
            Exit;
          ASearchedNSServers.Add(NSServers[i]);
        end;
      end;
    end
    else if ServerARecord <> '' then
    begin
      { Top Level no MX found, so we report the A record }
{$IFDEF INDY10}
      TmpQueryType := ADNSResolverComp.QueryType;
      ADNSResolverComp.QueryType := [qtA];
{$ELSE}
      TmpQueryType := ADNSResolverComp.QueryRecords;
      ADNSResolverComp.QueryRecords := [qtA];
{$ENDIF}
      try
        ADNSResolverComp.Resolve(ADomain);
        if ADNSResolverComp.QueryResult.Count <> 0 then
        begin
          AMXServers.Add(ADomain);
          Result := True;
        end;
      finally
{$IFDEF INDY10}
        ADNSResolverComp.QueryType := TmpQueryType;
{$ELSE}
        ADNSResolverComp.QueryRecords := TmpQueryType;
{$ENDIF}
      end;
    end;
  finally
    if NSServers <> nil then
      NSServers.Free;
  end;
end;

function RFGetMXServers(ADNSResolverComp: TIdDNSResolver; const ADNSServer: String;
  const ADomain: String; AMXServers: TStrings): Boolean; overload;
var
  SearchedNSServers: TStringList;
begin
  SearchedNSServers := TStringList.Create;
  try
    Result := InternalGetMXServers(ADNSResolverComp, ADNSServer, ADomain,
      AMXServers, SearchedNSServers);
  finally
    SearchedNSServers.Free;
  end;
end;


function RFGetMXServers(const ADNSServer: String; const ADomain: String;
  AMXServers: TStrings; ATimeOutMS: Integer = 0): Boolean;
var
  DNSResolver: TIdDNSResolver;
begin
  DNSResolver := TIdDNSResolver.Create(nil);
  try
{$IFDEF INDY10}
    if ATimeOutMS <> 0 then
      DNSResolver.WaitingTime := ATimeOutMS
    else
      DNSResolver.WaitingTime := 3000;
    DNSResolver.QueryType := [qtMX];
{$ELSE}
    if ATimeOutMS <> 0 then
      DNSResolver.ReceiveTimeout := ATimeOutMS
    else
      DNSResolver.ReceiveTimeout := 3000;
    DNSResolver.QueryRecords := [qtMX];
{$ENDIF}

    Result := RFGetMXServers(DNSResolver, ADNSServer, ADomain, AMXServers);
  finally
    DNSResolver.Free;
  end;
end;

function RFResolveMailServer(const ADNSServer, AResolveDomain: String;
  ATimeOutMS: Integer = 0): String;
var
  MXServers: TStringList;
begin
  Result := '';
  MXServers := TStringList.Create;
  try
    if RFGetMXServers(ADNSServer, AResolveDomain, MXServers, ATimeOutMS) then
      Result := Trim(MXServers[0]);
  finally
    MXServers.Free;
  end;
end;


end.

Geändert von Rolf Frei (30. Jul 2018 um 13:19 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#5

AW: [D2009] Online eMail-Adress Prüfung obs valide ist?

  Alt 30. Jul 2018, 12:10
Ok, das ist also eine etwas andere Aufgabenstellung, als ich vermutet hatte.

Per DNS prüfen, ob es die Domaine gibt.
Abfragen, ob es einen MX-Record gibt (d. h.: Domaine hat auch 'nen Mailserver).
Per RegEx prüfen, ob die angegebene Mailadresse (weitgehend) plausibel erscheint.

Als Gimmick vollkommen ausreichend.

Für die Verarbeitung einer Antwort per Link, wird ein Webserver benötigt. Den kann man aber per Indy oder ICS ins eigene Programm einbauen.

Theoretisch:

Programm starten
eMail-Adresse eingeben lassen
Mail an diese verschicken
User öffnet in seinem Mailprogramm die Mail
Klickt auf den Link
Das Programm kann mit seinem eingebauten HTTP-Server darauf reagieren.
(Es muss halt die ganze Zeit laufen und wir gehen davon aus, dass keine Firewall oder sonstwas die Kommunikation be- bzw. verhindert.)

Die Url im Link muss dann halt ungefähr so aussehen:

Code:
http://IP-des-Rechners-auf-dem-das-Programm-läuft:Port-auf-dem-das-Programmlauscht?email=eingegebene-email@domai.ne
also z. B.:
Code:
http://172.217.20.99:88?email=angela@merkel.de
Als Spielerei, um sich mit der Thematik mal auseinanderzusetzen, eine durchaus sinnvollunsinnige Aufgabe. Das dabei "abgegraste" Spektrum ist dann doch schon eher vielseitig
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: [D2009] Online eMail-Adress Prüfung obs valide ist?

  Alt 30. Jul 2018, 12:25
Für die Verarbeitung einer Antwort per Link, wird ein Webserver benötigt. Den kann man aber per Indy oder ICS ins eigene Programm einbauen.
Das ist es!!! Mir fehlt halt die Erfahrung, von daher wusste ich nicht mal das es Möglich ist bzw habe ich so etwas erst gar nicht in Betracht gezogen. Auch Dein Quick-Check Vorschlag gefällt mir sehr gut. Genau so werde ich vorgehen, Beispiele dafür (Server) gibt es ja reichlich.

Thread mehr als Happy beendet.

Vielen Dank für all Eure Mühen mit mir!!! Ich stürze mich da jetzt mal rein, ihr rockt
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#7

AW: [D2009] Online eMail-Adress Prüfung obs valide ist?

  Alt 30. Jul 2018, 12:39
Einen HTTP-Server den die Anwendung bereitstellt ... das ist doch eher ungewöhnlich und aus mehreren Gründen nicht zu empfehlen. Aber einfach selber probieren das übt.

Eigentlich hat man einen WebService laufen, der dann von der Anwendung diese email(-Adresse) erhält. Der WebService verschickt die email mit dem Link und verarbeitet auch den Link-Aufruf vom Anwender.

Die Anwendung fragt den WebService einfach nur noch nach dem Status der Aktivierung und gut.

Geändert von Schokohase (30. Jul 2018 um 12:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: [D2009] Online eMail-Adress Prüfung obs valide ist?

  Alt 30. Jul 2018, 12:55
@Schokohase:
Für Leute die keinen Eigenen Web-Server betreiben finde ich diese Idee total klasse von Delphi.Narium.
Ich muss halt Proxy/Firewall features mit reinbringen damit es überall laufen sollte, da lese ich mich gerade rein.

Zu Übungszwecke für mich als Neuling, finde ich es ein tolles Nebenprojekt um Erfahrung sammeln zu können.

Ob und in wie fern ich meine daraus gewonnenen Skills dann im Produkt umsetze weiß ich gerade selbst noch nicht.
Grundsätzlich hat bereits Delphi.Nariums Post meinen Horizont erweitert. Damit werde ich eine Weile beschäftigt sein.

*da war was rotes mit ellenlangen Text, ich hab auf Antworten geklickt.


@Rolf Frei: Vielen Dank für diesen umfangreichen und vor allem kommentierten Source, das ist echt voll nett von Dir!
Gruß vom KodeZwerg

Geändert von KodeZwerg (30. Jul 2018 um 13:14 Uhr)
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#9

AW: [D2009] Online eMail-Adress Prüfung obs valide ist?

  Alt 30. Jul 2018, 13:41
Du solltest dabei bedenken:

Wenn du von irgendeinem Rechner eine email direkt an den Mailserver des Empfänger verschickst, dann wird diese Mail mit sehr hoher Wahrscheinlichkeit als SPAM betrachtet (denn so machen das die SPAM-Schleudern auch)

Wenn du die Mails über deinen Mail-Provider versendest (um dieser SPAM Falle zu entgehen), dann müssen der Anwendung die Zugangsdaten bekannt sein (was blöd ist, denn dann hat der Anwender diese Zugangsdaten auch und kann sich diese mit mehr oder weniger Aufwand beschaffen)

Keinen WebServer zu haben ist nur faule Ausrede, denn es gibt auch kostenlose Angebote die dafür taugen.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: [D2009] Online eMail-Adress Prüfung obs valide ist?

  Alt 30. Jul 2018, 14:13
Wenn du von irgendeinem Rechner eine email direkt an den Mailserver des Empfänger verschickst, dann wird diese Mail mit sehr hoher Wahrscheinlichkeit als SPAM betrachtet (denn so machen das die SPAM-Schleudern auch)
Zur Kenntnis genommen, sind halt alle Komponenten die eMail direkt versenden untauglich, okay, dann lasse ich von meiner App den vorhandenen eMail Client starten oder den User entscheiden, das sollte diesen Punkt aushebeln.
Keinen WebServer zu haben ist nur faule Ausrede, denn es gibt auch kostenlose Angebote die dafür taugen.
Falls ich es noch nicht erwähnt habe, ich bin Neuling im Umgang mit Delphi und Online Aktivitäten.
Ich habe mir mal einen RSS Reader für die DP gebastelt und herausgefunden wie ich Html Quelltext bekomme, das wars auch schon.

Ich bin im Urlaub und wollte eigentlich nur einen Registrierungs-Dialog auf Vordermann bringen, nicht lernen wie ich einen WebServer betreibe/installiere/bekomme/etc pp.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz