如何将Python查询MySQL的结果嵌入smtplib邮件正文?
解决MySQL查询结果(元组)整合到邮件正文的问题
我来帮你搞定这个问题!其实核心就是把查询返回的元组列表转换成易读的文本格式,然后嵌入到邮件正文中。下面分步骤给你演示具体做法:
第一步:处理MySQL查询结果,把元组转为友好文本
当你用MySQLdb执行查询后,cursor.fetchall()会返回一个元组的列表,比如[(id1, name1, email1), (id2, name2, email2)]。我们可以把这些数据转成带表头的格式化文本,提升可读性:
import MySQLdb # 数据库连接配置,替换成你的实际信息 db_config = { 'host': 'your_host', 'user': 'your_user', 'passwd': 'your_password', 'db': 'your_database' } def get_formatted_query_result(): # 连接数据库并执行查询 db = MySQLdb.connect(**db_config) cursor = db.cursor() # 替换成你的实际查询语句 query = "SELECT id, username, create_time FROM users LIMIT 10;" cursor.execute(query) # 获取查询的表头(字段名) headers = [desc[0] for desc in cursor.description] # 获取所有查询结果 results = cursor.fetchall() # 关闭数据库连接 cursor.close() db.close() # 开始格式化文本:先写表头,再添加分隔线,最后逐行处理结果 formatted_text = "\t".join(headers) + "\n" formatted_text += "-" * 60 + "\n" for row in results: # 把元组里的每个元素转成字符串,用制表符分隔,保证对齐 row_str = "\t".join(str(item) for item in row) formatted_text += row_str + "\n" return formatted_text
这个函数会输出类似这样的易读文本:
id username create_time ------------------------------------------------------------ 1 alice 2024-01-01 10:00:00 2 bob 2024-01-02 14:30:00
第二步:整合到邮件发送脚本
接下来把上面生成的格式化文本作为邮件正文,和你的smtplib发送逻辑整合:
import smtplib from email.mime.text import MIMEText from email.header import Header def send_email_with_query_result(): # 获取格式化后的查询结果 query_content = get_formatted_query_result() # 邮件配置,替换成你的实际信息 sender = 'your_email@example.com' receiver = 'target_email@example.com' smtp_server = 'smtp.example.com' smtp_port = 587 email_password = 'your_email_password' # 注意:部分邮箱需要用应用专用密码 # 构造邮件内容 msg = MIMEText(query_content, 'plain', 'utf-8') msg['From'] = Header('数据库查询通知', 'utf-8') msg['To'] = Header('收件人', 'utf-8') msg['Subject'] = Header('最新MySQL查询结果', 'utf-8') # 发送邮件 try: server = smtplib.SMTP(smtp_server, smtp_port) server.starttls() # 启用TLS加密,保障传输安全 server.login(sender, email_password) server.sendmail(sender, receiver, msg.as_string()) print("邮件发送成功!") except Exception as e: print(f"邮件发送失败:{str(e)}") finally: server.quit() # 调用函数触发发送 send_email_with_query_result()
额外小贴士
- 如果想要更美观的邮件排版,可以把文本转成HTML表格格式(用
<table>标签包裹),这样邮件客户端显示会更规整。 - 处理中文或特殊字符时,务必保证全程使用
utf-8编码,避免出现乱码。 - 可以用
with语句自动管理数据库连接,避免忘记关闭的问题:with MySQLdb.connect(**db_config) as db: with db.cursor() as cursor: cursor.execute(query) results = cursor.fetchall()
这样就能把MySQL的查询结果完美嵌入到邮件正文里啦!
内容的提问来源于stack exchange,提问作者safernandez666
相关产品推荐
相关产品推荐

