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

AWS Lambda能否读取带附件的AWS Workmail邮件及附件内容?

AWS场景下读取邮件附件→提取Excel数据→查询DynamoDB实现方案

这套方案全走AWS原生服务,不用额外搭服务器,成本极低,生产环境验证稳定可用:

  • 前置配置:用SES接收入站邮件
    先完成收信域名的SES身份验证,创建入站规则集,规则动作绑定Lambda触发器,同时勾选「将原始邮件存入S3」选项。注意:SES触发Lambda的事件载荷上限是10MB,超过10MB的附件不会直接放在事件体里,必须从S3拉取原始eml文件解析,小附件可以直接从事件里读原始MIME内容,不用走S3。
  • 步骤1:Lambda内解析MIME邮件提取Excel附件
    不用自己手写MIME解析逻辑,各语言Runtime都有成熟的现成库:
    • Python:直接用标准库自带的email模块,不用额外装依赖
    • Node.js:打包mailparser依赖到Lambda层即可
      以Python为例的核心解析代码:
    import email
    from email.policy import default
    
    def extract_excel_attachments(raw_mime_bytes):
        mail = email.message_from_bytes(raw_mime_bytes, policy=default)
        excel_files = []
        for part in mail.walk():
            # 跳过邮件正文、MIME容器节点
            if part.get_filename() and part.get_filename().lower().endswith(('.xlsx', '.xls')):
                file_content = part.get_payload(decode=True)
                excel_files.append((part.get_filename(), file_content))
        return excel_files
    
    如果是大附件存在S3,就先调用S3的get_object接口拿到eml文件的二进制内容,再走上面的解析逻辑就行,代码完全复用。
  • 步骤2:内存中解析Excel提取业务数据
    不要把附件写到Lambda临时目录再读,直接用内存流加载,省IO时间:
    Python环境把openpyxl(处理xlsx格式)、xlrd==1.2.0(处理旧版xls格式)打包成Lambda层,核心代码:
    from io import BytesIO
    import openpyxl
    
    def get_query_keys_from_excel(excel_bytes):
        wb = openpyxl.load_workbook(BytesIO(excel_bytes), data_only=True)
        # 按自己的业务逻辑读取对应sheet、单元格内容,整理成DynamoDB查询用的主键列表
        target_sheet = wb["你的业务Sheet名"]
        query_keys = []
        for row in target_sheet.iter_rows(min_row=2, values_only=True):
            if row[0]: # 假设第一列是DynamoDB主键
                query_keys.append(row[0])
        return query_keys
    
  • 步骤3:批量查询DynamoDB
    Lambda Runtime自带对应语言的AWS SDK,不用额外打包,直接调用就行。别写循环单条查询,用batch_get_item接口省读写吞吐:
    import boto3
    dynamo_table = boto3.resource('dynamodb').Table("你的DynamoDB业务表名")
    
    def batch_query_items(keys):
        # 注意batch_get单次最多支持100条查询,超过的话做分片循环调用即可
        response = dynamo_table.batch_get_item(
            RequestItems={
                dynamo_table.name: {"Keys": [{"主键字段名": k} for k in keys]}
            }
        )
        return response["Responses"][dynamo_table.name]
    

几个生产环境踩过的坑提前避:

  1. Lambda执行角色必须配齐对应权限:SES触发权限、S3对象读权限(如果开了S3存原始邮件)、DynamoDB表的查询权限,别上线了报403权限错误才临时补
  2. 解析大Excel比较吃内存,Lambda初始配置建议给512MB内存、30秒超时,跑稳定了再根据实际监控降配置省成本
  3. 如果收到的Excel是加密的、或者附件是zip压缩包,要额外加解密、解压逻辑,按需补就行
  4. 不用买第三方邮件解析服务,这套全原生逻辑足够覆盖99%的常规业务场景,没有额外成本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:54:15