PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Shell: eMail-Syntax prüfen



Bugs1984
09-06-2009, 23:16
Hallo,
ich muss gleich zu Beginn sagen, dass ich ein Shell/Bash-Anfänger bin und ich stehe vor einem für mich größerem Problem.

Ich möchte eine eMail-Adresse auf ihre Syntax prüfen.
z.B. email@test.adresse.de

ich möchte
1. "email" und "test.adresse.de" in ein 2-elementiges Array speichern
2. "email" Zeichen für Zeichen durchgehen und prüfen, ob keine Sonderzeichen etc. vorkommen und "email" darf max. 100 zeichen haben
3. "test.adresse.de" darf auch keine Sonderzeichen beinhalten insgesamt nur 100 Zeichen haben, wobei in diesem beispiel "test", "adresse" und "de" jeweils nur max. 50 Zeichen haben darf (also jedes Wort das mit einem Punkt getrennt ist)

Kann mir jemand helfen wie ich das anstelle? Geht das irgendwie mit regulären Ausdrücken oder muss man das wirklich mit Schleifen implementieren?

Danke schon mal an alle Hilfsbereiten!

ContainerDriver
10-06-2009, 12:48
Hallo,

ja, das kannst du mit einem regulären Ausdruck überprüfen.
Such mal im Internet nach "email address regexp", da finden sich einige Beispiele. Um die Ausdrücke an deine Längenangaben anzupassen, kannst du mal http://de.wikipedia.org/wiki/Regexp lesen.

Gruß, Florian

Bugs1984
10-06-2009, 16:16
danke schon mal. :)

aber wie kann ich den letzten Teil hinter dem @ mit regEx ausdrücken?
also quasi
([a-z][A-Z][0-9]._-+){1,50}\.([a-z][A-Z][0-9]._-+){1,50}

aber halt noch dass beliebig oft dahinter .[a-z]...{1,50} usw. kommen darf und der ganze hintere teil max. 200 Zeichen haben darf

ContainerDriver
10-06-2009, 16:40
In dem Fall kommst du wohl nicht mit einem Ausdruck aus. Du könntest erst überprüfen, ob der Aufbau vom Prinzip her passt und in einem zweiten Schritt schauen, ob die Länge nach dem @ Zeichen <= 100 (bzw. 200) ist.

jan61
10-06-2009, 18:58
Moin,

innerhalb eines regulären Ausdrucks kann man das wohl nicht abbilden, aber mit Hilfe des sed trotzdem in einem Rutsch prüfen:

echo 'email@test.adresse.de' | \
sed -rn '/^[A-Za-z0-9_-]{1,100}@[A-Za-z0-9_.-]{1,200}/{
s/.+@//
: lbl
s/^[A-Za-z0-9_-]{1,50}\.//
t lbl
/^[A-Za-z0-9_-]{1,50}$/=}'
Der sed wird mit den Optionen für extended regex und "halts Maul" (keine Ausgabe) gestartet.

Im sed läuft folgendes ab:

Zeile 1- führe die Kommandos in den {} nur aus, wenn die Eingabe aus max. 100 Buchstaben, Ziffern, "_" oder "-" vor dem Klammeraffen und max. 200 Buchstaben, Ziffern, "_", "-" und "." nach dem Klammeraffen besteht

Zeile 2 - entferne alles inkl. Klammeraffe, übrig bleibt der Domain-Anteil.

Zeile 3 - definiere eine Sprungmarke "lbl"

Zeile 4 - entferne vom Beginn des Rests alle Buchstaben, Ziffern, "_" oder "-", die max. 50 Zeichen lang sind und von einem Punkt gefolgt werden. Damit wird ein nach Deiner Definition gültiger Domainpart am Anfang entfernt.

Zeile 5 - wenn in Zeile 4 eine Ersetzung stattgefunden hat, dann springe zurück zur Sprungmarke "lbl". Damit wird in einer Schleife jeder gültige Domainteil bis auf den letzten nacheinander entfernt

Zeile 6 - wenn der verbliebene Rest nur aus Buchstaben, Ziffern, "_" oder "-" besteht, dann gib die Zeilennummer aus.

Wenn Du den sed aufrufst, dann kriegst Du nur dann eine "1" zu sehen, wenn die Adresse Deinen Anforderungen genügt, ansonsten wird nichts ausgegeben. Das kannst Du dann so testen:

if test -n "`echo ... | sed '...'`"; then
echo OK
else
echo Fehler
fiBitte noch durchtesten, ich habs nur oberflächlich gemacht.

Noch ein Hinweis: Die Einzelregex müssten eigentlich noch verfeinert werden - am Beginn einer Adresse oder eines Domainteils darf z. B. kein "_" oder "-" stehen.

Jan

