import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from emial.mime.application import MIMEApplication
#用邮箱实现带附件邮件发送 class AttachmentEmailSender(object): def __init__(self): self.smtp_host = "smtp.qq.com" #发送邮件的smtp服务器(从QQ邮箱中取得) self.smtp_user = "rpmarmxn185319@qq.com" #用于登录smtp服务器的用户名,也就是发送者的邮箱 self.smtp_pwd = "xxx" #授权码,和用户名user一起,用于登录smtp,非邮箱密码,可以使用Foxmail生成 self.smtp_port = 465 #smtp服务器SSL端口号,默认是465 self.sender = "rpmarmxn185319@qq.com" def sendeamil(self,tolist,subject,body,lasteamil_path): """ 发送邮件 :param tolist:收件人的邮箱列表 :param subject: 邮件标题 :param body: 邮件内容 :param lasteamil_path: 邮件附件所在路径 :return: """ #创建一个带附件的实例 message = MIMEMultipart() message['Form'] = Header(self.sender,'utf-8') #发件人 message['To'] = Header(",".join(tolist),'utf-8') #收件人列表 message['Subject'] = Header(subject,'utf-8') #邮件标题 #邮件正文内容 message.attach(MIMEText(body,'plain','utf-8') ) #邮件内容,格式,编码 #获取最新的email路径,如果存在说明有报错,构造附件,发送email路径下的excel文件 att1 = MIMEApplication(open(lasteamil_path,'rb').read()) att1['Content-Type'] = 'application/octet-stream' #这里的filename可以任意写,写什么邮件就显示什么名字 att1.add_header('Content-Disposition', 'attachment', filename="异常数据.xlsx") message.attach(att1) try: smtpSSLClient = smtplib.SMTP_SSL(self.smtp_host,self.smtp_port) #实例化一个SMTP_SSL对象 loginRes = smtpSSLClient.login(self.smtp_user,self.smtp_pwd) #登录smtp服务器 print("登录结果:loginRes=",loginRes) if loginRes and loginRes[0] == 235: print("登陆成功,code = ",loginRes[0]) smtpSSLClient.sendmail(self.sender,tolist,message.as_string()) print(f"mail has been send successful. message:{message.as_string()}") else: print("登录失败,code=",loginRes[0]) except Exception as e: print("邮件发送失败,Exception:e=",e)
if __name__ == "__main__":
lasteamil_path = get_lasteamil_path(EMAIL_PATH) #此函数用于获取最新邮件附件的路径,例如#F:/email\20220210144217\异常通知.xlsx if lasteamil_path: emailSenderClient = AttachmentEmailSender() content = '异常数据如附件所示' tolist = TO_LIST # 收件人邮箱 subject = '政通传媒异常数据通知' + timestamp emailSenderClient.sendeamil(tolist, subject, content,lasteamil_path)