Создайте ZipFile в памяти и прикрепите его к электронной почте - PullRequest
2 голосов
/ 07 апреля 2020

Я пытаюсь изменить существующий сценарий python, чтобы преобразовать CSV в памяти в (также в памяти) zip-архив и отправить его в виде вложения в электронное письмо. Я успешно подключил файл CSV в памяти (через объект MIMEText), но у меня возникли проблемы с файлом ZIP (через объект MIMEBase) из-за требований к настройке полезной нагрузки байтов файла.

Вот код, который у меня есть:

csv_buffer = cStringIO.StringIO()
buffer = cStringIO.StringIO()

zf = zipfile.ZipFile(buffer,
               mode='w',
               compression=zipfile.ZIP_DEFLATED,
               )

zf.writestr(csvfile + ".csv", csv_buffer.getvalue())


csv_file = MIMEBase('application', 'zip')
csv_file.set_payload(zf.read())
encoders.encode_base64(csv_file)
csv_file.add_header('Content-Disposition', 'attachment',
         filename=csvfile + ".zip")

msg.attach(csv_file)

Из этого Ответа этого пользователя с наибольшим количеством голосов Я могу исправить полученную ошибку read() takes at least 2 arguments, выполнив обычную open() операция над zip-файлом, но поскольку этот файл является буферным потоком, который не работает.

Я не уверен, как еще можно загрузить объект zipfile в set_payload, но это также должно работать. подумал бы.

1 Ответ

2 голосов
/ 07 апреля 2020

Метод read объекта ZipFile предназначен для чтения содержимого именованного файла в zip-файле.

Вместо содержимого следует использовать buffer после записи в буфер с методом writestr экземпляра ZipFile:

csv_file.set_payload(buffer.getvalue())
...