Gmail Python多个附件

问题描述:

我正在尝试创建一个脚本,它将使用Gmail邮件发送多个附件。下面的代码发送电子邮件,但不附件。预期用途是cron几个db查询并通过电子邮件发送结果。总会有2个文件,每天的文件名称会有所不同,因为报告的date位于文件名中。否则,我会刚刚使用:Gmail Python多个附件

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

任何帮助非常感谢。

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 = "[email protected]" 
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) 

本应在发布前等待一个小时。 制造2点的变化:

1)移动的连接环向上

2.)换出 part.add_header( '内容处置', '附件;文件名= “%S”' %OS .path.basename(文件))

为part.add_header( '内容处置', '附件;文件名= “%S”' %文件)

作品如飞。 Gmail拥有多个收件人和多个附件。

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 = "[email protected]" 
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) 

Thanks @marc! 我不能评论你的答案,所以这里有一些修复(错误的变量)和小的改进:

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='[email protected]' 
    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'])