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

  • 2020 年 3 月 13 日
  • 筆記

一、概述

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

在之前的文章中

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 = '[email protected]'  # 系统账户          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 = "[email protected]"      # 标题      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