Aktionen

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


Kommentar hinzufügen
znilwiki freut sich über alle Kommentare. Sofern du nicht anonym bleiben möchtest, trage deinen Namen oder deine Email-Adresse ein oder melde dich an. Du kannst das Feld auch einfach leer lassen.