Schrift
[thread]502[/thread]

Verifizieren einer E-Mail-Adresse

Leser: 1


<< >> 8 Einträge, 1 Seite
Gast Gast
 2005-06-04 00:06
#5027 #5027
Hallo!

Habe keine Ahnung von Perl, möchte aber gerne ein Skript abändern.

Dieses Skript zum Formular-Versand gibt oft die Fehlermeldung einer ungültigen E-Mail-Adresse aus.

Dies liegt meines Erachtens an folgendem Abschnitt des Skripts, welches die angegebenen E-Mail-Adressen verifiziert.

Bei den mir bekannten vom Skript abgelehnten E-Mail-Adressen handelt es sich um Adressen, die ein "-" vor oder auch nach dem "@" besitzen. Eine E-Mail-Adresse mit zwei "-" nach dem @ wird hingegen akzeptiert.


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
################################################
## Verify an e-mail address
################################################

sub mail_verify {
my $addr = shift;

## Format the address
my ($login, $host) = $addr =~ /^(.+)\@(.+)$/;
$login =~ s/\.//g;
$host =~ s/[\.\-]//g;

## Make sure address is valid
if (($login =~ /\W/) || ($host =~ /\W/)) { return 0; }
else { return 1; }

}



1.) Kann mir jemand sagen, welche Fälle dieses Skript ausschließt?

2.) Welchen Code muss ich statt dessen einfügen, damit NUR verifiziert wird, ob ein "@" vorkommt und meinetwegen noch ob ein "." hinter dem "@" folgt?


Vielen Dank für die Hilfe!!

Thorsten
ptk
 2005-06-04 00:08
#5028 #5028
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Benutz lieber ein Modul wie Email::Valid oder RFC::RFC822::Address oder Mail::RFC822::Address
Thorsten
 2005-06-04 00:50
#5029 #5029
User since
2005-06-04
2 Artikel
BenutzerIn
[default_avatar]
Wie gesagt, ich habe so gut wie keine Programmiererfahrung. Ich weiß jetzt zwar, dass es offenbar offizielle Module gibt, nur bin ich an dieses Standard-Skript gebunden und kann - wenn ich nichts an den vorhandenen Variablen etc. ändern will/kann - selbst sicherlich nicht das Modul einbinden?

Was müsste ich also anstelle des o.g. Codes in das Skript einfügen, OHNE andere Skript-Abschnitte zu ändern, aber trotzdem das o.g. Problem zu umgehen?

Vielen Dank!

Thorsten
betterworld
 2005-06-04 00:54
#5030 #5030
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Keanuf
 2005-06-04 01:34
#5031 #5031
User since
2005-06-02
9 Artikel
BenutzerIn
[Homepage] [default_avatar]
Also meine vorredner haben da recht.
Du solltest, gerade wie sich die Variablen nennen vorsicht walten lassen.
Da sich die User anscheinend per Mail Adresse einloggen dürfen.

naja wenn du es probieren willst, dann kannst du einfach folgende Zeile ändern.

Code: (dl )
1
2
    $login =~ s/\.//g;
$host =~ s/\.//g;


Also einfach die $host variabel wie die $login variabel überprüfen lassen. Dann sollte es klappen.

Aber Obacht bitte.

Und eventuell doch schon vordefenierte Module
(links von den Vorrednern)
verwenden, diese sind einfach einzubinden
und haben sich 1000 fach bewährt.

Hoffe geholfen zu haben.
Wenn du es lokal probieren willst.

hier noch ein test Code:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/perl
use strict;


print "\n Bitte hier eine Mail Adresse eingeben :";
chomp (my $addr=<STDIN>);
print "\n Adresse = " .$addr;
my ($login, $host) = $addr =~ /^(.+)\@(.+)$/; #split('@',$addr,2)
print @_;
print "\n";
print $_;
print "\n login:".$login;
print "\n host:".$host."\n";

