这周有需求将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\')
继续阅读与本文标签相同的文章
-
猎户星空CEO傅盛:现在是AI发展最好时期,家庭服务机器人前景可期
2026-05-14栏目: 教程
-
5G远程驾驶和微公交首秀互联网大会
2026-05-14栏目: 教程
-
学宏程序编程,这些知识必不可少!
2026-05-14栏目: 教程
-
华为准备卖出“落后”的5G,多家美企极力竞争!任正非格局太大!
2026-05-14栏目: 教程
-
百度:飞桨深度学习平台已累计服务150多万开发者
2026-05-14栏目: 教程
