Datafram 实现作为正文发送邮件

Posted 乱糟糟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Datafram 实现作为正文发送邮件相关的知识,希望对你有一定的参考价值。

一、发送邮件

  若还不知道如何使用 python 来发送邮件,请先参考这篇博客 https://www.cnblogs.com/shenh/p/14267345.html 。

这一篇讲述了如何构造 文本、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 =  \'\'\'
        <!DOCTYPE html>
        <html lang="en">
            <head>
            <meta charset="utf-8">
            <STYLE TYPE="text/css" MEDIA=screen>

                table.dataframe 
                    border-collapse: collapse;
                    border: 2px solid #a19da2;
                

                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: #3da014;
                    font-family: arial;
                    text-align: center;
                

                table.dataframe td 
                    text-align: center;
                    padding: 10px 10px 10px 10px;
                

                body 
                    font-family: 宋体;
                

                h1 
                    color: #5db446
                

                div.header h2 
                    color: #3da014;
                    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(61, 160, 20, 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 
                    max-width: 300px;
                    max-height: 300px;
                

            </STYLE>
        </head>
        <body>

        <h2><b>Hi,本邮件由系统自动发出(每天触发),无需回复!</b></h2>
        <hr size="1px" noshade=true />
        <p><font color="#0B610B"><b>手机价格清单</b></font></p>
        \'\'\'+ df_html +\'\'\'
        </body>
        </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()

 

以上是关于Datafram 实现作为正文发送邮件的主要内容,如果未能解决你的问题,请参考以下文章

HTML 电子邮件正文是不是可以引用作为附件发送的文件(在同一封电子邮件中)?

强制 phpmailer 发送正文为空的邮件

在电子邮件正文中发送带有动态内容的图像

我应该如何使用 Outlook 发送代码片段?

如何通过 Automic 将 SQL 脚本结果作为电子邮件正文中的表格发送

如何使用 Blazor 和 NetCore 5 在电子邮件中将 razor 组件作为正文发送?