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

本文是系列一的实际应用案例,同时发送图片和附件实际案例。

使用Python发送邮件(图片、表格、附件) 系列一:如何发送图片、表格等的全代码使用Python发送邮件(图片、表格、附件) 系列一:如何发送图片、表格等的全代码_python发送qq表格文件-CSDN博客

使用Python发送邮件(图片、表格、附件) 系列三: 发送工作报表之透视表自动刷新数据使用Python发送邮件(图片、表格、附件) 系列三: 发送工作报表之透视表自动刷新数据_render_mpl_table-CSDN博客

# -*- coding: utf-8 -*-
"""
Created on Fri Feb 14 20:28:21 2020

@author: xxx
"""

import os
os.chdir(r'F:\自动化报表') # 设置文件路径

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 画图时,中文字体和负号无法显示, 可按下面语句设置
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['KaiTi'] # 设置要使用字体
mpl.rcParams['font.serif'] = ['KaiTi']
mpl.rcParams['axes.unicode_minus'] = False  # 使 - 号显示

import 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


# Part 0 set initial parameter
mail_user = 'xxxxx'          # 邮箱登录名,次处使用QQ邮箱,填写QQ号即可,不用带@qq.com
mail_pass = 'abcdefghijk'    # QQ邮箱授权码,可百度如何获取

sender    = 'xxxxx@qq.com'                       # 发件人
receivers = ['abcxxx@qq.com', 'efgxxx@126.com']  # 收件人列表,list形式
chaosong  = ['hijxx@qq.com']                     # 抄送人列表,list形式

# 设置邮件体对象
msg = MIMEMultipart()                       # 邮件体对象,此处可加入参数, 具体可百度
subject = 'python send email test'          # 邮件主题
msg['subject'] = Header(subject, 'utf-8')   # 加入邮件主题
msg['From'] = "{}".format(sender)           # 加入邮件发送人
msg['To'] = ",".join(receivers)             # 加入邮件接收人
msg['Cc'] = ",".join(chaosong)              # 加入邮件抄送人,如无,可注释掉



# 数据处理
# 数据下载链接 http://www.gov.cn/shuju/2017sjcs/sjxqpage.htm
df = pd.read_excel('社会消费品零售总额.xlsx', sheet_name = 'Sheet1')
df['年'] = df['统计时间'].apply(lambda x: x[:5])
# 图片
df_x = np.arange(len(df)); df_real_x = df['统计时间']; df_y = df['社会消费品零售总额(亿元)']
fig = plt.figure(figsize=(10,6))
plt.plot(df_x, df_y ,  label="社会消费品零售总额(亿元)")
xticks = np.arange(0,len(df_x)+1,11)
xlabels = [df_real_x[x] for x in xticks[:-1]]+list(df_real_x)[-1:]
plt.xticks(xticks, xlabels)
plt.legend(loc = 'upper left')
fig.autofmt_xdate()
plt.savefig("data_image.jpg")

# 表格
df_count = df.groupby('年', as_index=False)['统计时间','社会消费品零售总额(亿元)'].agg({'统计时间':len, '社会消费品零售总额(亿元)':sum})
df_count['统计时间'] = df_count['统计时间']+1
df_count.rename(columns = {'统计时间':'统计总月份数', '社会消费品零售总额(亿元)':'每年零售总额(亿元)'}, inplace=True)



# 网页内容,有链接,插入图片
data_link = 'http://www.gov.cn/shuju/2017sjcs/sjxqpage.htm'
htmlFile = """\
<html>
  <head></head>
  <body>
    <pre style="font-family:arial">
    Dears,
       以下是社会消费品零售总额数据,它指企业(单位、个体户)通过交易直接售给个人、社会集团非生产、非经营用的实物商品金额,
    以及提供餐饮服务所取得的收入金额。个人包括城乡居民和入境人员,社会集团包括机关、社会团体、部队、学校、企事业单位、居委会或村委会等。
    所用数据链接:<a href="{link}">{link}</a>.
    </pre>
    <p>图1 社会消费品每月零售总额(亿元):
    <br /><img src="cid:0", width=720, height=420  >
    </p>
  </body>
</html>
""".format(link=data_link)
htmlApart = MIMEText(htmlFile, 'html')

