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)
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