使用Python发送邮件(图片、表格、附件) 系列一:如何发送图片、表格等的全代码

https://blog.csdn.net/u010652755/article/details/104321413

使用Python发送邮件(图片、表格、附件) 系列二: 同时发送图片和附件实际案例

https://blog.csdn.net/u010652755/article/details/104321576

本文是系列三,可用于工作中使用python发送定时报表。发送报表时经常用到透视表,本文即解决了两个问题:

1、将透视表表格转为图片内嵌到邮件正文中,此处只写了只有一张简单汇总透视表的情况

2、在第一份透视表中勾选【打开自动更新】选项(可百度),当透视表的原数据发生变化,打开透视表数据会自动刷新。下载邮件中的透视表打开,点击【启用编辑】【启用保护内容】,即可实现数据刷新

注意:将透视表和数据源放到指定目录中,两个文件的格式名字不要有变动,每天用新的数据源将旧数据源覆盖即可

# -*- coding: utf-8 -*-
"""
Created on Sat Feb 15 11:44:58 2020@author: xxxx
"""import os
os.chdir(r'F:\自动化报表\python_excel')import numpy as np
import pandas as pdimport matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['Times New Roman Uni']
mpl.rcParams['font.serif'] = ['Times New Roman Uni']
mpl.rcParams['axes.unicode_minus'] = Falseimport smtplib
from email.message import EmailMessage
from email.header import Header
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication# 显示所有内容
pd.set_option('max_colwidth',100)#%% 发送邮件
def send_email():mail_user = 'xxxx'    # 邮箱登录名,次处使用QQ邮箱,填写QQ号即可,不用带@qq.commail_pass = 'xxxx'    # QQ邮箱授权码,可百度如何获取sender    = 'xxxx@qq.com'   # 发件人receivers = ['xxxx']        # 收件人列表,list形式chaosong  = ['xxxx']        # 抄送人列表,list形式# 设置邮件体对象,对象类型为 mixed,可以发送附件subject = """使用Python发送自动化报表"""   # 邮件主题msg = MIMEMultipart()                       # 邮件体对象,此处可加入参数, 具体可百度msg['subject'] = Header(subject, 'utf-8')   # 加入邮件主题msg['From'] = "{}".format(sender)           # 加入邮件发送人msg['To'] = ",".join(receivers)             # 加入邮件接收人msg['Cc'] = ",".join(chaosong)              # 加入邮件抄送人,如无,可注释掉# 加入图片htmlFile = """\<html><head></head><body><pre style="font-family:arial; margin: left;">Dears,以下是某销售产品的每日统计数据,请查收.详细数据见附件表1 各地线上及线下销售总额(亿元):<img src="cid:0" ></pre></body></html>"""htmlApart = MIMEText(htmlFile, 'html')# 在正文中显示图片File1 = 'data_image.png' # 如果是定时发送的报表,此处可以写死imageApart = MIMEImage(open(File1, 'rb').read(), File1.split('.')[-1])imageApart.add_header('Content-ID', '<0>')msg.attach(imageApart)msg.attach(htmlApart)# 加入附件File2 = '每日统计透视表.xlsx' # 如果是定时发送的报表,此处可以写死attFile = MIMEApplication(open(File2, 'rb').read())attFile.add_header('Content-Disposition', 'attachment', filename=File2)msg.attach(attFile)if __name__ == '__main__' :try:# 发送邮件,参数设置sftp_obj = smtplib.SMTP_SSL(host='smtp.qq.com', port = 465)sftp_obj.login(mail_user, mail_pass)sftp_obj.sendmail(sender, receivers, msg.as_string())sftp_obj.quit()sftp_obj.close()print('\nThe email has been sent successfully')except Exception as err:print('\n Email failed to be sent out. Please check !')print(err)#%% 设置表格样式
def render_mpl_table(data, col_width=3.0, row_height=0.625, font_size=14,header_color='#40466e', row_colors=['#f1f1f2', 'w'], edge_color='black',bbox=[0, 0, 1, 1], header_columns=0, ax=None,cell_width = None, **kwargs):data_shape = data.shapeif ax is None:size = (np.array(data.shape[::-1]) + np.array([0, 1])) * np.array([col_width, row_height])fig, ax = plt.subplots(figsize=size)ax.axis('off')mpl_table = ax.table(cellText=data.values, bbox=bbox, colLabels=data.columns, cellLoc='center', **kwargs)mpl_table.auto_set_font_size(False)mpl_table.set_fontsize(font_size)mpl_table.set_gid('-')for k, cell in  mpl_table._cells.items():if cell_width is None:passelse:cell.set_width(cell_width[k[1]])cell.set_edgecolor(edge_color)if k[0] == 0 or k[1] < header_columns or k[0] == data_shape[0]:cell.set_text_props(weight='bold', color='w')cell.set_facecolor(header_color)else:cell.set_facecolor(row_colors[k[0]%len(row_colors) ])fig.savefig('data_image.png', bbox_inches = 'tight')
#    plt.show()return ax#%%
# 数据处理
# 1、 修改原数据后再次发送查看邮件透视表,为了进行测试,修改了透视表源数据
df = pd.read_csv('5000 Sales Records.csv')
df['Total Revenue'] = 5
df.to_excel('sales_data.xlsx', sheet_name='5000 Sales Records', index=False)# 2、透视表:如果不在正文中显示透视表内容,只是将透视表作为附件发送,则无需加入本部分的代码,只用1、3、4部分即可
df_pivot = df.groupby('Region', as_index=False)['Order Priority', 'Total Revenue', 'Total Cost', 'Total Profit'].\agg({'Order Priority':len, 'Total Revenue':sum, 'Total Cost': sum, 'Total Profit':sum})
sum_all = dict(zip(list(df_pivot.columns), ['总计'] + list(df_pivot.iloc[:, 1:].sum())))
df_pivot = df_pivot.append([sum_all], ignore_index=True)
df_pivot.iloc[:, 2:] = df_pivot.iloc[:, 2:].applymap(lambda x: str("{:.2f}".format(x)) )# 3、读取透视表数据,此时python读取的透视表数据并没有更新。
# 在透视表中透视表选项中勾选【打开时更新数据】,那么在邮件中打开透视表时,可以发现透视表更新了
dfp = pd.read_excel('每日统计透视表.xlsx') # 透视表源表为 sales_data.xlsx
dfp.iloc[:, 2:] = dfp.iloc[:, 2:].applymap(lambda x: str("{:.2f}".format(x)) ) #处理显示小数位数# 4、发送邮件
render_mpl_table(df_pivot, header_columns=0, col_width=3, cell_width = [0.20, 0.10, 0.10, 0.10, 0.10])
send_email()

