You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 14:42:48