¿Cómo enviar un archivo zip como un archivo adjunto en python?

He revisado muchos tutoriales, así como otras preguntas aquí sobre el desbordamiento de stack, y la documentación y la explicación son, como mínimo, solo código inexplicable. Me gustaría enviar un archivo que ya tengo comprimido y enviarlo como un archivo adjunto. He intentado copiar y pegar el código provisto, pero no funciona, por lo tanto no puedo solucionar el problema.

Entonces, lo que pregunto es si alguien sabe a quién explicar cómo smtplib, así como las bibliotecas MIME y de correo electrónico trabajan juntas para enviar un archivo, más específicamente, cómo hacerlo con un archivo zip. Cualquier ayuda sería apreciada.

Este es el código al que todos se refieren:

import smtplib import zipfile import tempfile from email import encoders from email.message import Message from email.mime.base import MIMEBase from email.mime.multipart import MIMEMultipart def send_file_zipped(the_file, recipients, sender='you@you.com'): myzip = zipfile.ZipFile('file.zip', 'w') # Create the message themsg = MIMEMultipart() themsg['Subject'] = 'File %s' % the_file themsg['To'] = ', '.join(recipients) themsg['From'] = sender themsg.preamble = 'I am not using a MIME-aware mail reader.\n' msg = MIMEBase('application', 'zip') msg.set_payload(zf.read()) encoders.encode_base64(msg) msg.add_header('Content-Disposition', 'attachment', filename=the_file + '.zip') themsg.attach(msg) themsg = themsg.as_string() # send the message smtp = smtplib.SMTP() smtp.connect() smtp.sendmail(sender, recipients, themsg) smtp.close() 

Sospecho que el problema es que este código también comprime un archivo. No quiero comprimir nada porque ya tengo un archivo comprimido que me gustaría enviar. En cualquier caso, este código está pobremente documentado, al igual que las bibliotecas de Python, ya que no proporcionan información sobre ningún archivo img ni archivos de texto anteriores.

ACTUALIZACIÓN: error que estoy recibiendo ahora. También he actualizado lo que está en mi archivo con el código anterior

 Traceback (most recent call last): File "/Users/Zeroe/Documents/python_hw/cgi-bin/zip_it.py", line 100, in  send_file_zipped('hw5.zip', 'avaldez@oswego.edu') File "/Users/Zeroe/Documents/python_hw/cgi-bin/zip_it.py", line 32, in send_file_zipped msg.set_payload(myzip.read()) TypeError: read() takes at least 2 arguments (1 given) 

Realmente no veo el problema. Simplemente omita la parte que crea el archivo zip y, en su lugar, simplemente cargue el archivo zip que tiene.

Esencialmente, esta parte aquí

 msg = MIMEBase('application', 'zip') msg.set_payload(zf.read()) encoders.encode_base64(msg) msg.add_header('Content-Disposition', 'attachment', filename=the_file + '.zip') themsg.attach(msg) 

crea el archivo adjunto. los

 msg.set_payload(zf.read()) 

establece, bueno, la carga útil del archivo adjunto a lo que lees del archivo zf (probablemente significa archivo zip).

Simplemente abra su archivo zip de antemano y deje que esta línea lo lea.

Estoy de acuerdo en que el paquete de correo electrónico no está bien documentado todavía. Lo investigué antes y escribí un módulo de envoltura que simplifica este tipo de tareas. Por ejemplo, los siguientes trabajos:

 from pycopia import ezmail # Get the data data = open("/usr/lib64/python2.7/test/zipdir.zip").read() # Make a proper mime message object. zipattachement = ezmail.MIMEApplication.MIMEApplication(data, "zip", filename="zipdir.zip") # send it. ezmail.ezmail(["Here is the zip file.", zipattachement], To="me@mydomain.com", From="me@mydomain.com", subject="zip send test") 

Y eso es todo lo que necesita una vez que tenga todo instalado y configurado. 🙂