2017-05-29 23 views
1

我试图用附件使用python代码打开电子邮件,然后将解压后的文件发送到php脚本。使用python在内存中解压缩电子邮件附件,然后在发送请求中发送它

该附件始终是一个zip文件,其中包含一个csv文件。

import requests 
import imaplib 
import email 
import os 
from zipfile import ZipFile 

# Open zip file and return it with a different name. 
def extract_zip(input_zip): 
    input_zip=ZipFile(input_zip) 
    return {'file': ('report.csv', input_zip.open(input_zip.namelist()[0], 'r'))} 

# Connect to gmail server. 
mail=imaplib.IMAP4_SSL('imap.gmail.com') 
mail.login("[email protected]","z") 
mail.list() 
mail.select("inbox") 

typ, msgs = mail.search(None, '(SUBJECT "Report")') 
msgs = msgs[0].split() 
data_file = ''; 

for emailid in msgs: 
    resp, data = mail.fetch(emailid, "(RFC822)") 
    email_body = data[0][1] 
    m = email.message_from_string(email_body) 

    if m.get_content_maintype() != 'multipart': 
     continue 

    for part in m.walk(): 
     if part.get_content_maintype() == 'multipart': 
      continue 
     if part.get('Content-Disposition') is None: 
      continue 

     filename=part.get_filename() 
     if filename is not None: 
      data_file = extract_zip(filename) # Error Here 

# Send the file to a data.php on a localhost, 
# Text output should be file content. 
http_post_request = requests.post("http://localhost/data.php", files=data_file) 
if(http_post_request.status_code != 200): 
    print 'Error sending POST request' 
print http_post_request.text 

问题是,该代码需要zip文件名称是该文件的位置/名称的字符串。当我想打开附件时,我不知道该怎么办。

如果我传递文件名,它会给我一个文件未找到的错误。

如何获取附件的路径而不将其保存到磁盘?

+0

对此有帮助吗? https://stackoverflow.com/questions/10908877/extracting-a-zipfile-to-memory – Nullman

+0

答案由Robᵩ[here](https://stackoverflow.com/questions/23569659/extract-zip-to-memory-解析内容)似乎是你在找什么 – Nullman

+0

@Nullman解压缩到内存中的部分工作正常,我只是找不到一个方法来给它的附件,它只返回数据和文件名(不是路径,这可能需要我写入磁盘)。 – Potato

回答

0

我想出了感谢@Nullman解决办法:

我把附件的有效载荷,解码,并使用io.BytesIO创建一个文件流(类似文件的对象)。

import requests 
import imaplib 
import email 
import os 
import io 
from zipfile import ZipFile 

# Open zip file and return it with a different name. 
def extract_zip(input_zip): 
    input_zip=ZipFile(input_zip) 
    return {'file': ('report.csv', input_zip.open(input_zip.namelist()[0], 'r'))} 

# Connect to gmail server. 
mail=imaplib.IMAP4_SSL('imap.gmail.com') 
mail.login("[email protected]","z") 
mail.list() 
mail.select("inbox") 

typ, msgs = mail.search(None, '(SUBJECT "Report")') 
msgs = msgs[0].split() 
data_file = ''; 

for emailid in msgs: 
    resp, data = mail.fetch(emailid, "(RFC822)") 
    email_body = data[0][1] 
    m = email.message_from_string(email_body) 

    if m.get_content_maintype() != 'multipart': 
     continue 

    for part in m.walk(): 
     if part.get_content_maintype() == 'multipart': 
      continue 
     if part.get('Content-Disposition') is None: 
      continue 

     filename=part.get_filename() 
     if filename is not None: 
      # Get the payload bytes into a file like object: 
      file_bytes = io.BytesIO(part.get_payload(decode=True)) 
      data_file = extract_zip(file_bytes) 

# Send the file to a data.php on a localhost, 
# Text output should be file content. 
http_post_request = requests.post("http://localhost/data.php", files=data_file) 
if(http_post_request.status_code != 200): 
    print 'Error sending POST request' 
print http_post_request.text