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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:25:17