这周有需求将Bi报表每天定时,自动的群发给team成员,今天搜集资料完成了这个需求,可以发送普通文本,图片,附件已经html形式将其展现出来,整套代码如下;已亲测可行,相关信息已脱敏~

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# smtplib是Python 用来发送邮件的模块
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.multipart import MIMEMultipart  # 构建邮件头信息,包括发件人,接收人,标题等
from email.mime.text import MIMEText  # 构建邮件正文,可以是text,也可以是HTML
from email.mime.application import MIMEApplication  # 构建邮件附件,理论上,只要是文件即可,一般是图片,Excel表格,word文件等
from email.header import Header  # 专门构建邮件标题的,这样做,可以支持标题中文
from email.mime.image import MIMEImage  # 处理图片信息

import time
import pandas as pd
import pymysql.cursors
import time

time_start = time.time()


def get_data():
    \"\"\"
    从数据库中取数
    :return:
    \"\"\"
    config = {
        \'host\': \'101.132.***.***\',
        \'port\': 3306,
        \'user\': \'***\',
        \'password\': \'***\'
    }

    conn = pymysql.connect(**config)
    cursor = conn.cursor()

    sql_app = \"\"\"
    select
    *
    from
    ***.***
    limit
    100;
    \"\"\"
    df_a = pd.read_sql(sql_app, conn)
    return df_a


def plot_data(data):
    \"\"\"
    输入原始数据进行分析,并输出Bi报表存放地址(自定义化)
    :param data: 从get_data()函数中取到的原始数据
    :return:
    \"\"\"



# 定义一个字符串,内容就是HTML代码
def get_simple_html_msg(df):
    \"\"\"
    一般需求将图片和超链接放到里面(用于非动态数据,直接发送处理好的图片和网页链接)
    :param df:
    :return:
    \"\"\"
    html_msg = \\
        \"\"\"
        <!DOCTYPE html>
        <html lang=\"en\">
        <head>
            <  charset=\"UTF-8\">
            < > </ >
        </head>
        <body>
        <h1>这是一封python写的邮件,使用的是HTML格式构造正文</h1>
        <h2>可以为文字添加超链接,比如:<a href=\"https://***\">**</a></h2>
        <hr>
        <h3>还可以添加图片,比如下面这张</h3>
        <img src=\"E:\\code\\_sample\\_picture\\***.jpg\">
        <h4>还可以添加第二章图片,比如下面这张</h4>
        <img src=\"E:\\code\\_sample\\_picture\\***.jpg\">
        </body>
        </html>
        \"\"\"
    return html_msg


def send_email(html_msg):
    \"\"\"
    发送邮件的脚本,在邮件中可添加text文本,html文本和附件
    :return:
    \"\"\"
    # 邮件服务信息,公司
    mail_host = \"smtp.***.com\"  # 设置服务器
    mail_user = \"***@***.com\"  # 用户名
    mail_pass = \"***\"  # 密码
    # 邮件发送和接收人
    sender = mail_user
    receiver = [\'***@***.com\', \'***@163.com\']
    # 邮件头信息
    message = MIMEMultipart(\'related\')
    message[\'From\'] = sender
    message[\'To\'] = \',\'.join(receiver)
    message[\'Subject\'] = Header(\'【Python Test】邮件测试\')
    # ①普通文本内容添加到邮件
    content_text = MIMEText(\'Python 定时邮件发送测试成功...\', \'plain\', \'utf-8\')
    # message.attach(content_text)
    # ②html 形式的内容添加到邮件(如果有② 则文本和图片不会显示在邮件正文中)
    content_html = MIMEText(html_msg, \"html\", \"utf-8\")
    message.attach(content_html)
    # ③图片 形式的内容添加到邮件(包含在②中,否咋上传的是图片附件)
    # fp = open(r\'E:\\code\\_sample\\_picture\\***.jpg\', \'rb\')
    # content_image = MIMEImage(fp.read())
    # fp.close()
    # content_image.add_header(\'Content-ID\', \'\')
    # message.attach(content_image)
    # ④ 附件 形式的内容添加到邮件
    excel_file_path = r\'E:\\***\\***\\3_Excel文档\\1_AI开源项目调研_2018.10.29.xlsx\'
    attach_table = MIMEApplication(open(excel_file_path, \'rb\').read())
    attach_table.add_header(\'Content-Disposition\', \'attachment\', filename=\'我的附件.xlsx\')
    #  这样的话,附件名称就可以是中文的了,不会出现乱码
    attach_table.set_charset(\'utf-8\')
    message.attach(attach_table)

    # 发送邮件,测试成功,流程都是固定的:创建客户端,登陆,发送,关闭
    try:
        smtpObj = smtplib.SMTP()  # 实例化
        smtpObj.connect(mail_host, 25)  # 25为 SMTP 端口号
        smtpObj.login(mail_user, mail_pass)  # 邮箱登录
        print(\'登录成功!\')
        smtpObj.sendmail(mail_user, receiver, message.as_string())  # 发送邮件
        smtpObj.quit()  # 邮件退出
        print(\"恭喜:邮件发送成功!\")
    except smtplib.SMTPException:
        print(\"错误:无法发送邮件\")


if __name__ == \'__main__\':
    # 从数据库取数并分析,输出data 
    data = get_data()
    # 将data 转化成html格式
    html_msg = get_simple_html_msg(data)
    # 发送邮件
    send_email(html_msg)
    # 计算耗时
    time_end = time.time()
    time_cost = str(round((time_end - time_start), ndigits=2))
    print(\'time_cost:\', time_cost + \'s\')

 

收藏 打印