AutoIt:Email Adressen in beliebigen Texten finden mit GUI
Aus znilwiki
Edit 1: Neue Version, es gab eine Fehler wenn er nichts fand und das Programm hat sich beendet. --Bernhard Linz 18:05, 19. Nov. 2011 (CET)
Brauchte ich für ein Exchange-Problem um aus defekten regeln die Empfänger-Adressen zu extrahieren.
Kann aber auch beliebigen anderen Texten die Adressen herausklauben.
Doppelte Adressen werden dabei unterdrückt.
Eine genaue Beschreibung findet ihr hier: PR_RULES_ACTION-Find_Email_Addresses - Emailadressen aus Exchange PR_RULES_ACTION extrahieren
und das ist der Quellcode hierzu (mit hoffentlich ausreichend Kommentaren): (PR_RULES_ACTION-Find_Email_Adresses.au3)
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=znil.ico
#AutoIt3Wrapper_Res_Comment=Bernhard Linz - http://znil.net
#AutoIt3Wrapper_Res_Description=Bernhard Linz - http://znil.net
#AutoIt3Wrapper_Res_Language=1031
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <array.au3>
#include <GUIEdit.au3>
#Include <String.au3>
; #INDEX# =======================================================================================================================
; Title .........: PR_RULES_ACTION-Find_eamil_Adresses
; AutoIt Version : 3.6.6.1
; Language ......: Deutsch
; Description ...: Für Kunden der fehlerhafte, servergespeicherte Exchange-Regeln hat(te).
; Outlook / webinterface zeigte diese nicht mehr an, mit der Redemtention.dll konnten diese nicht vollständig
; ausgelesen werden. Mit MFCMAPI lies sich aber das passende Feld finden. Dieses Programm extrariert daraus
; die Weiterleitungsadressen um diese nach der Löschung wieder neu erstellen zu können
; Nebenbei extrariert das Programm alle Emailadressen aus beliebigen Texten
; Author(s) .....: Bernhard Linz im November 2011
; Bernhard@znil.net / http://znil.net/index.php?title=ZnilTools:PR_RULES_ACTION-Find_Email_Addresses_-_Emailadressen_aus_Exchange_PR_RULES_ACTION_extrarieren
; ===============================================================================================================================
;Änderungslog:
;-------------
;11.11.2011 - 21:07 Grundversion
;13.11.2011 - 19:51 Aufgepimpt (2 Schreibweisen der Adressen zum direkten kopieren, etwas Statistik
; und so ungefähr 5 mal den Suchalgorithmus umgeschrieben
Dim $aMailaddresses ;Array mit allen Emailadressen die gefunden wurden
Dim $sInputtext ;String mit dem reinkopiertem Text
Dim $sOutputtext ;String mit dem Text der ausgegeben werden soll - Adressen untereinander
Dim $sOutputtextH ;String mit dem Text der ausgegeben werden soll - Adressen nebeneinander mit Trennzeichen aus der GUI
Dim $CTRLA ;für die "Alles markieren" Funktion von progandy
Dim $iRuntimeBegin ;Integer für das Messen der Ausfürhungszeit (Startwert)
Dim $iRuntimeDiff ;Integer für das Messen der Ausfürhungszeit (Anzahl Milisekunden seit Startwert)
#Region ### START Koda GUI section ### Form=C:\_AutoIT\HFK\FormMAIN-PR_RULES_ACTION.kxf
$FormMAIN = GUICreate("PR_RULES_ACTION-Find_Email_Addresses", 642, 635, 512, 208, -1, 0)
$EditInputText = GUICtrlCreateEdit("", 8, 32, 625, 281)
GUICtrlSetFont(-1, 10, 400, 0, "Courier New")
$ButtonFindMailAddresses = GUICtrlCreateButton("Finde Mailadressen ...", 8, 320, 625, 25)
$EditResult = GUICtrlCreateEdit("", 8, 375, 305, 169, BitOR($GUI_SS_DEFAULT_EDIT,$ES_READONLY))
GUICtrlSetData(-1, "Bereit ....")
GUICtrlSetFont(-1, 10, 400, 0, "Courier New")
$Label1 = GUICtrlCreateLabel("Hier den Text aus PR_RULES_ACTION einfügen:", 8, 8, 284, 17)
GUICtrlSetFont(-1, 8, 800, 0, "MS Sans Serif")
$LabelUntereinander = GUICtrlCreateLabel("Untereinander:", 8, 352, 74, 17)
$EditResultH = GUICtrlCreateEdit("", 8, 584, 625, 41, BitOR($GUI_SS_DEFAULT_EDIT,$ES_READONLY))
GUICtrlSetData(-1, "Bereit ....")
GUICtrlSetFont(-1, 10, 400, 0, "Courier New")
$Label2 = GUICtrlCreateLabel("Nebeneinander, Trennzeichen ist:", 8, 560, 164, 17)
$InputTrennzeichen = GUICtrlCreateInput("; ", 176, 558, 41, 21)
$Group1 = GUICtrlCreateGroup(" sonstiges ", 328, 360, 305, 209)
$LabelRuntime = GUICtrlCreateLabel("Laufzeit:", 336, 408, 44, 17)
$LabelTextLength = GUICtrlCreateLabel("Länge Text:", 336, 384, 61, 17)
$LabelCountMailaddresses = GUICtrlCreateLabel("Gefundene Emailadressen:", 336, 432, 131, 17)
$CheckboxAutomarkText = GUICtrlCreateCheckbox("Automatisch ganzen Text markieren", 336, 520, 289, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
$Label6 = GUICtrlCreateLabel("2011 von Bernhard Linz", 336, 544, 117, 17)
$Label7 = GUICtrlCreateLabel("http://znil.net", 536, 544, 83, 17, $SS_RIGHT)
GUICtrlSetFont(-1, 8, 800, 4, "MS Sans Serif")
GUICtrlSetColor(-1, 0x0000FF)
GUICtrlSetCursor (-1, 0)
$LabelTextlengthResult = GUICtrlCreateLabel("-", 480, 384, 151, 17)
$LabelRuntimeResult = GUICtrlCreateLabel("-", 480, 408, 151, 17)
$LabelCountMailaddressesResult = GUICtrlCreateLabel("-", 480, 432, 151, 17)
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
; Leider passt "ab Werk" nicht besonders viel Text in so ein Edit-Control
; Aus einer Antowrt von Greenhorn von http://www.autoit.de
GUICtrlSendMsg($EditInputText, $EM_SETLIMITTEXT, 1024 ^ 2, 0) ; 1024 ^ 2 Zeichen
GUICtrlSendMsg($EditResult, $EM_SETLIMITTEXT, 1024 ^ 2, 0) ; 1024 ^ 2 Zeichen
GUICtrlSendMsg($EditResultH, $EM_SETLIMITTEXT, 1024 ^ 2, 0) ; 1024 ^ 2 Zeichen
;Hauptschleife zur Abfrage der GUI
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE ; Jemand hat auf das X oben rechts geklickt - also Schluss für heute!
Exit
Case $Label7
ShellExecute("http://znil.net/index.php?title=ZnilTools:PR_RULES_ACTION-Find_Email_Addresses_-_Emailadressen_aus_Exchange_PR_RULES_ACTION_extrahieren")
Case $ButtonFindMailAddresses ; Ahhh, jemand will das wir die Emailadressen aus dem Text im oberen Edit-Control-Fenster finden
$iRuntimeBegin = TimerInit() ; Startzeit festhalten (für das Messen der Ausfürhungszeit)
GUICtrlSetState($ButtonFindMailAddresses, $GUI_DISABLE); solange wir die Adressen suchen, deaktviren wir die "Suchen" Schaltfläche
$sOutputtext = "" ; alte Schule - Variablen auf definierten Ausgangszusatnd setzten
$sOutputtextH = "" ; alte Schule - Variablen auf definierten Ausgangszusatnd setzten
$sInputtext = GUICtrlRead($EditInputText) ; Wir holen uns den gesamten Text aus dem oberen Edit-Control-Fenster in eine Variable
;Nachfolgende Zeile ermittelt die Textlänge und formatiert diese mit Tausenderpunkt
GUICtrlSetData($LabelTextlengthResult, StringRegExpReplace(_StringReverse(StringRegExpReplace(_StringReverse(StringLen($sInputtext)),"\d{3}","\0.")),"(?<![0-9])\.","",1) & " Zeichen")
$aMailaddresses = StringRegExp($sInputtext,"(?i)\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,20}\b",3) ; Findet alle(!) Emailadressen.
;Bedingungen: (?i) = Groß-/Kleinschreibung ignorieren
; \b = "Finden an der Wortgrenze" ... also hier wo ein Wort anfängt (Leerzeichen davor)
; [A-Z0-9._%+-]+ = Finde die Zeichen in den eckigen [] Klammern, also Buchstaben,Zahlen,Punkte, Unterstrich _, Prozent, %, Plus + oder Minus - und das beliebig oft (+ am Ende)
; @ = Finde den Klammeraffen @ (mindestens! ohne Klammeraffe = keine Emailadresse)
; [A-Z0-9.-]+ = Wie oben, nur ohne Unterstriche und %
; \. = finde mindestens einen Punkt (wir sind bei der Emaildomäne, die besteht mindestens aus Domain.Suffix
; [A-Z]{2,20} = nach dem Punkt zuvor müssen mindestens 2 bis maximal 6 Buchstaben kommen (.de, .com, .bremen etc)
; \b = bis zum Wortende ... also wieder ein Leerzeichen z.B.
_ArraySort($aMailaddresses) ; Schön sortieren, erst Zahlen dann Buchstaben
$aMailaddresses = _ArrayUnique($aMailaddresses) ; und alle doppelten Einträge entfernen
If IsArray($aMailaddresses) = 0 Then
GUICtrlSetData($EditResult,"Keine Adressen gefunden")
GUICtrlSetState($ButtonFindMailAddresses, $GUI_ENABLE)
ContinueCase ; Ist es kein Array gab es keine Adressen - also stoppen. Hiernach darf kein anderer Case stehen
EndIf
GUICtrlSetData($LabelCountMailaddressesResult,$aMailaddresses[0] & " Stück") ; Statistik setzen, wieviel sind es denn
;Nachfolgend füllen wir die die beiden String-Variablen mit dem Text der Mailadressen (aus dem Array wieder Strings)
For $i = 1 To $aMailaddresses[0] Step 1
$sOutputtext = $sOutputtext & $aMailaddresses[$i] & @CRLF ; Für die Darstellung untereinander (@CRLF = neue Zeile)
$sOutputtextH = $sOutputtextH & $aMailaddresses[$i] & GUICtrlRead($InputTrennzeichen) ; Für die Darstellung nebeneinander
Next
; Die Nebeneinander-Darstellung hat ab Ende ein Trennzeichen zuviel - wieder weg damit
$sOutputtextH = StringTrimRight($sOutputtextH, StringLen(GUICtrlRead($InputTrennzeichen)))
GUICtrlSetData($EditResult,$sOutputtext) ; Die Edit Controls füllen, hier Adressen untereinander
GUICtrlSetData($EditResultH,$sOutputtextH) ; Die Edit Controls füllen, hier Adressen nebeneinander
GUICtrlSetState($ButtonFindMailAddresses, $GUI_ENABLE) ; Den Button wieder für einen neuen Suchlauf aktivieren
$iRuntimeDiff = TimerDiff($iRuntimeBegin) ; Na, wie lange haben wir gebraucht
; Zeit in die GUI Schreiben - nachdem wir die auf 2 Nachkommastellen reduziert haben
GUICtrlSetData($LabelRuntimeResult,StringRegExpReplace($iRuntimeDiff,"(\d*)\.(\d{2})(\d*)","$1,$2") & " ms")
; Erklärung zu "(\d*)\.(\d{2})(\d*)","$1,$2"
; (\d*) = Beliebige Anzahl von Zahlen (wird als $1 zurück gegeben
; \. = und ein Punkt
; (\d{2}) = und 2 Zahlen (werden als $2 zurück gegeben)
; (\d*) = und danach folgende beliebige Zahlen (werden als $3 zurück gegeben)
; werden ersetzt durch
; $1,$2 = die Rückgabe $1, ein Komma und die Rückgabe aus $2 - ($3 lassen wir unter den Tisch fallen)
; Fehler im System? Wenn genau ein glatter Wert zurückgegeben würde, würde immer 0 gesetzt
EndSwitch
;Die nachfolgende Abfrage markiert in allen 3 Edit Controls den gesamten Text wenn die CheckBox gesetzt ist
If BitAnd(GUICtrlRead($CheckboxAutomarkText),$GUI_CHECKED) = $GUI_CHECKED Then
_GUICtrlEdit_SetSel($EditInputText,0,-1)
_GUICtrlEdit_SetSel($EditResult,0,-1)
_GUICtrlEdit_SetSel($EditResultH,0,-1)
EndIf
WEnd
Loading comments...