2009-01-22 60 views
1

首先,我沒有這臺計算機上的代碼示例,但我有一個非常相似的示例。ISO編碼的附件名稱和python

http://docs.python.org/library/email-examples.html

的第四之一。

我的問題在於這段代碼

counter = 1 
for part in msg.walk(): 
    # multipart/* are just containers 
    if part.get_content_maintype() == 'multipart': 
     continue 
    # Applications should really sanitize the given filename so that an 
    # email message can't be used to overwrite important files 
    filename = part.get_filename() 
    if not filename: 
     ext = mimetypes.guess_extension(part.get_content_type()) 
     if not ext: 
      # Use a generic bag-of-bits extension 
      ext = '.bin' 
     filename = 'part-%03d%s' % (counter, ext) 
    counter += 1 
    fp = open(os.path.join(opts.directory, filename), 'wb') 
    fp.write(part.get_payload(decode=True)) 
    fp.close() 

內當我取不具有ISO或UTF編碼的文件名的電子郵件,該代碼工作正常。 但是,當附件名稱是iso編碼時,文件名不在get_filename中,但文件名以部分[「Content-type」](i belive)編碼形式。

上述示例嘗試猜測擴展名如果找不到文件名,它只是給它一個文件名。我想要的是文件名。

有沒有人處理過這些問題,你做了什麼來解決它?

+0

給出帶有編碼文件名的電子郵件的示例。該代碼適用於我遇到的任何電子郵件。 – nosklo 2009-01-22 19:58:02

回答

0

我發現這個問題,它是與

mimetypes.guess_extension(part.get_content_type()) 

並與「圖像/ PJPEG」作爲內容類型

@美國洛特我已經改變的代碼以類似於上述示例的圖像,但我增加了這個來解決pjpeg問題。

if not filename: 
    ext = mimetypes.guess_extension(part.get_content_type()) 

if not ext: 
    guess = part["Content-Type"].split(";") 

    if guess[0] == "image/pjpeg": 
     guess[0] = "image/jpeg" 

    ext = mimetypes.guess_extension(guess[0]) 

if not ext: 
    ext = ".bin"