python查询数据库发送邮件,附件csv格式,xlsx格式

# 设置liunx系统运行python代码的解释器
#!/usr/bin/python3

# python声明文件的编码格式为UTF-8
# python2默认以ASCII编码来读取文件,如果不声明编码格式,它可能会无法正确地解析非ASCII字符(比如中文字符)。
# python3开始默认支持中文了,就可以省去这行注释。
# -*- coding: utf-8 -*-


# 导入Python的SMTP库,用于发送邮件
import smtplib
# 从email库中导入MIMEMultipart类,用于创建多部分MIME邮件
from email.mime.multipart import MIMEMultipart
# 从email库中导入MIMEText类,用于创建文本部分的MIME邮件
from email.mime.text import MIMEText
# 从email库中导入MIMEApplication类,用于创建二进制文件作为邮件附件的MIME邮件
from email.mime.application import MIMEApplication
# 导入pandas库,这是一个用于数据分析和处理的强大库
import pandas as pd
# 导入pymysql库,这是一个用于连接和操作MySQL数据库的Python库
import pymysql

# 没用到
# import openpyxl

# 定义数据库连接配置,包括主机地址、用户名、密码、数据库名称
db_config = {
    
    
    'host': '192.168.75.148',  # 数据库主机地址
    'user': 'seluser',  # 数据库用户名
    'password': 'zzz-123-ZZZ',  # 数据库密码
    'database': 'db1',  # 数据库名称
}

# 定义SMTP服务器和端口,用于发送邮件
smtp_server = 'smtp.qq.com'  # SMTP服务器地址
port = 587  # SMTP服务器端口
# smtp_server_secure = False 表示不使用安全连接(如TLS)
smtp_server_secure = False

# 定义发件人和收件人邮箱地址
sender = '*********@qq.com'  # 发件人邮箱地址
receiver = '*********@qq.com, *********@qq.com'  # 收件人邮箱地址

# 定义用于SMTP服务器登录的密码
password = '*****************'  # SMTP服务器的登录密码

# 定义SQL查询语句,用于从数据库中查询数据
sql = "SELECT id 编号, rid 房间号, name 名字, love 爱好, addr 地址 FROM table1"  # 查询语句,从名为"table1"的表中查询出id、rid、name、love、addr字段的数据

# 使用pymysql库连接MySQL数据库,**db_config用于传递数据库连接参数
connection = pymysql.connect(**db_config)
try:
    with connection.cursor() as cursor:  # 使用上下文管理器来管理数据库连接,确保连接的正确关闭
        cursor.execute(sql)  # 执行SQL查询语句
        result = cursor.fetchall()  # 获取查询结果
finally:
    connection.close()  # 在finally块中关闭数据库连接,确保无论是否有异常发生,都会关闭数据库连接

# 定义一个空列表,用于存储查询结果的列表形式
data = []
for row in result:  # 遍历查询结果的每一行数据
    data.append(list(row))  # 将每一行数据转化为列表形式,并添加到data列表中

# 使用pandas库将查询结果转化为DataFrame对象,方便后续的数据处理和分析
df = pd.DataFrame(data)

# 使用列表推导式获取所有列名,并将它们存储在field_names变量中
field_names = [description[0] for description in cursor.description]

# 为DataFrame对象设置列名,这里使用前面获取的field_names
df.columns = field_names


# 将DataFrame对象转换为HTML格式的表格,并设置样式参数
# index=False表示不显示索引列,border=0表示不显示边框,header=True表示显示表头
# 转换结果存储在html_content变量中
html_content = df.to_html(index=False, border=0, header=True)

