S3触发SNS邮件通知如何附带文件内容或附件?
关于SNS邮件附加S3文件内容/附件的实现方案
嘿,这个需求光靠SNS肯定搞不定,必须得搭配Lambda才行!我给你理清楚原因和具体做法:
为什么SNS单独做不到?
SNS的邮件通知功能比较基础,它只能发送预设的文本模板或者从S3事件里拿到的元数据(比如文件名、存储桶地址这些),根本没办法主动去读取S3里的文件内容,更没法生成带附件的邮件结构——它本身没有处理文件内容和构造复杂邮件的能力。
必须用Lambda的实现步骤
你需要把S3、Lambda、SNS串起来,流程大概是这样:
- 第一步:配置S3事件触发Lambda
给你的SDD-XXX-YYY存储桶设置事件通知,当有新对象创建时(比如Put操作),触发指定的Lambda函数。 - 第二步:Lambda函数处理核心逻辑
用Python的话可以用boto3 SDK,核心做这几件事:- 从触发的S3事件中提取文件的
bucket名称和object key(也就是文件名); - 调用S3的
get_object接口下载文件内容; - 构造邮件内容:
- 如果是小文件(比如你的error.log),可以直接把文件内容嵌入邮件正文,用代码块(
)格式化让内容更易读; - 如果需要作为附件发送,得把文件内容转成base64编码,然后构造符合MIME规范的邮件内容(包含附件的头部信息);
- 如果是小文件(比如你的error.log),可以直接把文件内容嵌入邮件正文,用代码块(
- 调用SNS的
publish接口,把构造好的邮件内容发送到你的SNS主题。
- 从触发的S3事件中提取文件的
- 第三步:配置IAM权限
给Lambda角色加上两个关键权限:- 允许读取目标S3桶的对象(
s3:GetObject权限); - 允许调用SNS的发布接口(
sns:Publish权限)。
- 允许读取目标S3桶的对象(
额外注意点
- 要留意文件大小限制:Lambda的临时存储和SNS邮件都有大小上限(SNS邮件一般是10MB左右),如果是超大文件,建议改成在邮件里发送S3文件的预签名URL,让收件人自己去下载,这样更稳妥。
- 如果是文本文件,直接嵌入正文会比附件更方便收件人快速查看,比如error.log这种日志文件,直接在邮件里展示内容效率更高。
内容的提问来源于stack exchange,提问作者Karthik
相关产品推荐
相关产品推荐

