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]
02.02.2010
 | Autor: Maximilian Kalus | Abgelegt in:  | Kommentare: 1

Codeschnippsel: PNG-Weltkugel per Generic Mapping Tools in PHP-Skript erzeugen (Linux/Ubuntu)

Wichtig ist, dass der Rechner, auf dem das Skript ausgeführt wird, bestimmte Voraussetzungen mitbringt:

  • GMT muss klarerweise installiert sein. Eine Anleitung gibt es hier im Blog. Windows-Dateien können von der GMT-Homepage heruntergeladen werden. Ob das Skript unten auf Windows funktioniert, weiß ich nicht.
  • Gegebenenfalls müssen die Pfade angepasst werden. Die meisten Distributionen verwenden inzwischen den GMT-Wrapper „GMT”. Falls das nicht der Fall ist, muss die Variable $gmtWrapper gelöscht werden und die Variablen $gmtCoast, $gmtXY und $gmtText mit Pfadnamen versehen werden.

Nachdem man alles eingestellt hat (unter Ubuntu sollte das Skript Out-of-the-Box funktionieren), kann man von es von der Kommandozeile ausprobieren: php $gmt_globe.php. Dazu muss php-cli installiert sein.

Das Ergebnis kann sich durchaus sehen lassen:

Dieser Globus wurde mit Generic Mapping Tools erzeugt

Die Größe der Weltkugel ist im Skript festgesetzt. Durch Ändern der Variable $dpi lässt sich bestimmen, wie groß das resultierende PNG ist.

Quelltext:  Alles auswählen  |  Zeilennummerierung an/aus
  1. <?php
  2. //gmt_globe.php - Code-Schnippsel
  3. //Copyright (c) 1010, Maximilian Kalus, auxnet.de
  4.  
  5. //Ausgabe:
  6. $lon = '11.566667'; //Längengrad
  7. $lat = '48.133333'; //Breitengrad
  8. $name = 'München'; //Name des Ortes
  9. $output = '/tmp/globus'; //Pfad und Namensteil für Ausgabedatei
  10. $is_utf8 = true; //System ist UTF-8?
  11. $dpi = 150; //DPI der Ausgabe: 72 oder 96 ist gut für den Bildschirm, 300 oder 600 für den Druck
  12.  
  13. //Umgebung:
  14. $convert = '/usr/bin/convert'; //Pfad zu ImageMagick convert (oder GraphicsMagick Wrapper)
  15. $gmtWrapper = '/usr/bin/GMT'; //GMT-Wrapper oder leer
  16. $gmtCoast = 'pscoast'; //Name oder Pfad zu pscoast
  17. $gmtXY = 'psxy'; //Name oder Pfad zu psxy
  18. $gmtText = 'pstext'; //Name oder Pfad zu pstext
  19.  
  20. $gmtEnv = array(
  21. ); //ggf. Umgebungsvariablen für GMT (PHP5)
  22.  
  23. //Ausgabe-namen
  24. $tmpname = $output.'.ps'; //Ausgabe in PS-Datei
  25. @unlink($tmpname); //ggf. alte Dateien löschen
  26.  
  27. //GMT-Generierung starten
  28. //Prozess-Pipes erzeugen
  29. $pipes = null;
  30. $descriptorspec = array(
  31.    0 => array("pipe", "r"),  // STDIN ist eine Pipe, von der das Child liest
  32.    1 => array('file', $tmpname, "a"),  // STDOUT ist eine Datei, in die das Child schreibt
  33.    2 => array("file", $output."_error.txt", "a") // STDERR ist eine Datei,
  34.                                                     // in die geschrieben wird
  35. );
  36.  
  37. //Globus selbst erstellen
  38. //PHP-Versionen unterscheiden sich...
  39. if (phpversion() < 5) $process = proc_open($gmtWrapper.' '.$gmtCoast.' -Rg -JG'.$lon.'/'.$lat.'/16c -B15g15 -Dc -A5000 -W0.3pt -G230 -P -K', $descriptorspec, $pipes);
  40. else $process = proc_open($gmtWrapper.' '.$gmtCoast.' -Rg -JG'.$lon.'/'.$lat.'/16c -B15g15 -Dc -A5000 -W0.3pt -G230 -P -K', $descriptorspec, $pipes, $cwd, $env);
  41.  
  42. if (is_resource($process)) { //keine weiteren Daten übergeben
  43.     $return_value = proc_close($process); //Prozess schließen
  44. }
  45.  
  46. //Punkt eintragen
  47. if (phpversion() < 5) $process = proc_open($gmtWrapper.' '.$gmtXY.' -Rg -JG'.$lon.'/'.$lat.'/16c -Ss0.15 -G255/0/0 -O -K', $descriptorspec, $pipes);
  48. else $process = proc_open($gmtWrapper.' '.$gmtXY.' -Rg -JG'.$lon.'/'.$lat.'/16c -Ss0.15 -G255/0/0 -O -K', $descriptorspec, $pipes, $cwd, $env);
  49.  
  50. if (is_resource($process)) { //Daten übergeben: Längen und Breitengrad
  51.     fwrite($pipes[0], $lon.' '.$lat);
  52.     fclose($pipes[0]);
  53.  
  54.     $return_value = proc_close($process); //Prozess schließen
  55. }
  56.  
  57. //Titel eintragen
  58. if (phpversion() < 5) $process = proc_open($gmtWrapper.' '.$gmtText.' -Rg -JG'.$lon.'/'.$lat.'/16c -G0/0/0 -Dj0.06/0.06 -O', $descriptorspec, $pipes);
  59. else $process = proc_open($gmtWrapper.' '.$gmtText.' -Rg -JG'.$lon.'/'.$lat.'/16c -G0/0/0 -Dj0.06/0.06 -O', $descriptorspec, $pipes, $cwd, $env);
  60.  
  61. if (is_resource($process)) { //Daten übergeben: Länge, Breite, Größe, Name...
  62.     if ($is_utf8 && function_exists('mb_convert_encoding'))
  63.     $name = mb_convert_encoding($name, 'ISO-8859-1', 'UTF-8');
  64.     fwrite($pipes[0], $lon.' '.$lat.' 10 0 0 1 '.$name);
  65.     fclose($pipes[0]);
  66.  
  67.     $return_value = proc_close($process); //Prozess schließen
  68. }
  69. //GMT ist abgeschlossen
  70.  
  71. //PNG erzeugen
  72. exec($gmtWrapper.' ps2raster -E'.$dpi.' -A -P -Tg "'.$tmpname.'"');
  73.  
  74. //PS-Datei löschen
  75. unlink($tmpname);
  76. ?>
