2016-04-10 7 views
1

Ich beende gerade eine Spam-Klassifizierung als mein letztes Projekt und jetzt stoße ich auf ein Problem. Das Problem kam von einem Modul, um E-Mails zu empfangen. Ich habe den Testcode in einer einzigen .py-Datei geschrieben und es hat wirklich gut funktioniert. Hier ist der Code:Zeichencodierung: Warum kann mein E-Mail-Empfangscode in PyQt4 nicht ausgeführt werden?

#!/usr/bin/env python 
# coding=utf-8 
import poplib 
from email import parser 
host = 'pop.qq.com' 
username = '[email protected]' 
password = 'xxxxxxxxxxxxx' 
pop_conn = poplib.POP3_SSL(host) 
pop_conn.user(username) 
pop_conn.pass_(password) 
messages = [pop_conn.retr(i) for i in range(1, len(pop_conn.list()[1]) + 1)] 
# Concat message pieces: 
messages = ["\n".join(mssg[1]) for mssg in messages] 
#print messages 
messages = [parser.Parser().parsestr(mssg) for mssg in messages] 
i = 0 
for message in messages: 
    i = i + 1 
    mailName = "mail"+str(i) 
    f = open(mailName + '.log', 'w'); 
    print >> f, "Date: ", message["Date"] 
    print >> f, "From: ", message["From"] 
    print >> f, "To: ", message["To"] 
    print >> f, "Subject: ", message["Subject"] 
    print >> f, "Data: " 

    for part in message.walk(): 
     contentType = part.get_content_type()  
     if contentType == 'text/plain' : 

      data = part.get_payload(decode=True) 
      print >> f, data 
    f.close() 
pop_conn.quit() 

Aber als ich versuchte, genau den gleichen Code zu meiner PyQt4 Anwendung verpflanzen das Problem kam in dieser Zeile aus:

messages = ["\n".join(mssg[1]) for mssg in messages] 

und das ist das Problem:

mssg [1] ist eine Liste, die jede Zeile der Mail enthält. Ich vermute, das liegt daran, dass der Text aus der Mail von "utf-8" oder "gbk" codiert wurde, was nicht mit dem Standard "ascii" dekodiert werden kann. Also habe ich versucht, den Code so zu schreiben:

messages = ["\n".join([m.decode("utf-8") for m in mssg[1]]) for mssg in messages] 

Das Problem wie dieses wurde:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc in position 7 

verwendete ich Python chardet Modul die Kodierung des Textes der E-Mail zu erkennen, und es stellte sich heraus, "ascii" sein. Jetzt bin ich wirklich verwirrt. Warum kann derselbe Code nicht auf meiner kleinen Anwendung ausgeführt werden? Was ist das eigentliche Problem und wie kann ich es beheben? Ich werde sehr für Ihre Hilfe geschätzt werden.

+0

Bitte fügen Sie '!' Zeichen vor Ihrem Image-Tag, um es richtig anzuzeigen. – surajsn

+0

thx ~ Ich habe nicht genug Reputation, um Bilder zu posten, daher gebe ich stattdessen die Fehlermeldung ein: -D – ZhenLian

Antwort

0

Ich löste dieses Problem schließlich, indem ich die E-Mail in einer .py-Datei erhielt und meine Anwendung zum Importieren dieser Datei verwendete. Dies kann in anderen Situationen nicht nützlich sein, weil ich das Zeichencodierungsproblem tatsächlich nicht gelöst habe. Als ich meine Anwendung implementiert habe, habe ich viele Probleme mit der Kodierung festgestellt, und das ist ziemlich nervig. Dazu denke ich es von einigen unregelmäßigen Text von der Post (vielleicht ein paar Bilder) verursacht wird, die in der folgenden Abbildung dargestellt:

enter image description here

Dieses gezeigt wurde, als ich versuchte, einige meiner E-Mail-Daten zu drucken auf dem Bildschirm. Ich weiß jedoch immer noch nicht, warum das in meiner Anwendung nicht funktioniert, obwohl es in einer einfachen Datei gut funktioniert. Das Zeichencodierungsproblem ist sehr ärgerlich, und vielleicht habe ich noch einen weiten Weg vor mir ::-D

Verwandte Themen