Datafram 实现作为正文发送邮件


一、发送邮件

  若还不知道如何使用 python 来发送邮件,请先参考这篇博客  。

这一篇讲述了如何构造 文本、html、附件、图片等格式的邮件。

二、将 Datafram 作为正文发送邮件

  我们使用 pandas 处理完数据后,会把表格里的数据以邮件的形式发送出去,那要怎么做呢?这里提供一个简单的处理方式:

1、将 datafram 格式的表格转化成 html 格式的表格,可使用 to_html() 方法直接转化。

import pandas

data_dic = {'机型':['小米12','华为P40','IQOO8','iphone13'],'价格':[3999,5000,3899,5999],'颜色':['白色','紫色','金色','白色']}
# 转成 datafram 格式
df = pandas.DataFrame(data_dic)
# 转化成 HTML 格式
df_html = df.to_html()

 2、将 MIMEText() 方法第二个参数设置为 'html' ,然后发送邮件。

import pandas
from smtplib import SMTP_SSL
from email.mime.text import MIMEText

def sendMail(message,Subject,sender_show,recipient_show,to_addrs,cc_show=''):
    '''
    :param message: str 邮件内容
    :param Subject: str 邮件主题描述
    :param sender_show: str 发件人显示,不起实际作用如:"xxx"
    :param recipient_show: str 收件人显示,不起实际作用 多个收件人用','隔开如:"xxx,xxxx"
    :param to_addrs: str 实际收件人
    :param cc_show: str 抄送人显示,不起实际作用,多个抄送人用','隔开如:"xxx,xxxx"
    '''
    # 填写真实的发邮件服务器用户名、密码
    user = 'root'
    password = '123456'
    # 邮件内容
    msg = MIMEText(message, 'html', _charset="utf-8")
    # 邮件主题描述
    msg["Subject"] = Subject
    # 发件人显示,不起实际作用
    msg["from"] = sender_show
    # 收件人显示,不起实际作用
    msg["to"] = recipient_show
    # 抄送人显示,不起实际作用
    msg["Cc"] = cc_show
    with SMTP_SSL(host="smtp.exmail.qq.com",port=465) as smtp:
        # 登录发送邮件服务器
        smtp.login(user = user, password = password)
        # 实际发送、接收邮件配置
        smtp.sendmail(from_addr = user, to_addrs=to_addrs.split(','), msg=msg.as_string())

def work():
    data_dic = {'机型':['小米12','华为P40','IQOO8','iphone13'],'价格':[3999,5000,3899,5999],'颜色':['白色','紫色','金色','白色']}
    # 转成 datafram 格式
    df = pandas.DataFrame(data_dic)
    # 转化成 HTML 格式
    df_html = df.to_html()
    Subject = '表格测试'
    sender_show = 'xxx'
    recipient_show = 'xxx'
    to_addrs = 'xxx'
    sendMail(df_html,Subject,sender_show,recipient_show,to_addrs)

if __name__ =='__main__':
    work()

3、不加修饰的表格有点难看,我们可以通过 CSS 进行样式修改,如下:

import pandas
from smtplib import SMTP_SSL
from email.mime.text import MIMEText

def sendMail(message,Subject,sender_show,recipient_show,to_addrs,cc_show=''):
    '''
    :param message: str 邮件内容
    :param Subject: str 邮件主题描述
    :param sender_show: str 发件人显示,不起实际作用如:"xxx"
    :param recipient_show: str 收件人显示,不起实际作用 多个收件人用','隔开如:"xxx,xxxx"
    :param to_addrs: str 实际收件人
    :param cc_show: str 抄送人显示,不起实际作用,多个抄送人用','隔开如:"xxx,xxxx"
    '''
    # 填写真实的发邮件服务器用户名、密码
    user = 'root'
    password = '123456'
    # 邮件内容
    msg = MIMEText(message, 'html', _charset="utf-8")
    # 邮件主题描述
    msg["Subject"] = Subject
    # 发件人显示,不起实际作用
    msg["from"] = sender_show
    # 收件人显示,不起实际作用
    msg["to"] = recipient_show
    # 抄送人显示,不起实际作用
    msg["Cc"] = cc_show
    with SMTP_SSL(host="smtp.exmail.qq.com",port=465) as smtp:
        # 登录发送邮件服务器
        smtp.login(user = user, password = password)
        # 实际发送、接收邮件配置
        smtp.sendmail(from_addr = user, to_addrs=to_addrs.split(','), msg=msg.as_string())

def work():
    data_dic = {'机型':['小米12','华为P40','IQOO8','iphone13'],'价格':[3999,5000,3899,5999],'颜色':['白色','紫色','金色','白色']}
    # 转成 datafram 格式
    df = pandas.DataFrame(data_dic)
    # 转化成 HTML 格式
    df_html = df.to_html()
    mail_html =  '''
        
        
            
            
            
        
        

        

Hi,本邮件由系统自动发出(每天触发),无需回复!


手机价格清单

'''+ df_html +''' ''' Subject = '表格测试' sender_show = 'xxx' recipient_show = 'xxx' to_addrs = 'xxx' sendMail(mail_html,Subject,sender_show,recipient_show,to_addrs) if __name__ =='__main__': work()