Fehler in kompilierter App bei Debugging-Stufe 5 für IMAP

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
beatrix.w
User
Beiträge: 16
Registriert: Freitag 2. Mai 2014, 15:23

Ein Kunde hat Probleme mit dem IMAP-Code, den ich verwende. Also wollte ich ihm ein Test-Programm machen, daß mir mit

imaplib.Debug = 5

die Daten vom IMAP-Server mitloggt. Im Debugger funktioniert das gut. Sobald ich mein Python-Programm kompiliere, bricht das Programm beim Holen von Header-Daten ab.

Hier ist der relevante Code:

Code: Alles auswählen

imap_connection = imaplib.IMAP4(host)
result, data = imap_connection.login(username, password)

if current_mail <= no_of_mails:
    try:
        result, header = imap_connection.fetch(str(current_mail), '(BODY.PEEK[HEADER])')
    except imaplib.IMAP4.error:
        print('fehler hier')
    current_mail = current_mail + 1
Der Code ist natürlich nicht vollständig. Nach dem Holen des Headers werden die Daten in eine Datei geschrieben.

In der Console sehe ich folgendes:

20.04.15 07:34:00,167 do_imap[96708]: 34:00.14 untagged_responses[FETCH] 0 += ["(b'1 (BODY[HEADER] {3228}', b'Return-Path: notification+zj4yoca92=oc@facebookmail.com\r\nReceived: from mx-out.facebook.com ([66.220.155.153]) by mx-ha.gmx.net\r\n (mxgmx011) with ESMTPS (Nemesis) id 0MVqRs-1XhYof1BYO-00X7ZO for\r\n <bwillius@gmx.de>; Sun, 05 Oct 2014 19:30:05 +0200\r\nReceived: from facebook.com (evjVJ+NWegstsctCHIQXcHFGb63UiKueMPzcEFFhrdgHDhYh30Fx/KtVvz82H6iq 10.224.41.39)\r\n by facebook.com with Thrift id 3e7812044cb511e48ef00002c9dfd1fa-e96e
20.04.15 07:34:00,182 do_imap[96708]: file:/var/folders/yb/l1kg95s932sgnw_8bl3dd67h0000gr/T/tmptkqlv0n4
20.04.15 07:34:00,182 do_imap[96708]: 34:00.14 untagged_responses[FETCH] 0 += ["(b'1 (BODY[HEADER] {3228}', b'Return-Path: notification+zj4yoca92=oc@facebookmail.com\r\nReceived: from mx-out.facebook.com ([66.220.155.153]) by mx-ha.gmx.net\r\n (mxgmx011) with ESMTPS (Nemesis) id 0MVqRs-1XhYof1BYO-00X7ZO for\r\n <bwillius@gmx.de>; Sun, 05 Oct 2014 19:30:05 +0200\r\nReceived: from facebook.com (evjVJ+NWegstsctCHIQXcHFGb63UiKueMPzcEFFhrdgHDhYh30Fx/KtVvz82H6iq 10.224.41.39)\r\n by facebook.com with Thrift id 3e7812044cb511e48ef00002c9dfd1fa-e96e
20.04.15 07:34:10,141 do_imap[96708]: do_imap Error
20.04.15 07:34:10,265 do_imap[96708]: ApplePersistence=NO
20.04.15 07:34:10,416 SIMBL Agent[98848]: warning: failed to get scripting definition from /Users/beatrixwillius/Documents/ Datei/Development/Mail Archiver/Projects/MainClasses Projects/imap/Builds - imap.xojo_binary_project/Mac OS X (Cocoa Intel)/imap.app/Contents/python/do_imap.app; it may not be scriptable.

Hat jemand eine Idee, was da schief läuft und wie ich das in den Griff bekomme? Ich kann meinem Kunden leider nicht Python und PyCharm installieren lassen.

Mit freundlichen Grüßen/Regards

Trixi Willius

http://www.mothsoftware.com
Mail Archiver X: The email archiving solution for professionals
BlackJack

Welche Programmzeile ist denn für diese Logzeile verantwortlich ``20.04.15 07:34:10,141 do_imap[96708]: do_imap Error``? Ist das die echte Zeile im Programm für die im hier gezeigten Quelltext Zeile 8 steht? Diese Fehlerbehandlung ist ja keine, also feststellen dass es ein Problem bei einer IMAP-Operation gab und dann einfach so weitermachen als wenn nichts passiert sei ist vielleicht keine so gute Idee. Ausserdem möchte man an der Stelle vielleicht auch die Ausnahme inklusive Traceback protokollieren statt nur das ein Fehler aufgreten ist. Anstelle von `print()` bietet sich das `logging`-Modul an, da gibt es auch schon etwas um Ausnamen zu protokollieren.
beatrix.w
User
Beiträge: 16
Registriert: Freitag 2. Mai 2014, 15:23

Hallo Blackjack,

danke für die Antwort. Die Fehlerbehandlung hatte ich weggelassen. Ich bin mir nicht sicher, welche Zeile den Fehler macht. Es kann eigentlich nur

Code: Alles auswählen

result, header = imap_connection.fetch(str(current_mail), '(BODY.PEEK[HEADER])')
sein. Nach dem Abfragen des Headers werden die Daten in eine Datei geschrieben. Das funktioniert und kommt auch in die Console. Das ist der Teil hier:

file:/var/folders/yb/l1kg95s932sgnw_8bl3dd67h0000gr/T/tmptkqlv0n4

Ich habe auch schon alles nach dem Holen des Headers auskommentiert und dann tritt der gleiche Fehler auf. Der Fehler ist nicht das eigentliche Problem. Das ist ja nur ein Test-Programm. Aber es fehlt der Rest von den Debugging-Informationen in der Console. Kann es einfach sein, daß das Python die Console nicht mag? Kann ich an die Daten sonst irgendwie herankommen?

Ich werde mal das logging-Modul versuchen. Hier der Vollständigkeit halber die ganze Funktion:

Code: Alles auswählen

def get_header():

    global imap_connection
    global no_of_mails
    global current_mail
    global messages

    if current_mail <= no_of_mails:
        try:
            result, header = imap_connection.fetch(str(current_mail), '(BODY.PEEK[HEADER])')
            if result != "OK" and not isinstance(header[0], tuple) and header[0].decode('utf8') != 'FETCH Some of the requested messages no longer exist':
                header_decode = header[0].decode('utf8')
                error_string = 'xxxerrorxxx: get_header result nok ' + str(current_mail + 1) + ' ' + header[0].decode('utf8')
                print(error_string.encode('utf8'))
                sys.exit(0)
            elif not isinstance(header[0], tuple) and header[0].decode('utf8') == 'FETCH Some of the requested messages no longer exist':
                current_mail = current_mail + 1
                print("xxxerrorxxx: message moved")
                return
            #end if
        except imaplib.IMAP4.error:
            #print('Fehler hier')
            error_string = 'xxxerrorxxx: get_header exception ' + str(current_mail + 1) + ' '
            print(error_string.encode('utf8'))
            sys.exit(0)
            print("error here")
        #end try
        #print('file:header here')
        if type(header) is list and len(header[0][1]) > 1:
            temp_folderitem, temp_path = tempfile.mkstemp()
            try:
                temp_binarystream = os.fdopen(temp_folderitem,'wb')
                temp_binarystream.write(header[0][1])
                print('file:' + temp_path)
            except IOError:
                print("xxxerrorxxx: IOError:".encode('utf8') + temp_path)
                sys.exit(0)
            #end try
        #end if
    #endif
    current_mail = current_mail + 1
Mit freundlichen Grüßen/Regards

Trixi Willius

http://www.mothsoftware.com
Mail Archiver X: The email archiving solution for professionals
BlackJack

@beatrix.w: Eine Funktion die mit ``global`` arbeitet, das Programm mit `sys.exit()` abbricht und bei Ausnahmen jegliche sinnvolle Fehlermeldung unterdrückt — das Programm solltest Du wegwerfen und vernünftig neu schreiben.

Wenn Du wissen willst wo ein Fehler aufgetreten ist dann schau in den Traceback, dafür ist der da. Am einfachsten kommst Du an den heran wenn Du Deine ”Fehlerbehandlung” einfach mal komplett weg lässt.

Die Typprüfungen sehen auch komisch aus und mit `type()` und ``is`` macht man das auch nicht.
Antworten