Gmail Python múltiples archivos adjuntos

Estoy intentando crear una pequeña secuencia de comandos que enviará por correo electrónico varios archivos adjuntos usando gmail. El siguiente código envía el correo electrónico, pero no los archivos adjuntos. El uso previsto es hacer un par de consultas de db y enviar por correo electrónico los resultados. Siempre habrá 2 archivos y los nombres de los archivos serán diferentes cada día, ya que la date del informe se encuentra en el nombre del archivo. De lo contrario, habría utilizado:

 part.add_header('Content-Disposition', 'attachment; filename="absolute Path for the file/s"') 

Cualquier ayuda muy apreciada.

 import os import smtplib from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText from email.MIMEImage import MIMEImage from email.MIMEBase import MIMEBase from email import Encoders #Set up crap for the attachments files = "/tmp/test/dbfiles" filenames = [os.path.join(files, f) for f in os.listdir(files)] #print filenames #Set up users for email gmail_user = "joe@email.com" gmail_pwd = "somepasswd" recipients = ['recipient1','recipient2'] #Create Module def mail(to, subject, text, attach): msg = MIMEMultipart() msg['From'] = gmail_user msg['To'] = ", ".join(recipients) msg['Subject'] = subject msg.attach(MIMEText(text)) mailServer = smtplib.SMTP("smtp.gmail.com", 587) mailServer.ehlo() mailServer.starttls() mailServer.ehlo() mailServer.login(gmail_user, gmail_pwd) mailServer.sendmail(gmail_user, to, msg.as_string()) # Should be mailServer.quit(), but that crashes... mailServer.close() #get all the attachments for file in filenames: part = MIMEBase('application', 'octet-stream') part.set_payload(open(file, 'rb').read()) Encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(file)) msg.attach(part) #send it mail(recipients, "Todays report", "Test email", filenames) 

Debería haber esperado otra hora antes de publicar. Hizo 2 cambios:

1.) movió el lazo de sujeción hacia arriba

2.) intercambió part.add_header (‘Content-Disposition’, ‘archivo adjunto; nombre_archivo = “% s”‘% os.path.basename (archivo))

para part.add_header (‘Contenido-Disposición’, ‘archivo adjunto; nombre_archivo = “% s”‘ archivo%)

Funciona como un campeón. Gmail con múltiples destinatarios y múltiples archivos adjuntos.

 import os import smtplib from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText from email.MIMEImage import MIMEImage from email.MIMEBase import MIMEBase from email import Encoders #Set up crap for the attachments files = "/tmp/test/dbfiles" filenames = [os.path.join(files, f) for f in os.listdir(files)] #print filenames #Set up users for email gmail_user = "joe@email.com" gmail_pwd = "somepasswd" recipients = ['recipient1','recipient2'] #Create Module def mail(to, subject, text, attach): msg = MIMEMultipart() msg['From'] = gmail_user msg['To'] = ", ".join(recipients) msg['Subject'] = subject msg.attach(MIMEText(text)) #get all the attachments for file in filenames: part = MIMEBase('application', 'octet-stream') part.set_payload(open(file, 'rb').read()) Encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment; filename="%s"' % file) msg.attach(part) mailServer = smtplib.SMTP("smtp.gmail.com", 587) mailServer.ehlo() mailServer.starttls() mailServer.ehlo() mailServer.login(gmail_user, gmail_pwd) mailServer.sendmail(gmail_user, to, msg.as_string()) # Should be mailServer.quit(), but that crashes... mailServer.close() #send it mail(recipients, "Todays report", "Test email", filenames) 

Gracias @marc! No puedo comentar tu respuesta, así que aquí hay algunas correcciones (variables con el nombre erróneo) y pequeñas mejoras:

 import os import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email import MIMEImage from email.mime.base import MIMEBase from email import Encoders def mail(to, subject, text, attach): # allow either one recipient as string, or multiple as list if not isinstance(to,list): to = [to] # allow either one attachment as string, or multiple as list if not isinstance(attach,list): attach = [attach] gmail_user='username@gmail.com' gmail_pwd = "password" msg = MIMEMultipart() msg['From'] = gmail_user msg['To'] = ", ".join(to) msg['Subject'] = subject msg.attach(MIMEText(text)) #get all the attachments for file in attach: print file part = MIMEBase('application', 'octet-stream') part.set_payload(open(file, 'rb').read()) Encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(file)) msg.attach(part) mailServer = smtplib.SMTP("smtp.gmail.com", 587) mailServer.ehlo() mailServer.starttls() mailServer.ehlo() mailServer.login(gmail_user, gmail_pwd) mailServer.sendmail(gmail_user, to, msg.as_string()) # Should be mailServer.quit(), but that crashes... mailServer.close() if __name__ == '__main__': mail(['recipient1', 'recipient2'], 'subject', 'body text', ['attachment1', 'attachment2'])