在Python中将电子邮件附件解压到内存中,然后在POST请求中发送它。
在Python中将电子邮件附件解压到内存中,然后在POST请求中发送它。
我正在尝试使用Python代码打开带有附件的电子邮件,然后将解压后的文件以POST请求发送到一个PHP脚本。
附件始终是一个包含单个CSV文件的ZIP文件。
导入requests
import imaplib
import email
import os
from zipfile import ZipFile
# 打开ZIP文件并使用不同的名称返回
def extract_zip(input_zip):
input_zip = ZipFile(input_zip)
return {'file': ('report.csv', input_zip.open(input_zip.namelist()[0], 'r'))}
# 连接到Gmail服务器
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login("z@z","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) # 这里有错误
# 将文件发送到本地主机上的data.php,
# 文本输出应为文件内容。
http_post_request = requests.post("http://localhost/data.php", files=data_file)
if(http_post_request.status_code != 200):
print '发送POST请求时出错'
print http_post_request.text
问题在于代码期望ZIP文件名为文件的位置/名称字符串。当我想要打开电子邮件中的附件时,我不知道如何做。
如果我传递文件名,它只会给我一个文件未找到的错误。
我如何在不将其保存到磁盘上的情况下获取附件的路径?
最近,我遇到了一个问题:我想要在Python中解压缩内存中的电子邮件附件,并将其以POST请求发送出去。幸运的是,我找到了一个解决方案。
解决方案如下:
首先,我提取了附件的负载,并对其进行解码。然后,我使用io.BytesIO创建了一个文件流(类似文件的对象)。
import requests import imaplib import email import os import io from zipfile import ZipFile # 打开zip文件并以不同的名称返回 def extract_zip(input_zip): input_zip=ZipFile(input_zip) return {'file': ('report.csv', input_zip.open(input_zip.namelist()[0], 'r'))} # 连接到Gmail服务器 mail=imaplib.IMAP4_SSL('imap.gmail.com') mail.login("z","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: # 将负载字节存储为类似文件的对象 file_bytes = io.BytesIO(part.get_payload(decode=True)) data_file = extract_zip(file_bytes) # 将文件发送到本地主机上的data.php # 文本输出应为文件内容 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
这个解决方案完美地解决了我的问题。现在,我可以在Python中解压缩内存中的电子邮件附件,并将其以POST请求发送出去了。