如何使用Python Pandas读取MySQL数据后不生成本地CSV文件直接发送带CSV附件的邮件
解决方案:直接将MySQL查询结果作为CSV邮件附件发送(无需本地存储)
当然可以实现!你完全不需要把CSV保存到本地,只需要借助Python的io模块将CSV数据临时存在内存中,再结合email相关库把内存中的数据作为附件添加到邮件里发送就行。下面是修改后的完整可运行脚本,我会标注关键改动点:
修改后的完整脚本
import pandas as pd import pymysql from sqlalchemy import create_engine from urllib.parse import quote import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email import encoders import io # 数据库配置 username = "root" password = "xxxxxx" port = 3306 database = "DB" engine = create_engine(f'mysql+pymysql://{username}:%s@hostname:{port}/{database}' % quote(password)) # 从数据库读取数据 sql_query = pd.read_sql('SELECT * FROM table', engine) df = pd.DataFrame(sql_query) # 关键:将CSV数据写入内存对象,而非本地文件 csv_buffer = io.StringIO() df.to_csv(csv_buffer, index=False, encoding='utf-8') csv_buffer.seek(0) # 将指针移回开头,确保后续能读取完整内容 # 邮件配置(请根据你的邮箱服务商调整) sender_email = "your_sender@example.com" receiver_email = "your_receiver@example.com" smtp_server = "smtp.example.com" # 比如smtp.gmail.com、smtp.qq.com smtp_port = 587 # 一般TLS用587,SSL用465 smtp_password = "your_email_auth_code" # 注意:部分邮箱需要用应用专用密码/授权码 # 构建邮件主体 msg = MIMEMultipart() msg['From'] = sender_email msg['To'] = receiver_email msg['Subject'] = "MySQL数据导出CSV附件" # 添加邮件正文(可选) body = "您好,这是最新的MySQL数据导出CSV附件,请查收。" msg.attach(MIMEText(body, 'plain', 'utf-8')) # 将内存中的CSV转为邮件附件 part = MIMEBase('application', 'octet-stream') part.set_payload(csv_buffer.getvalue()) encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment', filename="data_export.csv") msg.attach(part) # 发送邮件并处理异常 try: with smtplib.SMTP(smtp_server, smtp_port) as server: server.starttls() # 启用TLS加密(如果用SSL端口465,替换成server.connect()) server.login(sender_email, smtp_password) server.send_message(msg) print("邮件发送成功!") except Exception as e: print(f"邮件发送失败:{str(e)}")
核心改动说明
- 用
io.StringIO()创建内存缓冲区替代本地文件路径,实现CSV数据的内存级存储,完全跳过本地写入步骤 - 通过
csv_buffer.seek(0)将缓冲区的读取指针移到起始位置,确保邮件附件能读取到完整的CSV内容 - 利用
email库的MIMEMultipart和MIMEBase构建带附件的邮件,设置正确的MIME类型和附件文件名 - 补充了SMTP邮件发送的完整流程,包含加密、登录和异常捕获,适配主流邮箱服务商的配置规则
注意:不同邮箱的SMTP配置规则不同,比如QQ/163邮箱需要开启SMTP服务并使用授权码登录,Gmail需要开启两步验证并生成应用专用密码,请根据你的实际情况调整。
内容的提问来源于stack exchange,提问作者wwe34124
相关产品推荐
相关产品推荐