P.S.: Wenn Du Dir genauer angucken willst, was der sed macht, dann setze jeweils an das Ende der sed-Zeilen 2 und 4 die Zeichenfolge ";p", damit wird Dir ausgegeben, was nach den Ersetzungen übrig bleibt.

EDIT: Noch eine Variante - praktisch, wenn Du aus einer Datei eine Liste von Adressen prüfen willst. Ich habe den sed-Teil mal in eine eigene Scriptdatei gepackt:

jan@jack:~/tmp> cat chk_addr.sed
/^[A-Za-z0-9_-]{1,100}@[A-Za-z0-9_.-]{1,200}/{
h
s/.+@//
: lbl
s/^[A-Za-z0-9_-]{1,50}\.//
t lbl
/^[A-Za-z0-9_-]{1,50}$/{g;p}
}
jan@jack:~/tmp> sed -rnf chk_addr.sed adressen.txt
email@meine.adresse.de
e_mail-addr@meine2.mail_adresse.de
Neu ist die Zeile 2: Der Inhalt der Adresse wird vor dem Zerpflücken in den Haltepuffer kopiert. In der letzten Zeile des sed-Scripts wird dann bei Erfolg der Haltepuffer wieder zurückgeholt und dann ausgegeben. Damit gibt das sed-Kommando dann nur die gültigen Adressen aus der Datei "adressen.txt" aus.

Bugs1984
11-06-2009, 15:34
viele dank für deine Hilfen und Mühen.
Das hilft mir ja schon mal weiter :)
dann mach ich mich mal ans bauen...und wenn alles nichts hilft code ich es quick'n'dirty mit ganz vielen IFs ^^

Sid Burn
12-06-2009, 17:12
quick & clean & correct



sidburn@sid:~$ perl -MEmail::Valid -wle 'print Email::Valid->address($ARGV[0]) ? "Valid" : "Invalid"' "sid.burn@example.com"
Valid


Aber ich weiß, für nen Bash Frickler ist das zu einfach und zu korrekt. Lieber wird Tage verschwendet um eine unqick & dirty & uncorrect Version zusammenzuschustern. ;) :p

Okay für deine komischen weiteren beschränken müsste man noch code hinzufügen, aber zumindest prüft dieses schnipsel auf eine valide email Adresse, was die bisherigen Beispiele nicht tun.

jan61
12-06-2009, 18:51
Moin,


...Aber ich weiß, für nen Bash Frickler ist das zu einfach und zu korrekt. Lieber wird Tage verschwendet um eine unqick & dirty & uncorrect Version zusammenzuschustern. ;) :p

WÜRDEST DU DICH BITTE MAL ETWAS ZUSAMMENREISSEN? Mir reichts langsam mit Deinen Unverschämtheiten!

Wenn Du bash-Bashing treiben willst, dann mach ein eigenes Forum auf und halt Dich hier raus!

Jan

Sid Burn
13-06-2009, 02:19
WÜRDEST DU DICH BITTE MAL ETWAS ZUSAMMENREISSEN? Mir reichts langsam mit Deinen Unverschämtheiten!

Deine Aussage würde bedeuten das ich das ständig bisher mache, kannst du Quellen dazu liefern?

Und nebenbei sind da am ende des Satzes nicht umsonst zwei Smileys. Ein zwinkendes Smiley hat folgende bedeutung.

http://www.vtxnet.ch/community/chat/smilies.asp
> ;-) Lächeln mit Augenzwinkern, Ironie

Und da im Internet eben Ausdrucksweise nicht übertragen wird, kann man solche Smileys nicht einfach ignorieren. Wenn du soetwas nicht verstehst dann tut es mir leid.



Wenn Du bash-Bashing treiben willst, dann mach ein eigenes Forum auf und halt Dich hier raus!
Wäre ich lediglich auf Bash-Bashing hinaus dann hätte ich den Threadstarter keine Lösung für eine E-Mail Validierung gezeigt.

Die Kritik auch wenn es Ironie ist, dass die bash nicht geeignet ist (auch sed,awk) um eine E-Mail zu validieren und das es deutlich einfacher geht muss man letztendlich hinnehmen. Hätten diese Sachen ein Modulsystem etc. würde es anders ausschauen, aber das haben Sie nicht. Immer wieder das Rad von vorne zu bauen halte ich ziemlich Sinnlos. Der Threadstarter kann selber wählen was er benötigt und was evtl. besser für ihn passt.

jan61
13-06-2009, 17:42
Moin,


Und nebenbei sind da am ende des Satzes nicht umsonst zwei Smileys. Ein zwinkendes Smiley hat folgende bedeutung.

