能否在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层来管理:
- 本地创建一个临时目录,比如
lambda_deps - 执行命令安装依赖到这个目录:
pip install -t lambda_deps/ google-api-python-client google-auth-httplib2 google-auth-oauthlib - 把你的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_ID、CLIENT_SECRET、REFRESH_TOKEN这些敏感信息存在Lambda的环境变量中,不要直接写在代码里,避免泄露。 - 超时时间:默认的Lambda超时是3秒,建议调整到10-30秒,确保API调用有足够时间完成。
- 内存配置:建议设置为至少128MB,内存太小可能会导致依赖加载缓慢或者调用超时。
- 权限:Lambda的执行角色不需要额外的AWS权限(除非你要从S3加载凭证文件),但你的Gmail账号需要允许该OAuth客户端发送邮件(授权时要勾选
gmail.send权限)。
内容的提问来源于stack exchange,提问作者Arun Kumar




