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.
Bitte fügen Sie '!' Zeichen vor Ihrem Image-Tag, um es richtig anzuzeigen. – surajsn
thx ~ Ich habe nicht genug Reputation, um Bilder zu posten, daher gebe ich stattdessen die Fehlermeldung ein: -D – ZhenLian