如何在Amazon Lambda中通过Mailgun API发送带本地临时文件附件的邮件?
解决Lambda调用Mailgun API添加附件的问题
要给Mailgun的邮件请求添加附件,你需要调整requests.post的调用方式——改用files参数传递附件,同时修正临时文件的创建逻辑(原TemporaryFile无法满足邮件附件的读取需求)。以下是完整的修改代码:
def handler(event, context): import requests, os, tempfile # 创建可重复读取的临时文件(替换原TemporaryFile) with tempfile.NamedTemporaryFile(mode='wb+', delete=False, suffix='.txt') as temp: temp.write(b'Hello world!') # 写入后将文件指针移到开头,确保后续能读取内容 temp.seek(0) temp_filename = temp.name # 读取网页内容 tempurl = event['url'] myReq = requests.get(tempurl) email = event.get('email', 'my.name@gmail.com') title = event.get('title', 'emailThis') # 邮件基础参数 params = { "from": "Excited User <excited-user@example.com>", "to": email, "subject": title, "html": myReq.text } # 构造附件参数:格式为 (文件名, 文件对象, MIME类型) with open(temp_filename, 'rb') as attach_file: files = { "attachment": ("hello.txt", attach_file, "text/plain") } # 发送请求:同时传递data和files,requests会自动处理multipart/form-data格式 response = requests.post( os.environ['myUrl'] + '/messages', auth=("api", os.environ['myAuth']), data=params, files=files ) # 可选:检查请求状态 print(f"Mailgun响应状态码: {response.status_code}") print(f"响应内容: {response.text}") return {"status": response.status_code, "message": response.text}
关键说明
- 临时文件选择:用
NamedTemporaryFile替代TemporaryFile,前者支持重新打开(需要读取文件内容作为附件),且可指定后缀名帮助Mailgun识别文件类型。delete=False确保文件在关闭后不会立即删除,Lambda执行完毕会自动清理临时目录。 - 文件指针重置:写入内容后必须调用
seek(0),否则读取文件时会从末尾开始,无法获取有效内容。 - 请求格式适配:当
requests.post同时传入data和files参数时,会自动使用multipart/form-data格式发送请求,这是Mailgun接受附件的要求。 - 附件参数规范:
files字典的键为attachment(Mailgun API指定的参数名),值是包含文件名、打开的文件对象、MIME类型的元组(比如application/pdf对应PDF文件,image/png对应PNG图片)。
内容的提问来源于stack exchange,提问作者shantanuo
相关产品推荐
相关产品推荐

