如何使用Python从S3存储桶获取文件并通过邮件发送?
从S3读取CSV并直接发送的Python实现
依赖准备
先确保安装必要的库:
pip install boto3 requests
(发邮件用的smtplib是Python标准库,无需额外安装)
第一步:从S3读取CSV字节流(无需本地保存)
用boto3直接拉取文件内容,不用存到本地磁盘:
import boto3 from io import BytesIO # 初始化S3客户端(已配置AWS密钥的话,不用显式传参数) s3 = boto3.client('s3') def get_s3_csv(bucket_name, file_key): # 获取S3对象的字节流 response = s3.get_object(Bucket=bucket_name, Key=file_key) csv_bytes = response['Body'].read() # 包装成BytesIO对象,方便后续作为"文件"处理 return BytesIO(csv_bytes), file_key.split('/')[-1] # 返回文件对象和文件名
场景1:作为邮件附件发送
直接用字节流构建MIME附件,跳过本地文件环节:
from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email import encoders import smtplib def send_csv_via_email(csv_file, filename, sender_email, receiver_email, smtp_server, smtp_port, smtp_password): # 构建邮件主体 msg = MIMEMultipart() msg['From'] = sender_email msg['To'] = receiver_email msg['Subject'] = "S3 CSV 文件附件" # 添加邮件正文 body = "这是从S3存储桶获取的CSV文件" msg.attach(MIMEText(body, 'plain')) # 处理CSV附件 part = MIMEBase('application', 'octet-stream') part.set_payload(csv_file.getvalue()) encoders.encode_base64(part) part.add_header('Content-Disposition', f'attachment; filename= {filename}') msg.attach(part) # 发送邮件 with smtplib.SMTP(smtp_server, smtp_port) as server: server.starttls() server.login(sender_email, smtp_password) server.send_message(msg)
调用示例:
csv_file, filename = get_s3_csv('你的存储桶名称', '文件在S3中的路径/xxx.csv') send_csv_via_email( csv_file, filename, '你的邮箱@example.com', '收件人邮箱@example.com', 'smtp.example.com', 587, '你的邮箱SMTP密码' )
场景2:作为文件发送给API接口
用requests把字节流模拟成文件上传:
import requests def send_csv_to_api(csv_file, filename, api_url): # 构造files参数,BytesIO对象可以直接作为文件传入 files = {'file': (filename, csv_file, 'text/csv')} response = requests.post(api_url, files=files) # 检查请求是否成功 response.raise_for_status() return response.json()
调用示例:
csv_file, filename = get_s3_csv('你的存储桶名称', '文件在S3中的路径/xxx.csv') api_response = send_csv_to_api(csv_file, filename, 'https://你的API地址.com/upload') print(api_response)
常见问题排查
- 权限错误:确保你的AWS凭证有
s3:GetObject权限,能访问目标桶和文件。 - MIME类型问题:发送时指定
text/csv作为文件类型,避免接收方识别异常。 - 字节流重复读取:如果需要多次读取BytesIO对象,要先调用
csv_file.seek(0)重置指针。
内容的提问来源于stack exchange,提问作者Tyche
相关产品推荐
相关产品推荐

