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

如何向Amazon-SES原始邮件添加包含多附件的目录tmpDir?

实现将目录添加至Amazon SES原始邮件的两种方案

Amazon SES的send_raw_email接口不支持直接添加文件夹作为附件,需通过以下两种方式实现需求:


方案1:将目录打包为ZIP压缩包作为单个附件发送

适合需要保留目录结构的场景,收件人解压后可还原完整文件夹。

实现步骤

  1. 把目标目录tmpDir打包成ZIP文件
  2. 构造包含该ZIP附件的MIME邮件
  3. 调用SES接口发送邮件

Python代码示例

import os
import zipfile
import boto3
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

# 初始化SES客户端,替换为你的区域
ses_client = boto3.client('ses', region_name='us-east-1')

# 定义目标目录和临时ZIP路径
tmp_dir = '/path/to/your/tmpDir'
zip_path = '/tmp/attachments.zip'

# 打包目录(保留内部结构)
with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
    for root, _, files in os.walk(tmp_dir):
        for file in files:
            file_path = os.path.join(root, file)
            # 计算ZIP内的相对路径,保留目录层级
            arcname = os.path.relpath(file_path, tmp_dir)
            zipf.write(file_path, arcname)

# 构造MIME邮件
msg = MIMEMultipart()
msg['From'] = 'sender@example.com'
msg['To'] = 'recipient@example.com'
msg['Subject'] = '包含目录压缩包的邮件'

# 添加邮件正文
body = MIMEText('附件为目标目录的压缩包,解压后可查看完整内容', 'plain')
msg.attach(body)

# 添加ZIP附件
with open(zip_path, 'rb') as attachment:
    part = MIMEBase('application', 'zip')
    part.set_payload(attachment.read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', f'attachment; filename="{os.path.basename(zip_path)}"')
msg.attach(part)

# 发送邮件
response = ses_client.send_raw_email(
    Source=msg['From'],
    Destinations=[msg['To']],
    RawMessage={'Data': msg.as_string()}
)

# 清理临时ZIP文件(可选)
os.remove(zip_path)

方案2:遍历目录内所有文件,逐个添加为独立附件

适合不需要保留目录结构,仅需发送目录内所有文件的场景。

Python代码示例

import os
import boto3
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

# 初始化SES客户端,替换为你的区域
ses_client = boto3.client('ses', region_name='us-east-1')

# 目标目录
tmp_dir = '/path/to/your/tmpDir'

# 构造MIME邮件
msg = MIMEMultipart()
msg['From'] = 'sender@example.com'
msg['To'] = 'recipient@example.com'
msg['Subject'] = '包含目录内所有文件的邮件'

# 添加邮件正文
body = MIMEText('附件为目标目录内的所有文件', 'plain')
msg.attach(body)

# 遍历目录,逐个添加文件为附件
for root, _, files in os.walk(tmp_dir):
    for file in files:
        file_path = os.path.join(root, file)
        with open(file_path, 'rb') as attachment:
            part = MIMEBase('application', 'octet-stream')
            part.set_payload(attachment.read())
        encoders.encode_base64(part)
        part.add_header('Content-Disposition', f'attachment; filename="{file}"')
        msg.attach(part)

# 发送邮件
response = ses_client.send_raw_email(
    Source=msg['From'],
    Destinations=[msg['To']],
    RawMessage={'Data': msg.as_string()}
)

注意事项

  • 确保SES客户端拥有ses:SendRawEmail权限,且发件邮箱已在SES中完成验证
  • 注意SES单封邮件的大小限制(最大10MB)
  • 若目录内文件数量多、体积小,优先选择方案1的压缩方式,可减少附件数量并节省带宽

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:31:04