Son projem olarak bir spam sınıflandırma uygulamasını sonlandırıyorum ve şimdi bir sorunla karşılaşıyorum. Sorun, e-posta almak için bir modülden geldi. Test kodunu tek bir .py dosyasına yazdım ve çok iyi çalıştı. İşte kod:Karakter Kodlaması: Neden e-posta alma kodum PyQt4'te çalıştırılamıyor?
#!/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()
Ama benim PyQt4 uygulamaya tam olarak aynı kodu nakli yapmaya çalışan zaman, sorun bu hat çıktı:
messages = ["\n".join(mssg[1]) for mssg in messages]
ve bu sorunun:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 4:ordinal not in range(128)
mssg [1], postanın her satırını içeren bir listedir. Bunun nedeni, postadaki metnin "utf-8" veya "gbk" tarafından kodlandığı ve varsayılan "ascii" tarafından kodlanamayacağıdır.
messages = ["\n".join([m.decode("utf-8") for m in mssg[1]]) for mssg in messages]
sorun bu hale geldi: Yani böyle kod yazmak çalıştı
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcc in position 7
Ben e-postanın metninin kodlamasını algılamak için Python Chardet modülünü kullanılan ve o çıktı "ascii" olmak. Şimdi gerçekten kafam karıştı. Aynı kod küçük uygulamamda neden çalıştırılamıyor? Asıl sorun nedir ve nasıl düzeltebilirim? Yardımınız için çok takdir edeceğim.
Lütfen resim etiketinizden önce düzgün bir şekilde göstermesi için '!' Karakterini ekleyin. – surajsn
thx ~ Resim göndermek için yeterli saygınlığım yok, bunun yerine hata mesajını yazıyorum: -D – ZhenLian