python3使用smtplib发送邮件,带xlsx附件

发布时间:2020-03-12 11:02:33编辑:admin阅读(2372)

    一、概述

    最近在做一个统计报表,需要发送邮件,并带附件的。

    在之前的文章中

    https://www.cnblogs.com/xiao987334176/p/10022026.html

    已经实现了发送邮件,但是没有实现发送附件功能。

     

    二、正式代码

    send_mail.py

    注意:此文件名不能是email.py

    因为email是python自带的,否则会报错

    ModuleNotFoundError: No module named 'email.utils'; 'email' is not a package

    完整内容如下:

    #!/usr/bin/env python3
    # coding: utf-8
    
    
    import smtplib  # 加载smtplib模块
    from email.mime.text import MIMEText
    from email.utils import formataddr
    from email.mime.multipart import MIMEMultipart
    from email.mime.application import MIMEApplication
    
    class SendMail(object):
        def __init__(self,sender,title,content):
            self.sender = sender  #发送地址
            self.title = title  # 标题
            self.content = content  # 发送内容
            self.sys_sender = '123456@163.com'  # 系统账户
            self.sys_pwd = '123456'  # 系统账户密码
    
        def send(self,file_list):
            """
            发送邮件
            :param file_list: 附件文件列表
            :return: bool
            """
            try:
                # 创建一个带附件的实例
                msg = MIMEMultipart()
                # 发件人格式
                msg['From'] = formataddr(["技术服务部", self.sys_sender])
                # 收件人格式
                msg['To'] = formataddr(["", self.sender])
                # 邮件主题
                msg['Subject'] = self.title
    
                # 邮件正文内容
                msg.attach(MIMEText(self.content, 'plain', 'utf-8'))
    
                # 多个附件
                for file_name in file_list:
                    print("file_name",file_name)
                    # 构造附件
                    xlsxpart = MIMEApplication(open(file_name, 'rb').read())
                    # filename表示邮件中显示的附件名
                    xlsxpart.add_header('Content-Disposition','attachment',filename = '%s'%file_name)
                    msg.attach(xlsxpart)
    
                # SMTP服务器
                server = smtplib.SMTP_SSL("smtp.163.com", 465,timeout=10)
                # 登录账户
                server.login(self.sys_sender, self.sys_pwd)
                # 发送邮件
                server.sendmail(self.sys_sender, [self.sender, ], msg.as_string())
                # 退出账户
                server.quit()
                return True
            except Exception as e:
                print(e)
                return False
    
    if __name__ == '__main__':
        # 发送地址
        sender = "88888888@qq.com"
        # 标题
        title = "统计"
        # 发送内容
        content = "2019-11-01 ~ 2019-11-30 统计,见附件!"
        # 附件列表
        file_list = ["工作.xls","外出.xls"]
        ret = SendMail(sender, title, content).send(file_list)
        print(ret,type(ret))


     

    注意:附件是和python文件在同一目录,请根据实际情况,修改附件的路径。

    阿里云服务器,从即日起,不再提供25端口邮件服务 。必须使用SSL加密465端口发信!

    所以上面的代码中,改成了SMTP_SSL,并使用了465端口。

     

    执行脚本,查看邮件,效果如下:

    1.png

    本文参考链接:

    https://blog.csdn.net/sempronx86/article/details/83753689


关键字