Die Generic Mapping Tools (GMT) sind ein mächtiges Werkzeug zur Erstellung von Kartenmaterial. Mit etwas Aufwand kann man GMT auch in ein PHP-Skript einbauen und somit Karten von einem Server z.B. für eine Website erzeugen lassen. Folgendes Codeschnippsel zeigt, wie's geht.
[mehr]
25.01.2010
 | Autor: Maximilian Kalus | Abgelegt in:  | Kommentare: 0

T3SPORTS in Kombination mit rgtabs

Ein gutes Tutorial erklärt, wie man die TYPO3 Extensions t3sports (zum Verwalten von Sportergebnisse) und rgtabs gemeinsam dynamisch nutzen kann.
[mehr]
23.01.2010
 | Autor: Maximilian Kalus | Abgelegt in:  | Kommentare: 0

Neues TYPO3-Magazin erscheint am 30. Januar

Am 30. Januar erscheint ein neues Online-TYPO3-Magazin. Es wendet sich an TYPO3-Anwender, TYPO3-Interessierte sowie an Webentwickler/Webdesigner, die mit TYPO3 arbeiten bzw. arbeiten wollen.
[mehr]
09.12.2009
 | Autor: Maximilian Kalus | Abgelegt in:  | Kommentare: 0

Spielend lesen: Grand Prix für interaktive Literatur eröffnet

Im Frühjahr 2010 findet der deutsche Grand Prix für interaktive Literatur statt: Ab sofort können Textadventure-Autorinnen und -Autoren Wettbewerbsbeiträge einsenden. Auch Einsteiger sind willkommen.
[mehr]