Bir thunderbird mbox dosyasından gelen e-posta iletilerinin gövdesini ayıklamak için Python 3'ü kullanmaya çalışıyorum. Bu bir IMAP hesabıdır.Bir e-postanın gövdesini mbox dosyasından ayıklayarak, Charset ve Content Transfer Encoding'den bağımsız olarak düz metne çözme
Unicode dizesi olarak işlenebilecek e-postanın gövdesinin bir kısmını metin olarak almak istiyorum. E-postanın Thunderbird'de görünmesi ve \ r \ n = 20 vb. Gibi kaçmamış karakterler içermemesi gerekir.
Sanırım kod çözmeyi bilmediğim İçerik Aktarım Kodlamaları Kaldır. Çeşitli farklı İçerik Türlerine ve farklı İçerik Aktarım Kodlamalarına sahip e-postalar alıyorum. Bu benim şimdiki girişimdir:
import mailbox
import quopri,base64
def myconvert(encoded,ContentTransferEncoding):
if ContentTransferEncoding == 'quoted-printable':
result = quopri.decodestring(encoded)
elif ContentTransferEncoding == 'base64':
result = base64.b64decode(encoded)
mboxfile = 'C:/Users/Username/Documents/Thunderbird/Data/profile/ImapMail/server.name/INBOX'
for msg in mailbox.mbox(mboxfile):
if msg.is_multipart(): #Walk through the parts of the email to find the text body.
for part in msg.walk():
if part.is_multipart(): # If part is multipart, walk through the subparts.
for subpart in part.walk():
if subpart.get_content_type() == 'text/plain':
body = subpart.get_payload() # Get the subpart payload (i.e the message body)
for k,v in subpart.items():
if k == 'Content-Transfer-Encoding':
cte = v # Keep the Content Transfer Encoding
elif subpart.get_content_type() == 'text/plain':
body = part.get_payload() # part isn't multipart Get the payload
for k,v in part.items():
if k == 'Content-Transfer-Encoding':
cte = v # Keep the Content Transfer Encoding
print(body)
print('Body is of type:',type(body))
body = myconvert(body,cte)
print(body)
Ama bu başarısız:
Body is of type: <class 'str'>
Traceback (most recent call last):
File "C:/Users/David/Documents/Python/test2.py", line 31, in <module>
body = myconvert(body,cte)
File "C:/Users/David/Documents/Python/test2.py", line 6, in myconvert
result = quopri.decodestring(encoded)
File "C:\Python32\lib\quopri.py", line 164, in decodestring
return a2b_qp(s, header=header)
TypeError: 'str' does not support the buffer interface
. get_payload() byte'ları döndürmeli, ancak Python 3'ün altından str, "decode = True" değerini geçmedikçe, bunu yapmazsınız. –
Sadece decode = True ile denedim, bu da bayt döndürüyor ve bu yüzden bir hata yok. Kod çözme işlemi yapıldı gibi görünüyor ve şimdi tek yapmam gereken baytları dizelere dönüştürmektir. Yine de, çok çeşitli içerik kodlaması olan e-postalarla test etmedim. – dcb
Huh, bu bir hata gibi görünüyor, başka bir şekilde olmalı, decode = True, str ve decode = False bytes döndürmelidir. :-) –