使用imaplib从邮件获取android附件

使用imaplib从邮件获取android附件

问题描述:

我可以阅读从我测试过的所有电子邮件客户端发送的附件,但Android的默认电子邮件应用除外。它虽然可以通过android中的gmail应用程序工作。使用imaplib从邮件获取android附件

下面是一些代码:

import email as emaillib 

result, data = imap_conn.uid('fetch', email_id, '(RFC822)') 
raw_email = data[0][1] 

get_attachments(emaillib.message_from_string(raw_email)) 

def get_attachments(email_message_instance): 
    attachments = [] 
    for part in email_message_instance.walk(): 
     if part.get_content_maintype() == 'multipart': 
      continue 
     if part.get('Content-Disposition') is None: 
      continue 

     data = part.get_payload(decode=True) 
     if not data: 
      continue 
     filename = part.get_filename() 

     print 'appending attachment with filename: ', filename 
     attachments.append((filename, data)) 

    return attachments 

当我在android系统从默认的电子邮件应用程序发送一个附件它打印:

appending attachment with filename: None 
appending attachment with filename: None 
appending attachment with filename: =?utf-8?B?SU1BRzAxOTMuanBn?= 

任何想法?

好吧我解决了这个问题,看来我的android默认邮件应用程序为所有内容处置写入内容。

而且文件名也是非常邪恶的。

所以,我解决了这个问题(因为我只对媒体附件有兴趣):

from email.header import decode_header 
    def get_attachments(email_message_instance): 
     attachments = [] 
     for part in email_message_instance.walk(): 

      if part.get_content_maintype() not in ['image', 'video', 'audio']: 
       continue 

      if part.get('Content-Disposition') is None: 
       continue 

      data = part.get_payload(decode=True) 
      if not data: 
       continue 

      filename = part.get_filename()  
      filename = u' '.join(w.decode(e or 'ascii') for w,e in decode_header(filename))   
      attachments.append((filename, data)) 

     return attachments