Ach so - mit einem Smiley versehen, kannst Du jede Herabsetzung durch die Welt schicken? Du irrst! Eine Unverschämtheit wird nicht automatisch zu Ironie, wenn man ein Smiley dahinter setzt. Und Deine Oberlehrer-Bemerkungen wie "Ein zwinkendes Smiley hat folgende bedeutung" kannst Du Dir auch schenken - ich weiß, was das bedeutet.


Wäre ich lediglich auf Bash-Bashing hinaus dann hätte ich den Threadstarter keine Lösung für eine E-Mail Validierung gezeigt.

Das war aber nicht das Hauptproblem. Regex für die Validierung einer Mailadresse kannst Du Dir tonnenweise aus dem Netz ziehen (bzw. selbst bauen, es gibt ja RFCs dafür), es ging um die zusätzlichen Anforderungen. Dazu hast Du gar nichts beigetragen - ach doch: "Okay für deine komischen weiteren beschränken müsste man noch code hinzufügen" - tolle Hilfe. Mit "komischen" weiteren Beschränkungen gibt man sich ja nicht ab, wenn man kein "Bah-Frickler" ist, nicht wahr?


Die Kritik auch wenn es Ironie ist, dass die bash nicht geeignet ist (auch sed,awk) um eine E-Mail zu validieren

Wieder eine Deiner aus der Luft gegriffenen (bzw. Deinen eigenen Ansichten folgenden) Behauptungen, die sich vor allem durch das Fehlen jeglicher handfester Begründungen auszeichnen.

Weißt Du was? Ich habe keine Lust mehr, mich über Deinen Quark aufzuregen. Viel Spaß noch hier im Forum, vielleicht finden ja andere Deinen Stil "lustig". Ich habe keinen Bock mehr auf Dein Gelaber.

Bye
Jan

ContainerDriver
13-06-2009, 20:44
Hallo,



Weißt Du was? Ich habe keine Lust mehr, mich über Deinen Quark aufzuregen. Viel Spaß noch hier im Forum, vielleicht finden ja andere Deinen Stil "lustig". Ich habe keinen Bock mehr auf Dein Gelaber.

Bye
Jan

das war jetzt aber hoffentlich nicht die Verabschiedung aus dem Forum!? Für solche Fälle steht dir die Ignorierliste zur Verfügung.


Und Deine Oberlehrer-Bemerkungen wie "Ein zwinkendes Smiley hat folgende bedeutung" kannst Du Dir auch schenken - ich weiß, was das bedeutet.

Die Oberlehrerbemerkung im Zusammenhang mit der lausigen Rechtschreibung und Zeichensetzung in Sid Burns Posting hat allerdings schon einen gewissen Charm. :)

Und zum Thema "quick & clean & correct" wollte ich noch beitragen:

$ perl -MEmail::Valid -wle 'print Email::Valid->address($ARGV[0]) ? "Valid" : "Invalid"' "sid.burn@example.com"
Can't locate Email/Valid.pm in @INC (@INC contains: /usr/lib/perl5/site_perl/5.10.0 /usr/share/perl5/site_perl/5.10.0 /usr/lib/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5/core_perl /usr/share/perl5/core_perl /usr/lib/perl5/current /usr/lib/perl5/site_perl/current .).
BEGIN failed--compilation aborted.
, hier würde es für mich ziemlich schnell unquick werden; Jans Lösung macht in diesem Fall aber genau das, was sie soll.

Gruß, Florian

pertze
26-06-2009, 09:46
[...] hier würde es für mich ziemlich schnell unquick werden [...]


$ time perl -MCPAN -e 'install Email::Valid'
[...]
real 0m26.800s
user 0m8.573s
sys 0m1.704s


:)

jeebee
26-06-2009, 15:07
$ time perl -MCPAN -e 'install Email::Valid'
[...]
real 0m26.800s
user 0m8.573s
sys 0m1.704s


:)

Wenn man denn auch die Berechtigung dazu hat... ;)

Sid Burn
26-06-2009, 16:05
Wenn man denn auch die Berechtigung dazu hat... ;)
Wenn du den "cpan" Befehl als Benutzer startest dann fragt er dich in der Konfiguration wo du die Module hin installieren möchtest. Daher kannst du sowas auch mit normalen Benutzerrechten machen und deine Module lokal in irgendein Verzeichnis installieren.



Jans Lösung macht in diesem Fall aber genau das, was sie soll.


sidburn@sid:~$ cat addressen.txt
email@meine.adresse.de
e_mail-addr@meine2.mail_adresse.de
asdf
-@-
sid.burn@example.org
12345678901234567890123456789012345678901234567890 1234567890-1234567890@123456789012345678901234567890123456789 0.de

sidburn@sid:~$ sed -rnf chk_addr.sed addressen.txt
email@meine.adresse.de
e_mail-addr@meine2.mail_adresse.de
-@-
12345678901234567890123456789012345678901234567890 1234567890-1234567890@123456789012345678901234567890123456789 0.de


