You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

能否在AWS Lambda Python运行时使用Gmail API发送邮件?求OAuth实现示例

当然可以在AWS Lambda的Python运行时环境中使用Gmail API发送邮件!我之前刚好做过类似的实现,下面给你详细的步骤和示例代码:

关键前提说明

首先,你手里的OAuth凭证需要是已获取到refresh_token的有效凭证——因为Lambda是无服务器环境,没法做交互式的授权流程(比如弹出浏览器让用户登录),所以得提前通过本地环境完成授权,拿到包含refresh_token的凭证文件(通常是credentials.json或者直接提取里面的client_id、client_secret、refresh_token)。如果是G Suite/Google Workspace用户,也可以用服务账号进行域级授权,不过个人用户用带refresh_token的OAuth凭证更直接。

依赖包处理

Lambda的默认Python环境没有Gmail API相关的依赖,所以需要把依赖包和代码一起打包,或者用Lambda层来管理:

  1. 本地创建一个临时目录,比如lambda_deps
  2. 执行命令安装依赖到这个目录:
    pip install -t lambda_deps/ google-api-python-client google-auth-httplib2 google-auth-oauthlib
    
  3. 把你的Python代码文件(比如send_gmail.py)放到lambda_deps目录下,然后把整个目录打包成ZIP文件,上传到Lambda即可。
示例代码

下面是完整的Lambda handler代码,包含凭证加载、API调用和邮件发送逻辑:

import base64
from email.mime.text import MIMEText
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError

# 建议把这些凭证信息存在Lambda的环境变量里,不要硬编码!
CLIENT_ID = "你的client_id"
CLIENT_SECRET = "你的client_secret"
REFRESH_TOKEN = "你的refresh_token"
SENDER_EMAIL = "你的gmail邮箱地址"

def create_message(sender, to, subject, message_text):
    """创建要发送的邮件消息"""
    message = MIMEText(message_text)
    message['to'] = to
    message['from'] = sender
    message['subject'] = subject
    return {'raw': base64.urlsafe_b64encode(message.as_bytes()).decode()}

def send_message(service, user_id, message):
    """调用Gmail API发送邮件"""
    try:
        message = service.users().messages().send(userId=user_id, body=message).execute()
        print(f"邮件已发送,Message ID: {message['id']}")
        return message
    except HttpError as error:
        print(f"发送邮件时出错: {error}")
        return None

def lambda_handler(event, context):
    # 加载OAuth凭证
    creds = Credentials(
        None,
        client_id=CLIENT_ID,
        client_secret=CLIENT_SECRET,
        refresh_token=REFRESH_TOKEN,
        token_uri="https://oauth2.googleapis.com/token"
    )
    
    # 构建Gmail服务
    service = build('gmail', 'v1', credentials=creds)
    
    # 准备邮件内容
    to_email = "收件人邮箱@example.com"
    subject = "来自Lambda的测试邮件"
    content = "这是通过AWS Lambda调用Gmail API发送的测试邮件!"
    
    # 创建并发送邮件
    message = create_message(SENDER_EMAIL, to_email, subject, content)
    send_message(service, 'me', message)
    
    return {
        'statusCode': 200,
        'body': '邮件发送请求已提交'
    }
Lambda配置注意事项
  • 环境变量:把CLIENT_IDCLIENT_SECRETREFRESH_TOKEN这些敏感信息存在Lambda的环境变量中,不要直接写在代码里,避免泄露。
  • 超时时间:默认的Lambda超时是3秒,建议调整到10-30秒,确保API调用有足够时间完成。
  • 内存配置:建议设置为至少128MB,内存太小可能会导致依赖加载缓慢或者调用超时。
  • 权限:Lambda的执行角色不需要额外的AWS权限(除非你要从S3加载凭证文件),但你的Gmail账号需要允许该OAuth客户端发送邮件(授权时要勾选gmail.send权限)。

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

火山引擎 最新活动