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

AWS Lambda中如何将DataFrame转CSV通过SES发带附件邮件

问题根因

你的代码运行失败是两个核心错误导致的:

  • boto3的SES send_email接口不存在Attachment参数,这个基础接口仅支持发送纯文本/HTML格式正文,原生不支持直接传入附件
  • 你调用df.to_csv("Comission.csv")是将CSV内容写入本地磁盘,Lambda运行环境仅/tmp目录有写入权限,且传入文件路径时to_csv的返回值为None,根本拿不到有效附件内容
正确实现方案

SES发送带附件的邮件需要先构造符合MIME规范的多部分邮件结构,再调用send_raw_email接口发送。全程可以在内存中生成CSV内容,不需要操作本地磁盘,完全适配Lambda运行环境。

完整可运行代码

import boto3
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from io import StringIO

def sendMail1(value, df):
    SENDER = "myemail@gmail.com"
    RECIPIENT = "youremail@gmail.com"
    SUBJECT = "Comission"
    # 替换为你实际开通SES服务的AWS区域
    client = boto3.client("ses", region_name="us-east-1")

    # 初始化多部分邮件容器
    msg = MIMEMultipart()
    msg["Subject"] = SUBJECT
    msg["From"] = SENDER
    msg["To"] = RECIPIENT

    # 写入邮件正文
    body = f"Comission value is {value}."
    text_part = MIMEText(body, "html")
    msg.attach(text_part)

    # 内存中生成CSV内容,不写入本地磁盘
    csv_buffer = StringIO()
    df.to_csv(csv_buffer, index=False)
    csv_content = csv_buffer.getvalue()

    # 构造CSV附件
    attachment_part = MIMEApplication(csv_content)
    attachment_part.add_header(
        "Content-Disposition",
        "attachment",
        filename="Comission.csv"
    )
    msg.attach(attachment_part)

    # 发送原始格式邮件
    response = client.send_raw_email(
        Source=SENDER,
        Destinations=[RECIPIENT],
        RawMessage={
            "Data": msg.as_string()
        }
    )
    return response

注意事项

  • 代码中region_name需要替换为你实际开通SES服务的对应AWS区域
  • 确保发件邮箱已经在SES控制台完成身份验证,若你的SES账号还处于沙箱模式,收件邮箱也需要提前完成验证
  • SES单封邮件总大小(含正文、附件、编码开销)上限为10MB,注意控制CSV文件体积
  • 该实现全程在内存中处理CSV内容,不需要操作Lambda本地存储,无目录权限问题

内容的提问来源于stack exchange,提问作者Henrique Bonacelli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:45:40