Zum Beispiel invalide email addressen wie "-@-" als gültig anerkennen und gültige addressen wie "sid.burn@example.org" als ungültig zu erkennen?

Weiterhin waren die bedingungen das die email nicht größer als 100 zeichen sein darf. Die letzte ist allerdiengs 115 Zeichen lang und wird trotzdem als gültige ausgegeben.

Eine weitere Begrenzung war das die abschnitte nur jeweils maximal 50 Zeichen groß sein dürfen. Der erste teil meiner letzten email ist allerdiengs 61 Zeichen lang und wird ebenfalls als gültig anerkannt.

Um es also zusammenzufassen. Das ganze macht keine Validierung von eMail Adressen, weder noch erfüllt es irgendeine bedingung des Thread erstellers. Eine Antwort das er Gestern Abend Würstchen zu Abendbrot gegessen hat, wäre letztendlich genauso hilfreich gewesen.


EDIT: Habe die Bedingungen nochmals durchgelesen, anscheind habe ich sie beim ersten Lesen falsch verstanden. Mit "email" meinte er wohl den "User" Anteil und nicht die "email" an sich. Dann wird jan61 lösung zumindest bei den bedingungen etwas besser. Punkt 3 wird aber immer noch nicht erfüllt da solch eine email adresse "123@12345678901234567890.12345678901234567890.1234 5678901234567890.12345678901234567890.123456789012 34567890.de" trotzdem noch als valide angesehen wird, die bedingung lautet aber alles nach "@" 100 Zeichen. Das sind allerdiengs 107 Zeichen. Aber von diesen Bedingungen halte ich ja sowieso nichts (wie ich hiernach ja schon schreiben werde).



Den kleinen Schnipsel den ich gepostet habe validiert allerdiengs eine eMail Adresse auf RFC Konformität. Zusätzlicher Code für die bedingungen habe ich deswegen nicht geschrieben da ich es für mich sinnlos halte. Das was ich aus der Anfrage heraus lese ist wie man eine email adresse validieren kann. Das tut dies. Durch die zusätzlichen Begrenzungen die er auffült mit 50 zeichen hier und da, das macht eine eMail Adresse nicht valider, eher im Gegenteil, es shließt eventuelle Gültige email Adressen aus.

Möchte man Wissen ob ein Benutzer wirklich eine korrekte eMail Adresse eingegeben hat, so könnte man beispielsweise bei Email::Valid noch den "mxcheck" hinzufügen. Das macht dann eine DNS abfrage und schaut ob die Domain wirklich existiert.

Dadurch werden auch emailadressen wie "sid.burn@jan61.de" als nicht valide angesehen auch wenn sie RFC Konform sind weil die Domain z.B. gar nicht existiert. Allerdiengs setzt soetwas natürlich eine funktionierende Internet verbindung vorraus, und macht das überprüfen natürlich langsamer.


sidburn@sid:~$ perl -MEmail::Valid -wle 'print Email::Valid->address( -address => $ARGV[0], -mxcheck => 1 ) ? "Valid" : "Not Valid"' sid.burn@jan61.de
Not Valid

Natürlich kann man keine Accounts testen, soetwas ist aber sinvoller zur Validierung als das was sich der TE anscheind dadrunter vorstellt.

Zumindest sind dann solche Sätze Lustig.

Mit "komischen" weiteren Beschränkungen gibt man sich ja nicht ab, wenn man kein "Bah-Frickler" ist, nicht wahr?

Anscheind ist es toller sich mit den bedinungen auseinanderzusetzen, dann allerdiengs eine Lösung zu präsentieren die weder die hauptaufgabe (validieren von emails) noch die zusätzlichen aufgaben erfüllt.

Und tut mir leid, wer sich wie jan61 so aufregt weil ich "Bash-Frickler" sagte den kann eh nicht mehr geholfen werden. Vorallem da ich es als "Ironie" getagt habe und nochmals daraufhin gewiesen habe das es Irnoie war.

Wer soetwas dann nicht versteht tut mir wirklich leid, hätte ich mit wilden Beleidigungen angefangen wäre das eine andere Sache gewesen, sich aber über so ein flapsiges Kommentar so aufzuregen wo dann "der Spaß aufhört" ist in meinen Augen einfach nur lächerlich.

Aber okay, Personen mit Humor im negativen bereich gibt es anscheind wirklich.

Vorallem war das ja noch eher ein kompliment. Nur ich als Perl-Frickler weiß was frickeln wirklich bedeutet und habe die höchsten schwarzen Gürtel des Frickelns erlangt. Wenn also ein Perl Programmierer sagt du frickelst, sollte man sich geehrt fühlen. ;)