$login =~ s/\.//g;
$host =~ s/\.//g;
#$host =~ s/[\.\-]//g;
print " login nach bearbeitung :".$login."\n";
print " host nach bearbeitung :".$host."\n";
Thorsten
 2005-06-04 04:21
#5032 #5032
User since
2005-06-04
2 Artikel
BenutzerIn
[default_avatar]
Danke Keanuf!

Ich hab ja gar nichts dagegen, ein vordef. Modul einzubinden, weiß halt nur nicht wie...
Außerdem muss dieses Modul ja offenbar auf dem Server installiert werden - den Zugriff habe ich aber eh nicht...

Zwar hat der Autor des Skripts als Variablen $login und $host verwendet. Mit Einloggen hat das Skript aber nichts zu tun - ist ein stinknormales FormMail Skript (siehe http://www.envex.com/software/formmail.html).

Da ich kein Perl-Programmierer bin und dies auch nicht werden möchte, hab ich mich dieses freien Skripts bedient, das mir alles bietet, was ich benötige... Ist halt nur etwas "knauserig" bei der E-Mail-Überprüfung.

Wenn ich übrigens die von dir vorgeschlagene Änderung vornehme, dann akzeptiert das Skript E-Mail-Adressen mit "-" vor dem "@", aber wiederum keine E-Mail-Adressen à la name@erstens-zweitens-drittens.com, also mit zwei "-" nach dem @.

Ändere ich es genau umgekehrt, also wie folgt:
Code: (dl )
1
2
    $login =~ s/[\.\-]//g;
   $host =~ s/[\.\-]//g;


... dann scheint das Skript jedwede Form anzunehmen.

Habe mich jetzt mal etwas bei SELFHTML durch den Perl Bereich geklickt...

Verstehe ich das richtig, dass dieser Teil des Skripts (siehe erstes Posting) bei einer angegebenen E-Mail-Adresse die Adresse in einen Teil vor und einen nach dem "@" auftrennt, dann jeweils "." (siehe $login) und/oder "-" entfernt (siehe $host) entfernt und schließlich per /\W/ prüft, ob dann $login oder $host noch ein Zeichen enthält, was weder Buchstabe noch Ziffer noch Unterstrich ist?

Wenn dem so ist, müsste das Skript nach meiner Änderung nun alle E-Mail-Adressen akzeptieren, die aus Buchstaben, Ziffer, Unterstrich, Bindestrich und Punkt zusammengesetzt sind... Oder?

Das würde mir zumindest reichen...

Ich verstehe dann nur noch nicht, warum bei deinem Vorschlag E-Mail-Adressen mit einem Bindestrich vor dem "@" akzeptiert werden...?!

Was genau bedeutet
Code: (dl )
$login =~ s/\.//g;

bzw.
Code: (dl )
$login =~ s/[\.\-]//g;

?

Danke jedenfalls für deinen Hinweis!

Der Testcode funzt bei mir nicht... Gibt nur die eingegebene E-Mail-Adresse wieder, aber jeweils keine Daten hinter den Doppelpunkten.
Keanuf
 2005-06-05 02:26
#5033 #5033
User since
2005-06-02
9 Artikel
BenutzerIn
[Homepage] [default_avatar]
Thorsten bitte,
aber anscheinend klappt es ja noch nicht.

Leider kann ich dir nicht alle fragen beantworten, da ich in Perl auch nicht der fitteste bin aber fangen wir einfach mal von oben an.

Da du leider keine Lust hast perl ein bisschen kennezulernen.
Dadurch auch die Module oder auch Einbindung in dein Skript nicht erlernen willst, müssen wir uns da mal um dein Code Stück kümmern, das du da hast.

Quote
Wenn ich übrigens die von dir vorgeschlagene Änderung vornehme, dann akzeptiert das Skript E-Mail-Adressen mit "-" vor dem "@", aber wiederum keine E-Mail-Adressen à la name@erstens-zweitens-drittens.com, also mit zwei "-" nach dem @.


so hier mal meine Ausgabe mit dem Testskript.

Quote
Bitte hier eine Mail Adresse eingeben :name@erstens-zweitens-drittens.com

Adresse = name@erstens-zweitens-drittens.com

login:name
host:erstens-zweitens-drittens.com
login nach bearbeitung :name
host nach bearbeitung :erstens-zweitens-drittenscom


Quote
Verstehe ich das richtig, dass dieser Teil des Skripts (siehe erstes Posting) bei einer angegebenen E-Mail-Adresse die Adresse in einen Teil vor und einen nach dem "@" auftrennt


Ja das habe ich auch so verstanden.

Quote
dann jeweils "." (siehe $login)


hmm also hier wird ein . durch nichts ersetz also nicht einmal einem leerzeichen.

s/suchmuster/ersetzeichen/[optionen]

Quote
und/oder "-" entfernt (siehe $host)

bei der $ host wird ein punkt oder ein - ersetzt durch nichts.

hier sind wir also auch im einklang

Quote
schließlich per /\W/ prüft, ob dann $login oder $host noch ein Zeichen enthält, was weder Buchstabe noch Ziffer noch Unterstrich ist?


Genau so seh ich das hier auch.

Quote
Wenn dem so ist, müsste das Skript nach meiner Änderung nun alle E-Mail-Adressen akzeptieren, die aus Buchstaben, Ziffer, Unterstrich, Bindestrich und Punkt zusammengesetzt sind... Oder?


Also ich versteh das aber anders.
Wenn du einfach $login und $host ohne weitere Überprufungen nimmst.

also ohne s/[./-]//g nimmst erst dann werden auch alle angenommen.

Aber hier hast du das Problem, das alle möglichen Zeichen in einer E-Mail adresse sein können.

Das heist, das auch einfache Fakes von Mail adressen durch kommen.

also Beispiel
.-@-.

was ja wirklich keinen Sinn macht.
Hier musst du abwegen, was du haben willst.

Quote
Ich verstehe dann nur noch nicht, warum bei deinem Vorschlag E-Mail-Adressen mit einem Bindestrich vor dem "@" akzeptiert werden...?!


hmm sie gehen halt durch, wenn in $login und in $host keine nicht alphabetischen Zeichen enthalten hast.

Aber nachdem du nun dein Problem selber erkannt hast, dann kannst du es doch auch selber lösen.

Und wie du siehst ist perl auch nicht schwer oder ??
pKai
 2005-06-05 03:50
#5034 #5034
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Ich verwende gerne die $address_rx aus CPAN:Mail::Sendmail, was man auch durch einfaches Kopieren "installieren" kann.

Wenn man sich den relevanten Code-Zeilen direkt kopiert, lautete die entsprechende sub
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sub mail_verify {
my $addr = shift;
# copied code from Mail::Sendmail begins here
my $word_rx = '[\x21\x23-\x27\x2A-\x2B\x2D\x2F\w\x3D\x3F]+';
my $user_rx = $word_rx # valid chars
.'(?:\.' . $word_rx . ')*' # possibly more words preceded by a dot
;
my $dom_rx = '\w[-\w]*(?:\.\w[-\w]*)*'; # less valid chars in domain names
my $ip_rx = '\[\d{1,3}(?:\.\d{1,3}){3}\]';

$address_rx = '((' . $user_rx . ')\@(' . $dom_rx . '|' . $ip_rx . '))';
# copied code from Mail::Sendmail ends here
# now use the regex:
$addr =~ /^$address_rx$/;
}

Ob selbst eine "korrekte" Adresse überhaupt einem ereichbaren Postfach entspricht ist natürlich ein ganz anderes Problem ;)\n\n

<!--EDIT|pKai|1117929217-->
I sense a soul in search of answers.
<< >> 8 Einträge, 1 Seite



View all threads created 2005-06-04 00:06.