2

I'm trying to modify an existing python script to convert an in-memory CSV into an (also in memory) zip archive and send it as an attachment to an email. I've had success attaching an in memory CSV file (via a MIMEText object) but am having trouble with the ZIP file (via a MIMEBase object) due to the requirements to setting the payload of the file's bytes.

This is the code I have so far:

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)

From this This user's most upvoted answer I could fix the read() takes at least 2 arguments error I'm receiving by doing a normal open() operation on the zip file but since this file is a buffered stream that doesn't work.

I'm not sure how else to load the zipfile object into the set_payload but that should also work I would think.

Dharman
  • 30,962
  • 25
  • 85
  • 135
daniel9x
  • 755
  • 2
  • 11
  • 28

1 Answers1

2

The read method of a ZipFile object is meant to read the content of a named file within the zip file.

You should use the content of buffer instead after you write to the buffer with the writestr method of the ZipFile instance:

csv_file.set_payload(buffer.getvalue())
blhsing
  • 91,368
  • 6
  • 71
  • 106