2009-04-24 18 views
7

Garip bir şekilde get_payload ile koşturmak: kod çözdüğü mesajda eşit bir işaret gördüğünde saçma görünüyor. İşte hata görüntüler kod:Python: Eşittir işareti varken e-posta get_payload kod çözme başarısız olur mu?

import email 

data = file('testmessage.txt').read() 
msg = email.message_from_string(data) 
payload = msg.get_payload(decode=True) 
print payload 

Ve burada örnek bir mesajdır: test message.

İleti, yalnızca ilk "=" kadar yazdırılır. Gerisi ihmal edilir. Neler olduğunu bilen var mı?

"decode = False" ile aynı betik tam iletiyi döndürür, bu nedenle kod çözme eşittir işareti ile mutsuz görünür.

Bu, Python 2.5 kapsamındadır.

cevap

6

Hat sonu sorunlarınız var. Test mesajınızın gövdesi yeni satırlar (\ n) olmadan çıplak satır başı (\ r) kullanır. E-postayı ayrıştırmadan önce satır sonlarını düzeltirseniz, her şey çalışır:

import email, re 
data = file('testmessage.txt').read() 
data = re.sub(r'\r(?!\n)', '\r\n', data) # Bare \r becomes \r\n 
msg = email.message_from_string(data) 
payload = msg.get_payload(decode=True) 
print payload 
+0

Teşekkürler Richie, işe yarıyor. Bununla birlikte, metin olmayan eklerle de uğraşacağım, bu yüzden muhtemelen yeniden ikameyi rasgele yapmak istemiyorum. Metin/düzlemi tespit etmem ve sadece ikame işlemini yapmam gerekecek, ki bu mesaj mesajın mime tipini gördüğümden beri mesajın çok geçmeden mesaj_from_string çağrısını geçtim. Kod çözme işlevini get_payload çağrısı dışında ayrı ayrı aramak mümkün mü? – Parand

+1

Hiç gerçek ikili eklerle uğraşacağından emin misin? Ekler genellikle base64 veya benzerlerini kullanarak e-posta içinde kodlanır, dolayısıyla ikili bir dosyayı temsil etmelerine rağmen, e-posta içinde metin olarak kodlanırlar. – RichieHindle

+0

Yine haklısınız; Çok sayıda örnekle test ettim ve önerdiğiniz ikame ile iyi çalışıyorlar. Tekrar teşekkürler. – Parand

İlgili konular