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
相关产品推荐
相关产品推荐

