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

news2024/11/17 3:41:38
# 设置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()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1121435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ACO-KELM预测】基于蚁群算法优化核极限学习机回归预测研究(matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

VS Code C# 开发工具包正式发布

前言 微软于本月正式发布Visual Studio Code C#开发工具包&#xff0c;此前该开发套件已经以预览版的形式在6月份问世。经过4个月的测试和调整&#xff0c;微软修复了350多个问题&#xff0c;其中大部分是用户反馈导致的问题。此外&#xff0c;微软还对产品进行了300多项有针对…

【MicroSoft Edge】格式化的显示JSON格式的数据

当我们没有进行任何操作的时候&#xff0c;默认浏览器给我们展示的JSON的数据是这样的&#xff1a; 看着十分不便。 解决方案&#xff1a; 首先点击 MicroSoft Edge 浏览器右上角的三点&#xff0c;如何选择扩展 点击 获取Microsoft Edge 扩展 搜索 JSONView&#xff0c;第一…

智慧公厕系列产品:为您提供更便捷、更卫生的厕所体验

智慧公厕系列产品致力于改善公共厕所的管理和使用体验&#xff0c;通过引入先进的科技和智能设备&#xff0c;提升厕所的安全、卫生、舒适性。这些产品涵盖了从厕位监测到环境调控&#xff0c;从安全防范到能耗监测的各个方面&#xff0c;为用户提供了一个更加方便、舒适、卫生…

【每日一题】做菜顺序

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;贪心排序 写在最后 Tag 【贪心排序】【数组】【2023-10-22】 题目来源 1402. 做菜顺序 题目解读 每一道菜都有一个满足程度&#xff08;是一个整数&#xff09;&#xff0c;制作完成每道菜的时间为 1&#xff0c;每一…

Xray联动RAD实现自动扫描教程

Rad下载地址&#xff1a;https://github.com/chaitin/rad xray下载地址&#xff1a;https://github.com/chaitin/xray Xray启动监听&#xff1a; xray_windows_amd64.exe webscan --listen 127.0.0.1:7777 --html-output xray-xxx.html RAD启动爬虫抓包&#xff1a; rad_win…

反射、枚举及lambda表达式

文章目录 一、反射1.1 定义和用途1.2 反射基本信息1.3 反射相关的类&#xff08;重要&#xff09;1.4 Class类&#xff08;反射机制的起源&#xff09;1.5 反射优缺点1.6 总结 二、枚举2.1 定义2.2 使用2.3 枚举优缺点2.4 枚举和反射2.5 总结 三、lambda表达式3.1 背景3.2 基本…

家庭WIFI路由器、无线网卡购买指南

一、参考资料 【Wi-Fi】802.11/802.11b/802.11g/802.11n/802.11a/802.11ac/802.11ax/802.11be 从带宽到路由&#xff0c;从有线到无线&#xff0c;从需求到选购&#xff0c;从布网到实测&#xff0c;全部说尽。基础篇&#xff08;1&#xff09; 【一文详解】802.11a/b/g/n/ac/…

【28】c++设计模式——>观察者模式(1)

观察者模式概念 C观察者模式&#xff08;Observer Pattern&#xff09;是一种设计模式&#xff0c;它用于在对象之间建立一种一对多的依赖关系。在该模式中&#xff0c;当一个对象&#xff08;称为主题&#xff09;发生变化时&#xff0c;所有依赖于它的对象&#xff08;称为观…

跳跃游戏Ⅱ-----题解报告

题目&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 与Ⅰ不同的是&#xff0c;这次要求找出最小的跳跃次数。思路也很简单&#xff0c;在每一次跳跃之后都更新最远的跳跃距离。 举个列子&#xff1a; 输入&#xff1a;2,3,1,1,4 第一次…

【SSA-BP预测】基于麻雀算法优化BP神经网络回归预测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Linux 中监控磁盘分区使用情况的 10 个工具

在本文[1]中&#xff0c;我们将回顾一些可用于检查 Linux 中磁盘分区的 Linux 命令行实用程序。 监控存储设备的空间使用情况是系统管理员最重要的任务之一&#xff0c;它可以确保存储设备上有足够的可用空间&#xff0c;以维持 Linux 系统的高效运行。 1. fdisk fdisk 是一个强…

STM32+摁键与定时器实现Led灯控制(中断)

中断作为单片机开发必须掌握的内容&#xff0c;它能够在不搭载操作系统的情况下让我们体验多任务处理的快感&#xff0c;保证了高优先级任务的实时性&#xff0c;同时系统中断也能够提供给用户在核心发生错误之后进行处理的机会。STM32F103系列单片机中断非常强大&#xff0c;每…

SpringBoot +JdbcTemplate+VUE 实现在线输入SQL语句返回数据库结果

文章目录 前言框架选型SpringBoot 结合JdbcTemplate简单示例SpringBoot 结合JdbcTemplate实现运行SQL处理思路后端处理前端处理 前言 想起来要做这个功能是因为我们公司的预生产环境和生产环境如果想要连接数据库都需要登录堡垒机&#xff0c;然后再通过堡垒机进行跳转到对应定…

1024 蓝屏漏洞攻防战(第十九课)

1024 蓝屏漏洞攻防战(第十九课) 思维导图 一 永恒之蓝的介绍 漏洞为外界所知源于勒索病毒的爆发,该病毒利用NSA(美国国家安全局)泄露的网络攻击工具 永恒之蓝( EternalBlue )改造而成,漏洞通过TCP的445和139端口,利用SMB远程代码执行漏洞,攻击者可以在目标系统上执行…

详解对于ReadView 机制如何判断当前事务能够看见

ReadView 机制就是用来判断当前事务能够看见哪些版本的&#xff0c;一个 ReadView 主要包含如下几个部分&#xff1a; m_ids&#xff1a;生成 ReadView 时有哪些事务在执行但是还没提交的&#xff08;称为 “活跃事务”&#xff09;&#xff0c;这些活跃事务的 id 就存在这个字…

for、while、do While、for in、forEach、map、reduce、every、some、filter的使用

for、while、do While、for in、forEach、map、reduce、every、some、filter的使用 for let arr [2, 4, 6, 56, 7, 88];//for for (let i 0; i < arr.length; i) {console.log(i : arr[i]) //0:2 1:4 2:6 3:56 4:7 5:88 }普通的for循环可以用数组的索引来访问或者修改…

AI篇-如何用AI辅助对图片进行鉴赏

前言 目录 前言 一、观众侧鉴赏图片 方法1&#xff1a;直接将图片发给文心一言&#xff0c;让文心一言分析。 方法2&#xff08;正确方法&#xff09;&#xff1a;将图片简单介绍并把图片发给文心一言&#xff0c;让文心一言分析。 二、作者介绍图片 方法&#xff08;正…

智慧公厕管理系统:让公厕更智能、更高效的利器

公厕是城市基础设施的重要组成部分&#xff0c;然而&#xff0c;由于管理不善和公共卫生意识的薄弱&#xff0c;公厕经常面临着脏乱差的问题&#xff0c;令人不愿意使用。为了改善公厕管理的现状&#xff0c;智慧公厕管理系统的出现成为了一种创新的解决方案。 智慧公厕管理系…

大模型微调发展-学习调研总结

模型微调前言 https://blog.csdn.net/weixin_39663060/article/details/130724730 针对于小公司&#xff0c;如何能够利用开源的大模型&#xff0c;在自己的数据上继续训练&#xff0c;从而应用于自己的业务场景&#xff1f;或低成本的方法微调大模型。 目前主流的方法包括201…