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


    一、概述

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

    在之前的文章中

    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端口。

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

    本文参考链接:

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

  • 相关阅读:
    基于 Docker 的 MySQL 主从复制搭建
    获取 Docker 容器的 IP 地址
    Maven 学习资料
    docker 中,修改了 mysql 配置,如何重启 mysql?
    TiDB 学习资料
    Sharding-JDBC 学习资料
    Druid(数据库连接池) 学习资料
    JWT 学习资料
    Maven 拥有三套相互独立的生命周期:clean、default、site
    Maven 生命周期的阶段与插件的目标之间的绑定关系
  • 原文地址:https://www.cnblogs.com/xiao987334176/p/11975248.html
Copyright © 2020-2023  润新知