2016-04-10 35 views
1

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.

+0

Lütfen resim etiketinizden önce düzgün bir şekilde göstermesi için '!' Karakterini ekleyin. – surajsn

+0

thx ~ Resim göndermek için yeterli saygınlığım yok, bunun yerine hata mesajını yazıyorum: -D – ZhenLian

cevap

0

Nihayet bu sorunu bir .py dosyasındaki e-postayı alıp bu dosyayı içe aktarmak için uygulamamı kullanarak çözdüm. Bu, diğer durumlarda yararlı olmayabilir çünkü ben aslında karakter kodlama problemini çözmedim. Uygulamamı uygularken çok sayıda kodlama problemi yaşadım ve oldukça sinir bozucu. Benim e-posta verilerinin bazı yazdırmaya çalışırken enter image description here

Bu

gösterildi: Bunun için, aşağıdaki resimde gösterilen Postalarımın bazı düzensiz metin (belki bazı resimler) neden olur tahmin ekranda. Bununla birlikte, bu uygulamada neden çalışamadığını hala bilmiyorum, ancak basit bir dosyada iyi çalıştı. Karakter kodlama problemi çok can sıkıcı ve belki de hala gitmek için uzun bir yolum var .:- D