在Python中将电子邮件附件解压到内存中,然后在POST请求中发送它。

10 浏览
0 Comments

在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文件名为文件的位置/名称字符串。当我想要打开电子邮件中的附件时,我不知道如何做。

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

我如何在不将其保存到磁盘上的情况下获取附件的路径?

0
0 Comments

最近,我遇到了一个问题:我想要在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请求发送出去了。

0