# 定义HTML页面的头部样式,包括背景颜色、字体大小、内边距等
html_head = '''<!DOCTYPE html>  
<html lang="en">  
<head>  
<meta charset="utf-8">  
<title>Table</title>  
<style>    
body {    
    background-color:#CCC;  /* 设置背景颜色为浅灰色 */  
    font-size:12px;  /* 设置字体大小为12px */  
    font-family:"宋体";  /* 设置字体家族为宋体 */  
}    
  
table {    
    margin:5px auto;  /* 设置表格的外边距上下为5px,左右为auto,使表格在页面中水平居中 */  
    width:60%;  /* 设置表格的宽度为页面宽度的60% */  
    padding:5px;  /* 设置表格的内边距为5px */  
}    
  
th {    
    background-color:#76B7BC;  /* 设置表头单元格的背景颜色为浅蓝色 */  
    font-size:14px;  /* 设置表头单元格的字体大小为14px */  
    padding:5px;  /* 设置表头单元格的内边距为5px */  
}    
  
tr:nth-child(even) {    
    background-color:#E6E6FA;  /* 设置偶数行(第2n行)的背景颜色为淡紫色 */  
    padding:5px 6px;  /* 设置偶数行(第2n行)的内边距为5px 6px */  
}    
  
tr:nth-child(odd) {    
    background-color:#FFF;  /* 设置奇数行(第2n+1行)的背景颜色为白色 */  
    padding:5px 6px;  /* 设置奇数行(第2n+1行)的内边距为5px 6px */  
}    
</style>    
  
</head>    
<body>''' # 定义HTML页面的尾部样式,即结束标记,包括</body>和</html>
html_tail = '''</body>    
</html>''' # 定义HTML页面的尾部样式,即结束标记,包括</body>和</html>
# 将前面生成的HTML内容存储在html_content变量中
html_content = html_head + html_content + html_tail

# 打印出邮件的内容,方便查看
print('content: ', html_content)

# 打开一个名为'a.html'的文件,准备写入邮件内容
with open('a.html', 'w') as f:
    # 将邮件内容写入到文件中
    f.write(html_content)

# 将DataFrame对象转换为CSV格式的文件,并存储在'data.csv'文件中
df.to_csv('data.csv', index=False, encoding='utf-8')

# 创建一个新的Excel文件,并保存为'data.xlsx'
df.to_excel('data.xlsx', index=False)

# 创建一个MIMEMultipart对象,用于构建邮件正文和附件
msg = MIMEMultipart()

# 设置发件人邮箱地址
msg['From'] = sender
# 设置收件人邮箱地址
msg['To'] = receiver
# 设置邮件主题
msg['Subject'] = 'MySQL查询结果'

# 将邮件正文设置为HTML格式,并将前面生成的html_content添加到邮件正文后面
# 注意这里是html格式,所以要用MIMEText而不是MIMEText(body, 'plain')
body = '这是MySQL查询结果的表格附件。请查收附件中的数据表。\n\n' + html_content
msg.attach(MIMEText(body, 'html'))

# 添加附件,这里使用的是前面生成的CSV文件'data.csv'
try:
    with open('data.csv', 'rb') as f:
        # 将文件内容读取并转化为MIMEApplication对象,用于添加到邮件中作为附件
        attachment = MIMEApplication(f.read())
        # 设置邮件附件的名称和类型,以便收件人能正确识别和打开附件
        attachment.add_header('Content-Disposition', 'attachment', filename='data.csv')
        # 将附件添加到邮件中
        msg.attach(attachment)
except IOError as e:
    print("错误: 无法读取CSV文件 - ", e)

# 添加Excel格式的附件
try:
    with open('data.xlsx', 'rb') as f:
        xlsx_attachment = MIMEApplication(f.read())
        xlsx_attachment.add_header('Content-Disposition', 'attachment', filename='data.xlsx')
        msg.attach(xlsx_attachment)
except IOError as e:
    print("错误: 无法读取Excel文件 - ", e)

# 配置SMTP服务器和端口,然后登录SMTP服务器(如果需要安全连接则启用TLS)并准备发送邮件
server = smtplib.SMTP(smtp_server, port)
server.starttls() if smtp_server_secure else server.login(sender, password)

try:
    # 使用发件人邮箱地址、收件人邮箱地址和构建好的邮件对象发送邮件
    server.sendmail(sender, receiver, msg.as_string())
    print("发送成功")
except smtplib.SMTPException as e:
    print("错误: 邮件发送失败 - ", e)

# 退出SMTP服务器连接
server.quit()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44659804/article/details/133975774