Zur Zeit wird gefiltert nach: visual basic
Filter zurücksetzen

11.02.2010
 | Autor: Maximilian Kalus | Abgelegt in:  | Kommentare: 0

E-Mail-Liste per Visual Basic oder Perl reinigen

Fazit

Wie man sieht, sind die Programme im Kern einfach. Das VB-Net-Programm ist natürlich nicht ganz vollständig, zeigt jedoch die wesentliche Funktionsweise.

Bei der Perl-Datei wird die bereinigte Liste auf die Standardausgabe ausgegeben. Um diese in einer Datei zu speichern, gibt man folgendes an: cleanmail.php liste.txt > bereinigt.txt. Dies funktioniert unter Windows (z.B. mit ActiveState Perl) und natürlich unter unixoiden Systemen (Linux, BSD, Mac).

Wer die Programme herunterladen will, kann das hier machen:

VB.Net-Programmteil "cleanmail.exe"

Quelltext:  Alles auswählen  |  Zeilennummerierung an/aus
  1. Sub CleanFile(ByVal file As String, ByVal outFile As String)
  2.     Dim line As String
  3.  
  4.     tbOut.AppendText("Cleaning file: " + file + vbNewLine)
  5.  
  6.     'Open File
  7.     Dim sr
  8.     Try
  9.         Dim fs As New FileStream(file, FileMode.Open)
  10.         sr = New StreamReader(fs)
  11.     Catch ex As Exception
  12.         tbOut.AppendText("Could not find file " + file + ".")
  13.         Exit Sub
  14.     End Try
  15.  
  16.     'Write File
  17.     Dim sw
  18.     Try
  19.         Dim fo As New FileStream(outFile, FileMode.Create)
  20.         sw = New StreamWriter(fo)
  21.     Catch ex As Exception
  22.         tbOut.AppendText(("Could not create file " + file + "."))
  23.         Exit Sub
  24.     End Try
  25.  
  26.     'Read File - each line...
  27.     Do Until sr.Peek() = -1
  28.         line = sr.ReadLine()
  29.         If line <> "" And EmailAddressCheck(line) Then
  30.             sw.WriteLine(line)
  31.         Else
  32.             tbOut.AppendText("Stripped: " + line + vbNewLine)
  33.         End If
  34.     Loop
  35.  
  36.     'Close everything
  37.     sr.Close()
  38.     sw.Close()
  39.  
  40.     tbOut.AppendText("Finished writing " + outFile + ".")
  41. End Sub
  42.  
  43. Private Function EmailAddressCheck(ByVal emailAddress As String) As Boolean
  44.     Dim pattern As String = "^[a-zA-Z][a-zA-Z0-9\._%+-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)*\.([A-Za-z]{2,})$"
  45.     Dim emailAddressMatch As Match = Regex.Match(emailAddress, pattern)
  46.     If emailAddressMatch.Success Then
  47.         EmailAddressCheck = True
  48.     Else
  49.         EmailAddressCheck = False
  50.     End If
  51. End Function

Perl-Programm "cleanmail.pl"

Quelltext:  Alles auswählen  |  Zeilennummerierung an/aus
  1. #!/usr/bin/perl
  2.  
  3. #Parameter 1 muss eine Eingabedatei sein
  4. if(!$ARGV[0]) { print("Bitte eine Eingabedatei angeben!\n"); exit 1; }
  5. #Kann Datei geöffnet werden
  6. if (!open(HANDLE, $ARGV[0])) {
  7.     print("Konnte Datei ".$ARGV[0]." nicht finden!\n");
  8.     exit 1;
  9. }
  10.  
  11. #Datei zeilenweise abarbeiten
  12. foreach my $line (<HANDLE>) {
  13.     chomp($line); #Leerzeichen vorne und hinten entfernen
  14.     #auf E-Mail prüfen:
  15.     if ($line =~ /^[a-zA-Z][a-zA-Z0-9\._%+-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)*\.([A-Za-z]{2,})$/) {
  16.         print $line."\n"; #falls ok: Ausgeben
  17.     }
  18. }
  19.  
  20. exit 0;
Quelltext:  Alles auswählen  |  Zeilennummerierung an/aus
  1. info@testtest.com
  2. marcus.mueller@nocheintest.de
  3. Total falsch
  4. keine.@mail..xx
  5. Nicht@erlaubt
  6. root@sub.domain.com

Reguläre Ausdrücke

Um E-Mails auf Validität zu prüfen, ist der Einsatz von Regulären Ausdrücken (Regular Expressions) sinnvoll. Reguläre Ausdrücke können Texte auf Muster überprüfen. E-Mails sollten theoretisch dem RFC 2822 Standard entsprechen. Ein Regulärer Ausdruck zur Prüfung einer E-Mail nach diesem Standard findet man beispielsweise unter http://code.iamcal.com/php/rfc822/full_regexp.txt. Der Ausdurck ist dabei schlappe 3768 Zeichen lang und für die meisten Anwendungsfälle unnötig.

Folgender Ausdruck genügt für 99% der Fälle vollkommen: ^[a-zA-Z][a-zA-Z0-9\._%+-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)*\.([A-Za-z]{2,})$. Hierbei werden folgende Schritte ausgeführt:

  • Am Anfang der Mail muss ein Buchstabe (a-z oder A-Z) stehen.
  • Dann folgen 1 oder mehrere Zeichen, die auch Zahlen oder ., _, %, + und - enthalten können.
  • Jede E-Mail besitzt ein @.
  • Dann folgt eine Domain aus Buchstaben und Zahlen.
  • Möglicherweise existieren weitere Domainnamen, wenn die E-Mail einer Subdomain zugeordnet wurde.
  • Die Toplevel-Domain besteht nur aus Buchstaben und muss mindestens zwei Zeichen lang sein.

Nun kann man kleine Programme schreiben, welche E-Mails entsprechend auswerten. Als Beispiel habe ich im Folgenden Perl und VB.Net genommen (wurde von den Kunden nachgefragt).

Hin und wieder kommt es vor, dass Kunden von mir Listen mit E-Mails bereinigen müssen, beispielsweise für Newsletter. Da die Datenbestände oft falsche E-Mails enthalten, habe ich zwei kleine Programme zur E-Mail-Bereinigung in Perl und Visual Basic geschrieben.
[mehr]