图1  数据源改动前邮件内容

图2  数据源改动后邮件内容(数据因为由0改为了5,所以和上图对不上)

参考资料:

1、matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域:https://blog.csdn.net/jifaley/article/details/79687000

2、matplotlib绘图:https://matplotlib.org/3.1.0/api/pyplot_summary.html

3、表格转图片代码:https://code-examples.net/en/q/19714c3

Python发送邮件系列已全部完成,本文涉及的只是如何发送邮件的代码。当然,在实际工作中,要处理的任务比这个要更复杂一些,比如连接数据库,多级透视表,多张报表和图表等。最后,感谢诸位网友的不吝分享,也希望本文能对大家有所帮助,减少重复的工作,提升工作效率。。

使用Python发送邮件(图片、表格、附件) 系列三: 发送工作报表之透视表自动刷新数据相关推荐

  1. 第三:Python发送邮件时中文附件下载乱码

    #解决方法 import base64part = MIMEText(open(fileName, 'rb').read(), 'base64', 'UTF-8') part["Conten ...

  2. Python发送邮件(带附件)

    import smtplib                           #发送邮件模块 from email.mime.text import MIMEText    #定义邮件内容 fro ...

  3. Python一看就懂系列(三)

    专栏: python轻奢入门系列 作者: 豆破苍琼 [字符串] 字符串介绍 字符串格式 被单引号或者双引号括起来的数据就是字符串. 字符串输出 """ 字符串输出 &qu ...

  4. python 发送邮件不显示附件_python无法通过电子邮件发送附件文件

    我建议使用 MIMEApplication代替附件.您也不需要手动执行所有有效负载编码,因为这已经自动完成.这个例子对我有用: from email.mime.text import MIMEText ...

  5. python 发送邮件不显示附件_python3发送邮件(无附件)

    python3发送邮件代码: import smtplib from email.mime.text import MIMEText from email.utils import formatdat ...

  6. python 发送邮件不显示附件_求助:写python脚本发 带有附件的邮件, 收到邮件后,发现附件直接显示在屏幕上了,而不是以附件形式...

    不知道为什么会这样,以下是我从网上参考的pythoncode:fromAdd='odps.testmail@alibaba-inc.com'title='RepPrjStat'ccList=''toL ...

  7. python直联(适合于企业内部的内网邮箱)发送邮件(带附件)、发送给多人、抄送给多人的示例

    # coding=utf-8 import smtplib from email.mime.text import MIMEText from email.mime.multipart import ...

  8. Python与Ansys apdl有限元系列三:单层单跨梁单元受竖向均布力,水平集中力

    结构工况 ################################ # Author: GuaDiKaoLa # Email: 582392629@qq.com ############### ...

  9. 表格某一列不固定其余全固定_如何利用Python一键拆分表格并进行邮件发送~

    因为平时经常要将 一张表 拆成工作簿,拆完还要发给不同的对象,工作又使用outlook发邮件,所以本文调用outlook账号进行邮件的发送作为示例:在 一张表拆成多个sheet的基础上,修改了代码,可 ...

  10. python批量分析表格_老板让我从几百个Excel中查找数据,我用Python一分钟搞定!...

    以下文章来源: 早起Python 作者:陈熹 大家好,又到了Python办公自动化系列. 今天分享一个真实的办公自动化需求,大家一定要仔细阅读需求说明,在理解需求之后即可体会Python的强大! 一. ...

最新文章

  1. 我常用的那些linux命令
  2. 机器学习笔记:(时间序列中的线性回归)如何选择预测变量
  3. 微信与服务器通讯失败,linux服务器微擎提示couldn’t resolve host api.weixin.qq.com解决办法...
  4. 合并报表编制采用的理论_合并报表是否恢复子公司盈余公积
  5. python网络编程——IO多路复用之epoll
  6. mysql-修改root密码的方法
  7. Linux下汇编语言学习笔记47 ---
  8. Javascript特效:商品橱窗
  9. redhat linux ssh服务,Redhat6开启ssh
  10. 网站速度这样优化,让你的网站飞起来
  11. Linux下wm8978调试指南
  12. Shape文件的解析
  13. 计数排序CountingSort
  14. 一直想写的关于tarjan算法的理解——向struct edge大佬低头
  15. 超详细分解c 语言——实现扫雷游戏(详解)
  16. 晒晒公司发的年货,一家比一家实在,打工人:发了个通知
  17. html中textarea标签的换行
  18. 很不错的免费杀毒软件
  19. 浅谈STG游戏的开发(4月8日更新,已补全内容)
  20. 渗透测试中信息收集的那些事

热门文章

  1. HTML+CSS静态页面网页设计作业——咖啡网站pc端带轮播js (5页) 学生酒水网页作业, 生鲜水果网页作业成品, 零食小吃网页作 美食网页业模板
  2. 网络工程师考试知识点
  3. Bluedroid 函数分析:BTA_GATTC_Open
  4. java中的正则表达式_java中的正则表达式
  5. 全球与中国线锯钢线市场深度研究分析报告
  6. Office协同办公讲解以及软件归纳
  7. 你需要TrustedInstaller提供的权限才能对此文件进行更改
  8. 马原复习知识点背诵-《马克思主义基本原理概论》
  9. 计算机中丢失msvcp120.dll是什么意思,win7系统玩游戏提示“msvcp120.dll丢失”怎么修复...
  10. win7搭建nas存储服务器_FreeNas 0.7.1:普通电脑变成网络存储服务器