# 在正文中显示图片
imageFile = "data_image.jpg"
imageApart = MIMEImage(open(imageFile, 'rb').read(), imageFile.split('.')[-1])
imageApart.add_header('Content-ID', '<0>')
msg.attach(imageApart)
msg.attach(htmlApart)



# 邮件正文中嵌入表格
table_title = "表1 社会消费品每年零售总额(亿元)"

def get_html_msg(df, table_title):
    """
    1. 构造html信息
    """
    df_html = df.to_html(escape=False)

    # 表格格式
    head = \
        """
        <head>
            <meta charset="utf-8">
            <STYLE TYPE="text/css" MEDIA=screen>

                table.dataframe {
                    border-collapse: collapse;
                    border: 2px solid #a19da2;
                    /*默认居中auto显示整个表格*/
                    margin: left;
                }

                table.dataframe thead {
                    border: 2px solid #91c6e1;
                    background: #f1f1f1;
                    padding: 10px 10px 10px 10px;
                    color: #333333;
                }

                table.dataframe tbody {
                    border: 2px solid #91c6e1;
                    padding: 10px 10px 10px 10px;
                }

                table.dataframe tr {

                }

                table.dataframe th {
                    vertical-align: top;
                    font-size: 14px;
                    padding: 10px 10px 10px 10px;
                    color: #105de3;
                    font-family: arial;
                    text-align: center;
                }

                table.dataframe td {
                    text-align: left;
                    padding: 10px 10px 10px 10px;
                }

                body {
                    font-family: 宋体;
                }

                h1 {
                    color: #5db446
                }

                div.header h2 {
                    color: #0002e3;
                    font-family: 黑体;
                }

                div.content h2 {
                    text-align: center;
                    font-size: 28px;
                    text-shadow: 2px 2px 1px #de4040;
                    color: #fff;
                    font-weight: bold;
                    background-color: #008eb7;
                    line-height: 1.5;
                    margin: 20px 0;
                    box-shadow: 10px 10px 5px #888888;
                    border-radius: 5px;
                }

                h3 {
                    font-size: 22px;
                    background-color: rgba(0, 2, 227, 0.71);
                    text-shadow: 2px 2px 1px #de4040;
                    color: rgba(239, 241, 234, 0.99);
                    line-height: 1.5;
                }

                h4 {
                    color: #e10092;
                    font-family: 楷体;
                    font-size: 20px;
                    text-align: center;
                }

                td img {
                    /*width: 60px;*/
                    max-width: 300px;
                    max-height: 300px;
                }

            </STYLE>
        </head>
        """

    # 构造正文表格
    body = \
        """
        <body>

        <div align="center" class="header">
            <!--标题部分的信息-->
            <!--<h1 align="left">{table_title}</h1>-->
            <p align="left">{table_title}</p>
        </div>

        <div class="content">
            {df_html}
        </div>
        </body>
        <br /><br />
        """.format(df_html=df_html, table_title=table_title)

    html_msg= "<html>" + head + body + "</html>"
#    这里是将HTML文件输出,作为测试的时候,查看格式用的,正式脚本中可以注释掉
#    fout = open('test.html', 'w', encoding='UTF-8', newline='')
#    fout.write(html_msg)
    return html_msg

# html 内容
html_msg = get_html_msg(df_count, table_title)
content_html = MIMEText(html_msg, "html", "utf-8")
msg.attach(content_html)



# 加入多个附件
files = ['data_image.jpg', '社会消费品零售总额.xlsx' ]
for i in np.arange(len(files)):
    attFile = MIMEApplication(open(files[i], 'rb').read())
    attFile.add_header('Content-Disposition', 'attachment', filename=files[i])
    msg.attach(attFile)



# 发送邮件,参数设置
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')
del msg

以下是测试结果:

图片2

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值