如何向Amazon-SES原始邮件添加包含多附件的目录tmpDir?
实现将目录添加至Amazon SES原始邮件的两种方案
Amazon SES的send_raw_email接口不支持直接添加文件夹作为附件,需通过以下两种方式实现需求:
方案1:将目录打包为ZIP压缩包作为单个附件发送
适合需要保留目录结构的场景,收件人解压后可还原完整文件夹。
实现步骤
- 把目标目录
tmpDir打包成ZIP文件 - 构造包含该ZIP附件的MIME邮件
- 调用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
相关产品推荐
相关产品推荐

