Blog

  • QooliImapEmailExtractor – Ein IMAP Email-Adressen-Extrahierer in Python

    QooliImapEmailExtractor – Ein IMAP Email-Adressen-Extrahierer in Python

    Ich wurde kürzlich angefragt, ob ich nicht ein Programm kennen würde, um aus einen Mail-Postfach alle Email-Adressen zu extrahieren. Egal, ob diese im „To“- oder „From“- oder „CC“-Feld stehen.

    Leider kannte ich kein Programm, dass dafür geeignet ist, obwohl es ein solches mit Sicherheit aber gibt. Aber bei vielen Gratis-Tools oder auch Trials kann man sich nicht sicher sein, ob es Malware enthält oder ob am Ende die Email-Adressen die extrahiert wurden auch noch gleich an den Hersteller des Programms gesendet werden.

    Warum diese Aufgabe also nicht einfach selber mit Python lösen? Im Internet wurde ich schnell fündig und fand die Basis für ein Skript, welches schon einmal grundsätzlich alle Adressen aus einem einzelnen IMAP-Inbox-Folder eines Postfachs (mittels imaplib) in eine Variable extrahiert: https://www.quora.com/Is-there-a-way-to-extract-email-addresses-from-all-emails-in-my-Gmail-account/answer/Jerry-Neumann

    Das Skript habe ich dann etwas schöner formatiert und erweitert, dass alle Folder eines Postfachs durchlaufen und die Daten dann in eine CSV-Datei exportiert werden. Das sieht dann wie folgt aus:

    import imaplib
    import email
    import csv
    import re
    
    
    list_response_pattern = re.compile(r'\((?P<flags>.*?)\) "(?P<delimiter>.*)" (?P<name>.*)')
    
    
    def parse_list_response(line):
        flags, delimiter, mailbox_name = list_response_pattern.match(line).groups()
        mailbox_name = mailbox_name.strip('"')
        return flags, delimiter, mailbox_name
    
    
    def split_addresses(s):
        # split an address list into list of tuples of (name,address)
        if not s:
            return []
        out_q = True
        cut = -1
        res = []
        for i in range(len(s)):
            if s[i] == '"':
                out_q = not out_q
            if out_q and s[i] == ',':
                res.append(email.utils.parseaddr(s[cut + 1:i]))
                cut = i
        res.append(email.utils.parseaddr(s[cut + 1:i + 1]))
        return res
    
    
    def main():
        print 'Processing started...'
        addresses = []
        mail = imaplib.IMAP4_SSL('imap.server.com')  # enter hostname eg: imap.gmail.com
        mail.login('user@server.com', 'Password')  # userid, password
        response_code_folders, mail_folder_lines = mail.list()
        for mail_folder_line in mail_folder_lines:
            flags, delimiter, mailbox_name = parse_list_response(mail_folder_line)
            print '  Extracting from folder: ' + mailbox_name
            mail.select(mailbox_name)
            result, data = mail.search(None, "ALL")
            ids = data[0].split()
            mail_count = len(ids)
            print '   Mails found in folder: ' + str(mail_count)
            if mail_count > 0:
                msgs = mail.fetch(','.join(ids), '(BODY.PEEK[HEADER])')[1][0::2]
                mail_ix = 0
                for x, msg in msgs:
                    mail_ix += 1
                    msgobj = email.message_from_string(msg)
                    print '   extracting data from message ' + str(mail_ix) + '/' + str(len(msgs))
                    addresses.extend(split_addresses(msgobj['to']))
                    msgobj = email.message_from_string(msg)
                    addresses.extend(split_addresses(msgobj['from']))
                    addresses.extend(split_addresses(msgobj['cc']))
        # only take unique addresses
        addresses = set(addresses)
        csv_filename = 'email_addresses_export.csv'
        with open(csv_filename, 'wb') as out:
            csv_out = csv.writer(out)
            csv_out.writerow(['Name', 'Address'])
            for row in addresses:
                csv_out.writerow(row)
        print ' CSV with addresses written to: ' + csv_filename
        print 'Processing finished'
    
    
    main()
    

    Wenn ihr das Skript verwenden wollt, müsst ihr Python installiert haben und euren Mailserver und die Postfach-Logindaten eintragen:

    mail = imaplib.IMAP4_SSL(‚imap.server.com‚)  # IMAP-Hostname
    mail.login(‚user@server.com‚, ‚Password‚)  # Postfach-Benutzer-ID, Passwort

  • Microsoft SQL Server Management Studio – verbleibende Datenbank-Restore-Dauer anzeigen

    Microsoft SQL Server Management Studio – verbleibende Datenbank-Restore-Dauer anzeigen

    Vielleicht habt ihr auch schon mal in einem Microsoft SQL Server einen Restore einer Datenbank durchgeführt und wolltet wissen, wie weit der Restore nach einigen Minuten/Stunden schon gekommen ist und wann der Restore ungefähr beendet sein wird.

    Wird der Restore via „Management Studio“-GUI durchgeührt (Datenbank-Kontextmenü -> Tasks -> Restore), dann habt ihr im Restore-Dialog zumindest eine ungefähre Prozent-Anzeige. In der 2012er-Version wird diese oben rechts angezeigt:

    Die Prozent-Anzeige erscheint aber erst nach einem Weilchen und wenn man den Restore via SQL-Skript gestartet hat und dabei „STATS“ nicht (oder mit einem ungünstigen Wert) verwendet hat, weiss man auch nicht bei wieviel Prozent der Restore aktuell steht und wie lange er noch dauert. Häufig bleibt die Prozentzahl auch lange unverändert und man ist sich nicht sicher, ob der Restore noch läuft oder sich aufgehängt hat.

    Zum Glück gibt es jedoch eine Möglichkeit mit einem SQL-Befehl den aktuellen Fortschritt und die geschätzte Endzeit zu erhalten – egal ob  der Backup-Job via GUI, Skript oder sogar von einer anderen Maschine gestartet wurde. Voraussetzung ist ein MSSQL Server der Dynamic Management Views (DMVs) unterstützt, also ab MSSQL 2005. Ist das gegeben kann man folgenden Befehl als Query absetzen (es muss keine Datenbank dazu vorselektiert werden):

    SELECT session_id as SPID, command, a.text AS Query, start_time, percent_complete, dateadd(second,estimated_completion_time/1000, getdate()) as estimated_completion_time
    FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) a
    WHERE r.command in ('BACKUP DATABASE','RESTORE DATABASE')

    Das Resultat sieht dann zum Beispiel wie folgt aus (unterer Bereich, Spalten percent_complete und estimated_completion_time):

    Im Beispiel sieht man also, dass bereits 96.16975 % des Restores durchlaufen ist und der Restore um 12:38 Uhr, des 7. Dezember 2016, fertig sein sollte – nach ungefähr 19 Stunden Laufzeit. Praktisch oder?

    Gefunden auf: https://www.mssqltips.com/sqlservertip/2343/how-to-monitor-backup-and-restore-progress-in-sql-server/

  • Chili Ernte 2015

    Chili Ernte 2015

    Letzten Mittwoch-Abend habe ich die Chili-Ernte, zumindest den ersten Teil davon, „eingefahren“.

    Folgende fünf Sorten habe ich ca. im April/Mai als Stecklinge gepflanzt und zwar von jeder Sorte zwei Stück:

    • Breva
    • Cayenne
    • Habanero
    • Apache
    • Jalapena Samira Shiny

    Lustigerweise hat jeweils immer nur ein Exemplar jeder Sorte brauchbare früchte getragen, das andere Exemplar hatte entweder gar keine, unreife oder sonstwie unbrauchbare Chilis – dies obwohl die Exemplare nur wenige Zentimeter nebeneinander standen und sonst die gleichen Bedingungen hatten, vielleicht lag’s am Konkurrenzdruck :-).

    Jedenfalls habe ich die für mich brauchbaren gepflückt, gewaschen, aufgeschnitten und dann im Backofen bei ca. 70° Celsius getrocknet. Die einen Exemplare für ca. 3-4 Stunden, Jalapenas nochmals 4-5 Stunden länger, da diese sehr fleischig sind.

    Einige davon konnte ich schon probieren und haben eine „angenehme“ Schärfe :-).

    Hier die Bilder davon:

  • Unity 5 Spiel-Engine

    Unity 5 Spiel-Engine

    Letzte Woche wurde die neueste Version, nämlich Nummer 5, der Unity Spiel-Engine offiziell veröffentlicht. Ausserdem wurde in der selben Woche das Lizenzierungsmodel der Unreal Engine 4 angepasst, so dass diese nun grundsätzlich von jedem verwendet werden kann (erst ab einem Umsatz von 3000 Dollar pro Quartal, muss man selber etwas bezahlen). Auch Valve hat die Veröffentlichung der „Source 2“-Engine angekündigt, welche voraussichtlich ebenfalls in einer freien Version verfügbar sein soll.

    Unity gibt es schon länger gratis in einer Einsteiger-Version, mit der man aber schon sehr viel machen kann. Möchte man aber z.B. einen Asset Server verwenden (mit Versionsverwaltung) oder einen eigenen Splash-Screen vor dem Spiel präsentieren (und noch einige andere Features mehr, siehe Unity-Website), dann muss man die Pro-Lizenz erwerben, welche mit 75$ im Monat immer noch sehr bezahlbar ist. Für die Möglichkeit das Entwickelte Produkt auf iOS oder Android zu deployen, wird jedoch nochmals (je) 1500$ verlangt oder je 75$ zusätzlich pro Monat.

    Aus Neugierde habe ich mich einige Stunden mit der Unity-Engine auseinander gesetzt und auch einige der Einsteiger-Tutorials bereits umgesetzt. Die Engine hat meiner Einschätzung nach eine gute Lernkurve, man erreicht schon nach kurzer Zeit erste Erfolgserlebnisse die einen anspornen sich tiefer mit den weiteren Möglichkeiten zu beschäftigen. Der Editor, mit welchem die Szenen, Animationen und Objekte bearbeitet werden können wirkt sehr aufgeräumt und kann intuitiv bedient werden – man fühlt sich schnell zu Hause. Für einen C#-Entwickler ist es zudem praktisch, dass als Script-Sprache C# (Mono via einer mitgelieferten MonoDevelop-Version) verwendet werden kann. Unreal 4 mit C++ hat mich da schon etwas abgeschreckt 🙂

    Nach wenigen Stunden hatte ich bereits ein kleines, erstes Spiel fertig (nach Tutorial, Objekte/Texturen wurden als Asset bereitgestellt):

    Wer selber mit Unity loslegen will, der sollte am besten mit den Tutorials auf der offiziellen Unity-Webseite beginnen:

    Viel Spass!

  • Texas Jailhouse Chili 2014

    Texas Jailhouse Chili 2014

    Es war wieder soweit, es wurde das jährliche, rituelle „Texas Jailhouse Chili“-Essen zubereitet und verspiesen.

    Ich denke, dass dank den beigefügten „Trinidad Scorpion Butch T pepper“ dieses Jahr ein neuer Scoville-Rekord aufgestellt wurde – jedenfalls fühlte es sich so an 😳

    Nachfolgend einige Impressionen:

    Für das Rezept und Infos vom 2012er-Event klickt folgenden Link an: http://qoo.li/2012/12/texas-jailhouse-chili/

  • Fiescheralp, Egishorn, Aletschgletscher, Riederalp, Moosfluh und Bettmeralp

    Fiescheralp, Egishorn, Aletschgletscher, Riederalp, Moosfluh und Bettmeralp

    Letztes Wochende war ich mit meiner Familie im Wallis und wir machten (mal wieder) einen Ausflug in die „Aletsch Arena“ und zum Aletschgletscher.

    Hier einige Impressionen:

    Weitere Bilder findet ihr auf meiner dedizierten Fotografie-Seite: http://schielke.ch/galleries/aletschgletscher-und-aletsch-arena/

  • Ferien im Elsass

    Ferien im Elsass

    Wir waren vor kurzem über Pfingsten einige Tage im Elsass und haben dabei folgende Orte besichtigt:

    • Strasbourg
    • Wissembourg
    • Marienthal
    • Eguisheim
    • Colmar
    • Riquewihr
    • Ribeauvillé
    • Delta de la Sauer
    • Schiffshebewerk Saint-Louis/Arzviller

    Hier einige Fotos von unserem Tripp:

  • Canon EF 70-200mm f/2.8L IS II USM mit 2x Extender

    Canon EF 70-200mm f/2.8L IS II USM mit 2x Extender

    Konnte letzthin das Canon EF 70-200mm f/2.8L IS II USM mit dem Canon 2x Extender (III) kombiniert testen.

    Tolles Objektiv welches auch in der Kombination mit dem Extender noch eine sehr gute Bildqualität liefert, auch wenn natürlich der Autofokus mit dem Extender langsamer wird und die grösste Blende auf 5.6 „herunterrutscht“. Aber für mich nicht tragisch und und ein praktischer Ersatz für ein „Canon EF 400mm f/5.6L USM“.

    Nachfolgend einige Impressionen:

  • Qooli Timelapse Calculator

    Abgekürzt QTLC. Eine Anwendung für Google’s Android-Plattform mit welcher man bequem auf seinem Handy Timelapse-Berechnungen durchführen kann.

    Qooli Timelapse Calculator LogoMan kann zum Beispiel ausrechnen, wie lange man bei eingem gewissen Shutter-Intervall und FPS (im resultierenden) Aufnahmen machen muss. Man kann aber auch umgekehrt ausrechnen wieviel Filmdauer man auf Grund einer Aufnahmezeit, dem Intervall und den FPS erreicht hat.

    Die Anwendung wird ständig weiter ausgebaut und mit weiteren Features versehen, so ist z.B. eine Timerlapse-Stoppuhr mit Erinnerungsfunktion geplant oder der zu erwartende Speicherplatz verbrauch für die Aufnahmen während der Aufnahme-Session.

    Die Anwendung kann im Play Store heruntergeladen werden:

    Get it on Google Play

    Direkt den QR-Code scannen um die App-Store-Seite der Anwendung auf dem Handy zu öffnen… wo man sie dann kaufen kann 🙂

    QR-Code von QTLC
    QR-Code von QTLC: mit einem QR-Code-Scanner einlesen um die App-Store-Seite zu öffnen

  • Timelapse Videos erstellen

    Timelapse Videos erstellen

    Vor einigen Monaten habe ich mir unter anderem für das Experimentieren mit Timelapse-Aufnahmen den „programmierbaren“ Fernauslöser TC-80N3von Canon gekauft.

    Leider habe ich mir lange nicht die Zeit genommen um Timelapse-Aufnahmen zu machen, jedoch hatte ich den Fernauslöser bereits einige Male für Langzeitaufnahmen (Bulb-Mode mit Einrastfunktion auf dem Fernauslöser) oder möglichst verwacklungsfreie Aufnahmen (kein Schütteln der Kamera durch das Drücken des Auslösers) benutzt.

    Nun habe ich vor einigen Tagen auch mal einige Timelapse-Videos damit erstellt, respektive die dafür benötigten Fotos gemacht.

    Tutorials im Internet bezüglich wie man solche Timelapse-Aufnahmen macht gibt es unzählige. Hier wäre ein ganz Gutes: http://www.enriquepacheco.com/10-tips-for-shooting-time-lapse

    Im Prinzip gibt es Folgendes zu beachten:

    • Eine Kamera verwenden, an welcher man mit einem Auslöser in einem Intervall Bilder aufnehmen kann (oder die Option schon eingebaut ist)
    • Kamera/Speicherkarte muss schnell genug sein um die Bilder abspeichern zu können, ohne dass der Zwischenspeicher überläuft und die nächste Aufnahme verzögert würde
    • Alle Kameraeinstellungen möglichst auf „manuell“ (kein automatischer Weissabgleich, „M“-Modus mit fixer Blende und Shutter (oder Blendenpriorität, falls man sehr lange Aufnahmen macht mit grossem Kontrastumfang, wie z.B. Sonnenuntergänge), Fokus einstellen und dann auf „manuell“, etc.
    • Möglichst in RAW die Aufnahmen machen (höherer Farbumfang, mehr Nachbearbeitungsmöglichkeiten), JPEG ist aber auch möglich (spart zumindest viel Platz)
    • Stativ benutzen (oder natürlich ein Dolly für mehr Effekte) und eventuell befestigen (Sandsäcke bei starkem Wind)
    • Bildausschnitt wählen (keine Störenden Elemente im Bild/Vordergrund, keine zu starken Bewegungen, keine toten Stellen im Bild): es sollte immer etwas spannendes passieren und Bewegung im Bild sein
    • Bilder besser etwas zu dunkel aufnehmen als überbelichtet (da sonst die Bildinformationen in diesen Bereichen für immer verloren sind)
    • Grosse und schnelle Speicherkarte, da es eine Unmenge Bilder geben wird
    • Akku voll aufgeladen und idealerweise Ersatzakkus dabei
    • Probebilder machen um zuerest die Einstellungen zu überprüfen
    • Rückschaubild für Kamera-LCD deaktivieren um Akku zu sparen
    • Aufnahmezeitdauer berechnen (in der Regel möchte man 24, 25 oder 30 Bilder in der Sekunde im resultierenden Film. Wenn man einen Aufnahme-Intervall von 2 Sekunden hat und man am Ende einen 60 Sekündigen Film möchte  (mit 24 Bildern pro Sekunde) ergibt das folgende Anzahl benötigter Bilder (x):
      x = 60 * 24
      x = 1440
      1440 mal 2 Sekunden (Intverall) ergibt 48 Minuten (+ noch etwas Zeit dazu, da der Shutter ja auch noch etwas Zeit braucht bei jeder Aufnahme und man am Anfang und am Ende des Filmes immer etwas Puffer haben sollte)
    • Etwas mitnehmen um sich die Zeit zu vertreiben, während die Kamera die Aufnahmen macht

    Der TC-80N3 hat einen Intervallometer (zweiter Modus: „INT.“), bei welchen man mit dem Wählrad auf der rechten Seite einfach den gewünschten Sekundenwert einstellen kann. Für Timelapse-Aufnahmen benötigt man die anderen Modi nicht unbedingt.

    Hier einige meiner ersten Versuche… bei denen ich meine eigenen Tipps leider noch grösstenteils selber ignorierte… aber seht selbst:

    Wolken über einem Feld, im Hintergrund die Alpen

    Für meinen Geschmack noch zu langweilig/zu wenig speziell.

    Wolkenformation am Abendhimmel bei Sonnenuntergang

    Am Anfang überbelichtet – auch hier passiert eigentlich zu wenig.

    Wolken


    Gefällt mir schon gut. Hatte aber noch Sensorflecken auf dem Sensor, welche mir erst im Nachhinein aufgefallen sind 🙁 – ausserdem sind die Bewegungen stellenweise nicht flüssig (evtl. bräuchte es noch einen kürzeren Intervall und/oder eine etwas längere Verschlusszeit).

    Zusammengefügt wurden alle diese Videos unter OSX mit dem Tool „Timelapse Assembler„. Das Programm hat sehr wenige Funktionen, aber erfüllt seinen Job perfekt. Unter Windows könnte man die Bilder mit Virtualdub zu einem Video konvertieren.